I'm developing an Apple Watch application that uses the openParentApplication:reply:
method to communicate with its parent app.
The parent app communicates with a web service and sends back the data it gets to the watch extension by means of calling the reply
method with a NSDictionary
containing the data.
The app works perfectly when the parent app is open in the foreground or background. But if I open the parent app and then terminate it using the task switcher, the first time the watch extension makes a call to openParentApplication:replyInfo:
, it gets the following error and the parameter replyInfo
comes in as nil.
UIApplicationDelegate in the iPhone App never called reply()
But every single openParentApplication:replyInfo:
call the extension makes after that gets a proper response.
I checked and found out that the first time the watch extension makes the call, the handleWatchKitExtensionRequest:reply:
is never get called on the parent app.
What could be the possible reason for this?
I'm performing all operations in the handleWatchKitExtensionRequest:reply:
in a background task, as suggested in the docs. Here's some of my code:
Code from my extension:
NSDictionary *params = @{@"requestCode": @(RequestGetLoggedIn)};
[WKInterfaceController openParentApplication:params reply:^(NSDictionary *replyInfo, NSError *error) {
// Do something with the result
}];
Code from the parent app:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply
{
self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
}];
NSNumber* requestCode = userInfo[@"requestCode"];
// Perform some request and then call reply()
// End the background task
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
});
}
Edit 1: The problem occurs both on the Simulator and on a real Apple Watch.