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 之间的通信时,您必须做两件事:

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

可能有更多方法可以确保 运行 和可以通信。

也尝试从 iOS 应用向您的 WatchApp 扩展程序发送消息,这对我有用。

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