handleWatchKitExtensionRequest+ асинхронный вызов

Я пытаюсь использовать 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

Любые комментарии и помощь очень ценятся.


person amistres    schedule 15.06.2015    source источник
comment
Проверьте мой ответ на тот же вопрос здесь: 30653754" title="обработчик завершения mkmapsnapshotter никогда не вызывался в родительском приложении при вызове из w">stackoverflow.com/questions/30644997/   -  person rmp    schedule 15.06.2015
comment
Спасибо за ваш комментарий. Вы знаете какую-нибудь альтернативу?   -  person amistres    schedule 18.06.2015
comment
Если вам просто нужно изображение карты, вы можете использовать WKInterfaceMap, он фактически возвращает изображение.   -  person rmp    schedule 18.06.2015
comment
Мне нужно изображение, но мне также нужна анимированная булавка, которая невозможна на WKInterfaceMap. Перепробовав множество подходов, я остановился на простом подходе. Использование статического API MapBox. Вы отправляете широту и долготу и получаете изображение карты асинхронно, а затем изображение карты можно использовать в качестве фона для группы, на которой вы можете центрировать анимацию.   -  person amistres    schedule 19.06.2015