WatchOS 2.0:WCSessionDelegate 没有被调用(在模拟器中)

Posted

技术标签:

【中文标题】WatchOS 2.0:WCSessionDelegate 没有被调用(在模拟器中)【英文标题】:WatchOS 2.0: WCSessionDelegate not get called (in Simulator) 【发布时间】:2015-08-22 20:58:13 【问题描述】:

我在 7.0 beta 5 上运行 WatchOS 2.0。 我正在运行带有 iWatch 应用程序的 ios

我如图所示设置了目标。

我的 iOS 的 ViewController 和 WatchKitExtension 的接口控制器都激活了 WCSession 并设置为委托。

if ([WCSession isSupported]) 
    WCSession *session = [WCSession defaultSession];
    session.delegate = self;
    [session activateSession];
    NSLog(@"iOS App WCSession is supported");

然后我尝试将 userInfo 从 Watch 发送到 iOS:

NSDictionary *userInfo = [[NSDictionary alloc]initWithObjectsAndKeys:@"testingURL", @"outputURL", nil];
        [[WCSession defaultSession] transferUserInfo:userInfo];

但我的 ViewController 的委托方法永远不会被调用:

- (void)session:(WCSession *)session didReceiveUserInfo:(NSDictionary<NSString *,id> *)userInfo

dispatch_async(dispatch_get_main_queue(), ^
    NSLog(@"Received userInfo Transferr");
    NSLog(@"%@", userInfo);
    [self.label setText:@"Received"];
);

我在模拟器中同时运行 Watch App 和 iOS,方法是在此方案中按 Run here:

谁能告诉我我做错了什么?

【问题讨论】:

我看不出有什么明显的错误。我建议向 Apple 提交错误(包括您的测试项目)并在此处报告雷达编号,以便任何细读的 Apple 工程师可以快速追踪它! 【参考方案1】:

一般来说,在 UIViewcontroller 中接收 WCSession 数据并不是一个好主意,因为您永远无法确定它是否存在。

Apple 表示您应该尽快开始接收。您的 UIApplicationDelegate 是从 WCSession 接收数据的好地方,也是尽早设置数据的好地方。

编辑

您也没有在手表端保存对您激活会话的引用。这意味着 Apple 可以删除所有会话资源。

因此,您接下来调用 defaultSession 可以获得一个新的未激活会话。

编辑 2

根据我的经验,在测试 WatchApp Extension 和 iOS App 之间的通信时,您必须做两件事:

    从 XCode 7 启动 WatchApp(有时我必须这样做两次) 进入 iOS 模拟器并手动启动您的 iOS 应用

可能有更多方法可以确保两者都运行并可以通信。

还可以尝试从 iOS 应用向您的 WatchApp 扩展发送消息,这对我有用。

【讨论】:

感谢 Gerd 的建议。我将 WCSessionDelegate 移至 AppDelegate,但 AppDelegate 中的 didReceiveUserInfo 仍未被调用。还有其他想法吗? 在手表方面,您在发送之前再次获得(另一个?)defaultSession。您不使用记住的激活会话实例。这可能是也可能不是问题。当你再次调用 defaultSession 时,Apple 可能会做也可能不会做。 当您不持有对会话的引用时,运行时系统可能会删除所有资源。所以你的会话没有被激活,它是一个新的。 单例意味着会话对象不存在两次。但是单例并不能保证该对象完全存在。如果您没有参考,Apple 可以随意丢弃所有内容。 我不明白为什么,但是在我将我的第一个 userInfo 从 iOS App 发送到 WatchKit 后,一切突然开始工作,而不是另一轮。我想,也许,至少在模拟器中,第一个 userInfo 必须从 iOS App 发送到 WatchKit,然后 WatchKit 可以在以后的任何时间开始将 userInfo 发送到 iOS App。感谢 Gred 帮助我并提示我尝试从 App 发送到 Watch,这开始让事情变得正常。【参考方案2】:

对我来说,当我停止在手表或 iOS 应用上接收发送事件时,我只需关闭两个模拟器并让 XCode 再次启动它们。他们似乎只是进入了一种状态。我从来没有在实际的手表或 iOS 设备上发生过这种情况。

【讨论】:

以上是关于WatchOS 2.0:WCSessionDelegate 没有被调用(在模拟器中)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WatchKit 扩展目标(XCode7 beta 6)中重置 watchOS 部署目标

我们可以使用 Apple Watch 2.0 模拟器推数字表冠吗?

characterAtIndex:

WatchOS开发教程之五: 通知功能开发

WatchOS开发教程之五: 通知功能开发

WatchOS开发教程之六: 表盘功能开发