从 Watch 刷新 Watch App

Refreshing Watch App From Watch

我今天开始摆弄 Watch OS 框架,想拼凑一个快速应用程序,但遇到了几个问题。

我制作了一个 iOS 应用程序,它只显示当前电池百分比以及电池状态。然后我想在手表上展示它。

  1. 手表应用程序唯一会更新的时间是我完全关闭 iOS 应用程序,然后打开它,同时手表应用程序处于活动状态。如果我在 iOS 应用程序打开后打开它,如何让我的手表应用程序更新?

  2. 这与第 2 点一致。但是,在 iOS 应用进入后台后,如何让手表应用从中获取信息?例如,假设 iOS 应用程序一直在后台,我想在不将 iOS 应用程序打开到前台的情况下获取电池百分比。

关于我如何设置它的一些旁注 -

在 iOS 应用程序中,在 viewDidLoad 方法中,我开始我的会话。

 if ([WCSession isSupported]) {
    wcSession = [WCSession defaultSession];
    wcSession.delegate = self;
    [wcSession activateSession];
}

然后调用我的方法来更新实际电池百分比和状态。在那个方法中,我有这个将信息发送到手表:

NSDictionary *message = @{
                          @"message" : [NSString stringWithFormat:@"%@", [numberFormatter stringFromNumber:levelObj]],
                          @"message_2" : [NSString stringWithFormat:@"%ld",(long)[UIDevice currentDevice].batteryState],

                          };


[wcSession sendMessage:message replyHandler:nil errorHandler:^(NSError * _Nonnull error) {
    NSLog(@"%@", error.localizedDescription);
}];

我也在 viewDidAppear 中调用了同样的方法,所以我不必完全重新启动应用程序,以允许刷新手表对应物。

在手表端,我有 viewWillActivate 方法,其激活与 iOS 端相同,以及处理手表应用程序从 iOS 端接收的内容的方法.但它只会在我完全重新启动 iOS 应用程序时更新。

    - (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message {

    NSLog(@"Message recieved!");
    [_batteryLevelLabelW setText:message[@"message"]];
}

里面还有处理电池状态消息的代码,有点长。

我希望我提供了大量的信息来帮助你。

根据documentation

Use the send​Message(_:​reply​Handler:​error​Handler:​) or send​Message​Data(_:​reply​Handler:​error​Handler:​) method to transfer data to a reachable counterpart. These methods are intended for immediate communication between your iOS app and WatchKit extension. The is​Reachable property must currently be true for these methods to succeed.

如果 watchapp 不是前台,则不会传递消息,因为 isReachable 为 false。

您应该使用的方法是 update​Application​Context(_:​) - 它会等到 watch 应用程序在前台打开,然后才会交付。