WatchOS 2.0:未调用 WCSessionDelegate(在模拟器中)
WatchOS 2.0: WCSessionDelegate not get called (in Simulator)
我是 运行 WatchOS 2.0,版本 7.0 beta 5。
我是 运行 一个 iOS 的 iWatch App。
我如图所示设置目标。
我让 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"];
});
}
我是 运行 手表应用程序和 iOS 从模拟器一起按 运行 从这个方案:
谁能告诉我我做错了什么?
通常,在 UIViewcontroller 中接收 WCSession 数据不是一个好主意,因为您永远无法确定它是否存在。
Apple 表示您应该尽快开始接收。您的 UIApplicationDelegate 是从 WCSession 接收数据的好地方,也是尽早设置它的好地方。
编辑
您也没有在手表端保留对激活会话的引用。这意味着 Apple 可以删除所有会话资源。
所以你下次调用 defaultSession 会得到一个新的未激活的会话。
编辑 2
根据我的经验,在测试 WatchApp Extension 和 iOS App 之间的通信时,您必须做两件事:
- 从 XCode 7 开始 WatchApp(有时我必须这样做两次)
- 进入 iOS 模拟器并手动启动您的 iOS 应用程序
可能有更多方法可以确保 运行 和可以通信。
也尝试从 iOS 应用向您的 WatchApp 扩展程序发送消息,这对我有用。
对我来说,当我停止在手表或 iOS 应用程序上接收发送事件时,我只是关闭两个模拟器并让 XCode 重新启动它们。他们似乎只是进入了一种状态。我从来没有在实际手表或 iOS 设备上发生过这种情况。
我是 运行 WatchOS 2.0,版本 7.0 beta 5。 我是 运行 一个 iOS 的 iWatch App。
我如图所示设置目标。
我让 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"];
});
}
我是 运行 手表应用程序和 iOS 从模拟器一起按 运行 从这个方案:
谁能告诉我我做错了什么?
通常,在 UIViewcontroller 中接收 WCSession 数据不是一个好主意,因为您永远无法确定它是否存在。
Apple 表示您应该尽快开始接收。您的 UIApplicationDelegate 是从 WCSession 接收数据的好地方,也是尽早设置它的好地方。
编辑
您也没有在手表端保留对激活会话的引用。这意味着 Apple 可以删除所有会话资源。
所以你下次调用 defaultSession 会得到一个新的未激活的会话。
编辑 2
根据我的经验,在测试 WatchApp Extension 和 iOS App 之间的通信时,您必须做两件事:
- 从 XCode 7 开始 WatchApp(有时我必须这样做两次)
- 进入 iOS 模拟器并手动启动您的 iOS 应用程序
可能有更多方法可以确保 运行 和可以通信。
也尝试从 iOS 应用向您的 WatchApp 扩展程序发送消息,这对我有用。
对我来说,当我停止在手表或 iOS 应用程序上接收发送事件时,我只是关闭两个模拟器并让 XCode 重新启动它们。他们似乎只是进入了一种状态。我从来没有在实际手表或 iOS 设备上发生过这种情况。