我想从手表应用程序向 iOS 应用程序发送即时消息。在 XCode7 beta 4 版本中实现了以下代码,并将应用程序保持在两个模拟器的前台。这是我实现的代码
在watchkit界面控制器中
-(void)将激活 { [超级会激活]; if ([WCSession isSupported]) { WCSession *会话 = [WCSession 默认会话]; session.delegate = self; [会话激活会话]; } } -(IBAction)按钮点击 { NSDictionary *applicationDict = [[NSDictionary alloc] initWithObjects:@[@"Hi"] forKeys:@[@"key"]]; if([[WCSession defaultSession] isReachable]) { [[WCSession defaultSession] sendMessage:applicationDict 回复处理程序:^(NSDictionary *回复){ NSLog(@"%@",回复); } 错误处理程序:^(NSError *错误){ NSLog(@"%@",错误); }]; } }
在 iOS 应用程序类中
-(void)viewDidLoad { [超级viewDidLoad]; if ([WCSession isSupported]){ WCSession *会话 = [WCSession 默认会话]; 会话.委托=自我; [会话激活会话]; } } -(void)会话:(非空 WCSession *)会话 didReceiveMessage:(nonnull NSDictionary *)消息回复处理程序:(nonnull void (^)(NSDictionary * __nonnull))replyHandler { dispatch_async(dispatch_get_main_queue(), ^{ self.testLbl.text = [消息objectForKey:@"key"]; [self.view setNeedsDisplay]; }); }
您必须使用
sendMessage
API 吗?我发现它们也不可靠且不可预测。我最终使用了 applicationContext
API。手表不必可达,但如果可达,它会立即到达。如果不可到达,它会在应用程序启动时交付。每次更新应用程序上下文时,它都会覆盖以前的版本,这可能不是您想要的。
我发现在我当前正在开发的 iPhone 应用程序中,我需要在 AppDelegate 和当前视图控制器中都有 WCSession 激活代码。 ...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([WCSession isSupported]) {
WCSession *session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
}
...
像你一样,这与我对“应该”要求的理解并不相符,但这就是让
session.reachable
(Swift)等于 true 的原因
首先您应该检查手表连接框架是否正确链接,并检查您的代码。之后尝试从两个模拟器中“重置内容和设置”,这对我有用。如果它还不起作用,请尝试从模拟器中卸载并重新安装这两个应用程序。如果仍然不起作用,请尝试从手机上安装的手表应用程序的设置中删除手表应用程序扩展。希望这有帮助!通过私有API
-[WCSession errorIfNotReachable]