Я пытаюсь использовать MKMapSnapshotter, чтобы сделать снимок с карты в приложении для iPhone, а затем отправить изображение обратно на часы. Когда содержащее приложение для iPhone не работает в фоновом режиме, я не могу заставить его работать.
Вот как я пытаюсь сделать:
на AppDelegate:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void ( ^)( NSDictionary * ))reply {
__block UIBackgroundTaskIdentifier watchKitHandler;
watchKitHandler = [[UIApplication sharedApplication]
beginBackgroundTaskWithName:@"backgroundTask" expirationHandler:^{
watchKitHandler = UIBackgroundTaskInvalid;
}];
NSMutableDictionary *response = [NSMutableDictionary dictionary];
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
//========================Building the snapshot===========
CLLocationDegrees latitude = 37.331793f;
CLLocationDegrees longitude = -122.029584f;
MKMapView* mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, (156*2), (108*2))];
mapView.mapType = MKMapTypeHybrid;
CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(latitude, longitude);
MKCoordinateSpan span = {.latitudeDelta = 0.01, .longitudeDelta = 0.01};
MKCoordinateRegion region = {coord, span};
[mapView setRegion:region];
MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
options.region = mapView.region;
options.size = mapView.frame.size;
options.scale = [[UIScreen mainScreen] scale];
MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
//========================================================
[snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
NSData *imageData = UIImagePNGRepresentation(snapshot.image);
[response setObject:imageData forKey:@"snapshotimage"];
reply(response);
}];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_after(dispatch_time( DISPATCH_TIME_NOW, (int64_t)NSEC_PER_SEC * 1), dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIApplication sharedApplication] endBackgroundTask:watchKitHandler];
});
}
Я пробую разные коды, предложенные людьми, но здесь я должен делать что-то не так. Обратите внимание, что «моментальный снимок startWithCompletionHandler» выполняется асинхронно.
Я пробовал следующие предложения, но я должен что-то упустить здесь. https://stackoverflow.com/a/30000323/4982919
Любые комментарии и помощь очень ценятся.
WKInterfaceMap
, он фактически возвращает изображение. - person rmp   schedule 18.06.2015