Skip To Content ArcGIS for Developers Sign In Dashboard

Update an offline map

Offline maps can be created either using ArcGIS Pro or the ArcGIS Runtime SDKs. Their ability to accept updates depends on how the original map is authored (for example, scheduled updates are enabled) and how the mobile map package is created (with ArcGIS Runtime or ArcGIS Pro). The following update options are available:

  • Take a map offline - ArcGIS Pro - the geodatabases in this offline map are read-only and cannot be updated. In this case you need to recreate the mobile map package and redeploy it to all devices.
  • Take a map offline - on-demand - the geodatabases in this offline map can be updated by synchronization with feature services.
  • Take a map offline - preplanned - the geodatabases in this offline map can be updated by synchronization with feature services or by applying scheduled update files.

Synchronize or apply scheduled updates

The offline map sync task is used to perform both synchronization and applying scheduled updates to offline maps.

  1. Create the OfflineMapSyncTask from a map created by the on-demand or preplanned workflows.

    OfflineMapSyncTask offlineMapSyncTask = await OfflineMapSyncTask.CreateAsync(MyMapView.Map);

  2. Retrieve the task's OfflineMapUpdateCapabilities to identify which update strategy the offline map supports (sync or scheduled updates).

    // Get the update capabilities for the task.
    OfflineMapUpdateCapabilities updateCapabilities = offlineMapSyncTask.UpdateCapabilities;
    if (updateCapabilities.SupportsScheduledUpdatesForFeatures)
    {
        Console.WriteLine("Scheduled updates are supported.");
    }
    else if (updateCapabilities.SupportsSyncWithFeatureServices)
    {
        Console.WriteLine("Synchronization with feature services is supported.");
    }

  3. Determine whether there are any updates available by calling the task's checkForUpdatesWithCompletion method.
    • If the map supportsScheduledUpdatesForFeatures then you can examine the downloadAvailability on the OfflineMapUpdatesInfo object. If there are downloads available then you can check to see how large the download is using the scheduledUpdatesDownloadSize. You can use this information to determine whether you want to download updates immediately - for example based on available disk space or network availability.
    • If the map supportsSyncWithFeatureServices you can examine the uploadAvailability to see if the offline map has any edits to upload. If so go to Step 4. It is not possible to determine whether there are online changes to download without performing a full feature synchronization.
    // Are there any updates available?
    OfflineMapUpdatesInfo updateInfo = await offlineMapSyncTask.CheckForUpdatesAsync();
    if(updateInfo == null)
    {
        Console.WriteLine("There are no updates available.");
        return;
    }
    
    // Are there any downloads available?
    switch (updateInfo.DownloadAvailability)
    {
        case OfflineUpdateAvailability.Available:
            Console.WriteLine("Online edits are available for download.");
            Console.WriteLine(string.Format("Download size is {0} bytes.", updateInfo.ScheduledUpdatesDownloadSize));
            break;
        case OfflineUpdateAvailability.None:
            Console.WriteLine("No online edits are available for download.");
            break;
        case OfflineUpdateAvailability.Indeterminate:
            Console.WriteLine("Unable to determine if edits are available for download.");
            break;
    }
    
    // Are there uploads available?
    switch (updateInfo.UploadAvailability)
    {
        case OfflineUpdateAvailability.Available:
            Console.WriteLine("Local edits are available to upload.");
            break;
        case OfflineUpdateAvailability.None:
            Console.WriteLine("No local edits are available to upload.");
            break;
        case OfflineUpdateAvailability.Indeterminate:
            Console.WriteLine("Unable to determine if edits are available to upload.");
            break;
    }
  4. Obtain the default offline map sync parameters using the method. Override any of these parameters, as required. For example, if resources are limited you may want to overwrite the sync direction to just Upload local edits to the online service.
  5. Create the offline map sync job, offlineMapSyncJob using the offline map sync parameters and run it.
  6. Upon completion check the OfflineMapSyncResult for any errors.
  7. If supportsScheduledUpdatesForFeatures then determine whether the mobile map file needs to be reopened by examining the mobileMapPackageReopenRequired property on the OfflineMapUpdatesInfo object. If so then close the offline map before reopening it.

    // Get the default parameters for the offline map sync task.
    OfflineMapSyncParameters syncParams = await offlineMapSyncTask.CreateDefaultOfflineMapSyncParametersAsync();
    // (Change individual parameter values as needed).
    
    // Create the offline map sync job with the parameters.
    OfflineMapSyncJob syncJob = offlineMapSyncTask.SyncOfflineMap(syncParams);
    
    // Handle the progress changed event to show the percent complete.
    syncJob.ProgressChanged += (s, e) => 
    {
        Console.WriteLine(string.Format("Offline sync job is {0}% complete.", syncJob.Progress));
    };
    
    // Handle the job changed event to react to job success or failure.
    syncJob.JobChanged += async(s, e) => 
    {
        if(syncJob.Status == Esri.ArcGISRuntime.Tasks.JobStatus.Succeeded)
        {
            OfflineMapSyncResult syncResult = await syncJob.GetResultAsync();
            if (syncResult.HasErrors)
            {
                // Report errors.
                return;
            }
    
            if (syncResult.IsMobileMapPackageReopenRequired)
            {
                // Close and reopen the mobile map package.
            }
        }
        else if(syncJob.Status == Esri.ArcGISRuntime.Tasks.JobStatus.Failed)
        {
            // Report errors.
        }
    };
    
    // Start the sync job.
    syncJob.Start();

Next

When you have finished working with the mobile map package ensure that you release its maps, layers, and geodatabases before closing or terminating the application. See Finish using an offline map for more details.