summaryrefslogtreecommitdiff
path: root/platform/ios/demo/Examples/Swift/OfflinePackExample.swift
diff options
context:
space:
mode:
Diffstat (limited to 'platform/ios/demo/Examples/Swift/OfflinePackExample.swift')
-rw-r--r--platform/ios/demo/Examples/Swift/OfflinePackExample.swift113
1 files changed, 113 insertions, 0 deletions
diff --git a/platform/ios/demo/Examples/Swift/OfflinePackExample.swift b/platform/ios/demo/Examples/Swift/OfflinePackExample.swift
new file mode 100644
index 0000000000..a1229aa366
--- /dev/null
+++ b/platform/ios/demo/Examples/Swift/OfflinePackExample.swift
@@ -0,0 +1,113 @@
+import Mapbox
+
+@objc(OfflinePackExample_Swift)
+
+class OfflinePackExample_Swift: UIViewController, MGLMapViewDelegate {
+ var mapView: MGLMapView!
+ var progressView: UIProgressView!
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ mapView = MGLMapView(frame: view.bounds, styleURL: MGLStyle.darkStyleURL(withVersion: 9))
+ mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
+ mapView.tintColor = .gray
+ mapView.delegate = self
+ view.addSubview(mapView)
+
+ mapView.setCenter(CLLocationCoordinate2D(latitude: 22.27933, longitude: 114.16281),
+ zoomLevel: 13, animated: false)
+
+ // Setup offline pack notification handlers.
+ NotificationCenter.default.addObserver(self, selector: #selector(offlinePackProgressDidChange), name: NSNotification.Name.MGLOfflinePackProgressChanged, object: nil)
+ NotificationCenter.default.addObserver(self, selector: #selector(offlinePackDidReceiveError), name: NSNotification.Name.MGLOfflinePackError, object: nil)
+ NotificationCenter.default.addObserver(self, selector: #selector(offlinePackDidReceiveMaximumAllowedMapboxTiles), name: NSNotification.Name.MGLOfflinePackMaximumMapboxTilesReached, object: nil)
+ }
+
+ func mapViewDidFinishLoadingMap(_ mapView: MGLMapView) {
+ // Start downloading tiles and resources for z13-16.
+ startOfflinePackDownload()
+ }
+
+ deinit {
+ // Remove offline pack observers.
+ NotificationCenter.default.removeObserver(self)
+ }
+
+ func startOfflinePackDownload() {
+ // Create a region that includes the current viewport and any tiles needed to view it when zoomed further in.
+ // Because tile count grows exponentially with the maximum zoom level, you should be conservative with your `toZoomLevel` setting.
+ let region = MGLTilePyramidOfflineRegion(styleURL: mapView.styleURL, bounds: mapView.visibleCoordinateBounds, fromZoomLevel: mapView.zoomLevel, toZoomLevel: 16)
+
+ // Store some data for identification purposes alongside the downloaded resources.
+ let userInfo = ["name": "My Offline Pack"]
+ let context = NSKeyedArchiver.archivedData(withRootObject: userInfo)
+
+ // Create and register an offline pack with the shared offline storage object.
+
+ MGLOfflineStorage.shared().addPack(for: region, withContext: context) { (pack, error) in
+ guard error == nil else {
+ // The pack couldn’t be created for some reason.
+ print("Error: \(error?.localizedDescription ?? "unknown error")")
+ return
+ }
+
+ // Start downloading.
+ pack!.resume()
+ }
+
+ }
+
+ // MARK: - MGLOfflinePack notification handlers
+
+ func offlinePackProgressDidChange(notification: NSNotification) {
+ // Get the offline pack this notification is regarding,
+ // and the associated user info for the pack; in this case, `name = My Offline Pack`
+ if let pack = notification.object as? MGLOfflinePack,
+ let userInfo = NSKeyedUnarchiver.unarchiveObject(with: pack.context) as? [String: String] {
+ let progress = pack.progress
+ // or notification.userInfo![MGLOfflinePackProgressUserInfoKey]!.MGLOfflinePackProgressValue
+ let completedResources = progress.countOfResourcesCompleted
+ let expectedResources = progress.countOfResourcesExpected
+
+ // Calculate current progress percentage.
+ let progressPercentage = Float(completedResources) / Float(expectedResources)
+
+ // Setup the progress bar.
+ if progressView == nil {
+ progressView = UIProgressView(progressViewStyle: .default)
+ let frame = view.bounds.size
+ progressView.frame = CGRect(x: frame.width / 4, y: frame.height * 0.75, width: frame.width / 2, height: 10)
+ view.addSubview(progressView)
+ }
+
+ progressView.progress = progressPercentage
+
+ // If this pack has finished, print its size and resource count.
+ if completedResources == expectedResources {
+ let byteCount = ByteCountFormatter.string(fromByteCount: Int64(pack.progress.countOfBytesCompleted), countStyle: ByteCountFormatter.CountStyle.memory)
+ print("Offline pack “\(userInfo["name"] ?? "unknown")” completed: \(byteCount), \(completedResources) resources")
+ } else {
+ // Otherwise, print download/verification progress.
+ print("Offline pack “\(userInfo["name"] ?? "unknown")” has \(completedResources) of \(expectedResources) resources — \(progressPercentage * 100)%.")
+ }
+ }
+ }
+
+ func offlinePackDidReceiveError(notification: NSNotification) {
+ if let pack = notification.object as? MGLOfflinePack,
+ let userInfo = NSKeyedUnarchiver.unarchiveObject(with: pack.context) as? [String: String],
+ let error = notification.userInfo?[MGLOfflinePackUserInfoKey.error] as? NSError {
+ print("Offline pack “\(userInfo["name"] ?? "unknown")” received error: \(error.localizedFailureReason ?? "unknown error")")
+ }
+ }
+
+ func offlinePackDidReceiveMaximumAllowedMapboxTiles(notification: NSNotification) {
+ if let pack = notification.object as? MGLOfflinePack,
+ let userInfo = NSKeyedUnarchiver.unarchiveObject(with: pack.context) as? [String: String],
+ let maximumCount = (notification.userInfo?[MGLOfflinePackUserInfoKey.maximumCount] as AnyObject).uint64Value {
+ print("Offline pack “\(userInfo["name"] ?? "unknown")” reached limit of \(maximumCount) tiles.")
+ }
+ }
+
+}