diff options
Diffstat (limited to 'platform/ios/demo/Examples/Swift/OfflinePackExample.swift')
-rw-r--r-- | platform/ios/demo/Examples/Swift/OfflinePackExample.swift | 113 |
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.") + } + } + +} |