【问题标题】:'isReachable' is false when sending message from watch app to iOS app从手表应用程序向 iOS 应用程序发送消息时,“isReachable”为假
【发布时间】:2015-10-13 12:52:07
【问题描述】:

我想从手表应用向 iOS 应用发送即时消息。在 XCode7 beta 4 版本中实现了以下代码,并在两个模拟器中将应用程序保持在前台。这是我实现的代码

在watchkit interfaceController中

-(无效)将激活 { [超级会激活]; if ([WCSession isSupported]) { WCSession *session = [WCSession defaultSession]; session.delegate = 自我; [会话激活会话]; } } -(IBAction)按钮单击 { NSDictionary *applicationDict = [[NSDictionary alloc] initWithObjects:@[@"Hi"] forKeys:@[@"key"]]; if([[WCSession defaultSession] isReachable]) { [[WCSession defaultSession] sendMessage:applicationDict replyHandler:^(NSDictionary *reply) { NSLog(@"%@",回复); } errorHandler:^(NSError *error) { NSLog(@"%@",error); }]; } }

在 iOS 应用类中

-(void)viewDidLoad { [超级视图DidLoad]; if ([WCSession isSupported]){ WCSession *session = [WCSession defaultSession]; session.delegate = 自我; [会话激活会话]; } } -(无效)会话:(非空 WCSession *)会话 didReceiveMessage:(nonnull NSDictionary *)message replyHandler:(nonnull void (^)(NSDictionary * __nonnull))replyHandler { dispatch_async(dispatch_get_main_queue(), ^{ self.testLbl.text = [message objectForKey:@"key"]; [self.view setNeedsDisplay]; }); }

【问题讨论】:

  • 在电话上,我认为您不想在 ViewController 的 viewDidLoad 中进行 WCSession 激活,您应该在您的应用委托 didFinishLaunching 中进行此操作
  • @CSmith 在苹果文档中,他们从未提到应该在应用程序委托中调用激活方法。我们需要在发送任何消息之前打电话。阅读文档并发表评论。 link
  • 观看 Watch Connectivity WWDC 2015 视频,他们明确告诉你不要做你正在做的事情
  • @CSmith 我有一个应用程序。它工作正常。参考link

标签: ios watchkit apple-watch


【解决方案1】:

我在我目前正在开发的一个 iPhone 应用程序中发现,我需要在 AppDelegate 和当前的 View Controller 中都有 WCSession 激活码。 ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if ([WCSession isSupported]) {
            WCSession *session = [WCSession defaultSession];
            session.delegate = self;
            [session activateSession];
    }
    ...

和你一样,这与我对应该要求的理解不符,但这正是 session.reachable (Swift) 等于真的原因

【讨论】:

  • 这对我有用。有趣的是,我可以在第一次激活后直接向手表发送消息,尽管isReachable 仍然是false。第二次激活后isReachable 变为true。显然,只有返回的标志是错误的。
【解决方案2】:

首先您应该检查 Watch Connectivity Framework 是否正确链接,同时检查您的代码。之后尝试使用两个模拟器的“重置内容和设置”,这对我有用。如果它还不起作用,请尝试从模拟器中卸载并重新安装这两个应用程序。如果它仍然不起作用,请尝试从安装在手机上的 Watch 应用程序的设置中删除手表应用程序扩展程序。希望这可以帮助!

【讨论】:

  • 如果问题很少发生,这可能是一种可行的方法。不幸的是,它确实经常发生在我身上,不仅在模拟器上,而且在设备上。所以,对我来说这根本不可行。
【解决方案3】:

您必须使用sendMessage API 吗?我发现它们也不可靠且不可预测。我最终使用了applicationContext API。手表不一定要可访问,但如果是,它会立即到达,如果不可访问,它会在应用程序启动时交付。每次更新应用程序上下文时,它都会覆盖以前的版本,这可能不是您想要的。

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多