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 部署目标