This post is article 28 from the 30 Articles App series for SharePoint
Web components can also be deployed programmatically using a remote event receiver InstalledEventEndpoint or an UpgradedEventEndpoint. If you are adding components in other than the app web you should also implement an UninstallingEventEndpoint that uninstalls those same components.
Handling the app updated event :
Your sharepoint app should have valid UpgradedEventEndpoint refering to your remote service.
In web project , open AppEventReceiver.svc.cs file and add a conditional structure to the ProcessEvent to handle appUpdated event like following.
if (properties.EventType == SPRemoteEventType.AppUpgraded) { using (ClientContext cc = TokenHelper.CreateAppEventClientContext(properties, true)) { // CSOM code that accesses the app web } using (ClientContext cc = TokenHelper.CreateAppEventClientContext(properties, false)) { // CSOM code that accesses the host web } // Other update code as per your need }
Provide conditional structure to handle the app updated event on subsequent updates
Version ver2OOO = new Version("2.0.0.0"); if (properties.AppEventProperties.PreviousVersion < ver2OOO) { // Code to update from 1.0.0.0 to 2.0.0.0 is here. } Version ver3OOO = new Version("3.0.0.0"); if (properties.AppEventProperties.PreviousVersion < ver3OOO) { // Code to update from 2.0.0.0 to 3.0.0.0 (previous update code) is here. } // Code to update from 3.0.0.0 to 4.0.0.0 is here. catch (Exception e) { // Make sure you catch all exceptions while updating and rollback to undo if that is necessary. result.ErrorMessage = "error message : " + e.Message; result.Status = SPRemoteEventServiceStatus.CancelWithError; }
In some cases, you might need to migrate data or upgrade schema. If your old data is somewhere that can be accessed by a remote event handler, you can implement migration logic in an InstalledEventEndpoint web service of the new app. Alternatively, if the new app has access to the old data, you can put the migration logic in code that runs the first time that a user starts the new app. If the old data cannot be accessed by either the remote handlers or the new app, you can create an update of the old app that adds a data export capability and a UI for the capability. Users would first update the old app, and then use it to export the data to a location where the new app can access it. You include the capability and UI to import data in the new app.