我的WatchKit应用程序中openParentApplication的行为不一致

时间:2015-07-03 15:23:14

标签: ios watchkit apple-watch

我正在开发一个Apple Watch应用程序,它使用openParentApplication:reply:方法与其父应用程序进行通信。

父应用与网络服务进行通信,并通过使用包含数据的reply调用NSDictionary方法将其获取的数据发回给手表扩展程序。

当应用程序在前台或后台打开时,该应用程序可以正常运行。但是,如果我打开父应用程序然后使用任务切换器终止它,则第一次监视扩展程序调用{​​{1}}时,会收到以下错误,参数openParentApplication:replyInfo:将以nil结尾。

replyInfo

但是每个UIApplicationDelegate in the iPhone App never called reply()调用扩展程序后会得到一个正确的响应。

我检查过并发现手表扩展第一次拨打电话时,永远不会在父应用上调用openParentApplication:replyInfo:

可能的原因是什么?

我按照文档中的建议,在后台任务中执行handleWatchKitExtensionRequest:reply:中的所有操作。这是我的一些代码: 我的扩展程序中的代码:

handleWatchKitExtensionRequest:reply:

来自父应用的代码:

NSDictionary *params = @{@"requestCode": @(RequestGetLoggedIn)};

[WKInterfaceController openParentApplication:params reply:^(NSDictionary *replyInfo, NSError *error) {
    // Do something with the result
}];

编辑1:模拟器和真正的Apple Watch上都会出现问题。

2 个答案:

答案 0 :(得分:5)

看起来iOS 8.4中存在一个错误。

我已将NSLog添加到application:didFinishLaunchingWithOptions:handleWatchKitExtensionRequest:reply:的开头,执行了导致问题的操作,然后检查了设备日志和得到了这个:

--- Notice>: (Warn ) WatchKit: <SPCompanionAppServer.m __91-[SPCompanionAppServer launchCompanionAppForGizmoAppWithIdentifier:withUserInfoData:reply:]_block_invoke_2:1450> Got BSActionErrorCodeResponseNotPossible for com.xyz.xyz.watchkitapp. This will translate to WatchKitApplicationDelegateWatchKitRequestReplyNotCalledError

... Irrelevant stuff

--- WatchKit Extension[1686] <Warning>: __59-[InformationController getNotificationListIncremental:]_block_invoke (null)
**--- <Warning>: MY LOG: Application did launch with parameters (null)**

此日志显示在操作系统提供有关未从父应用程序获取响应的错误之后调用application:didFinishLaunchingWithOptions:。如果应用程序没有首先启动,该应用程序将如何回复?

我发现此问题时,再次调用openParentApplication:reply:方法暂时解决了问题。

我实现重试一次行为的方式是创建一个包装调用并使用该方法代替原始方法的方法。我将此作为类方法添加到实用程序类中,但它也可以是全局函数。

+ (void)openParentApplication:(NSDictionary*)params reply:(void(^)(NSDictionary *replyInfo, NSError *error))reply
{
    [WKInterfaceController openParentApplication:params reply:^(NSDictionary *replyInfo, NSError *error) {
        if (error.domain == WatchKitErrorDomain && error.code == WatchKitApplicationDelegateWatchKitRequestReplyNotCalledError)
        {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [WKInterfaceController openParentApplication:params reply:^(NSDictionary *replyInfo, NSError *error) {
                    reply(replyInfo, error);
                }];
            });
        }
        else
            reply(replyInfo, error);
    }];
}

答案 1 :(得分:0)

我遇到了同样的问题。请参阅我为Apple提供的错误报告所做的以下简单项目:https://www.dropbox.com/s/ayltpprjck37ins/HandleWatchkitExtensionError%202.zip?dl=0

@Cihan Tek - 您如何调用openParentApplication:再次回复?你在回复块中调用它吗?我这样做时仍然收到错误。