sessionReachabilityDidChange未在watch上调用

时间:2016-03-02 22:33:13

标签: ios objective-c apple-watch watch-os-2 wcsession

我想让我的手表应用程序回复被杀死的手机上的父应用程序。当手表应用程序正在运行且手机应用程序被终止时,我无法从sessionReachabilityDidChangesessionWatchStateDidChange回复。基于苹果文档:

  

调用此方法让当前进程知道它   对话会议的可达性发生了变化。

所以,似乎我应该得到一个回调。我在手表上将WCSession委托设置为我的班级。手表上的会话接收应用程序上下文的回调。为什么我没有得到可达性回调?

以下代码..

+ (SomeClass *)sharedInstance {
    static dispatch_once_t pred;
    static SomeClass *shared = nil;
    dispatch_once(&pred, ^{
        shared = [[SomeClass alloc] init];
        [Model sharedInstance].delegate = shared;
    });
    return shared;
}

#pragma mark - setup

- (void)initializeSession {
    if ([WCSession isSupported]) {
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
        [self sync];
    }
}

-(BOOL) hasValidWCSession {
    return ([WCSession isSupported] && [WCSession defaultSession].isReachable);
}


#pragma mark - WCSessionDelegate

- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *, id> *)applicationContext {

    NSLog(@"application context received on watch: %@", applicationContext);
    [[Model sharedInstance] process:applicationContext];
}


- (void)sessionWatchStateDidChange:(WCSession *)session {
    NSLog(@"wcession state changed on watch");
}

- (void)sessionReachabilityDidChange:(WCSession *)session {
    NSLog(@"wcsession reachability changed on watch");
}

1 个答案:

答案 0 :(得分:5)

从Apple Watch应用程序的角度来看,不需要运行iPhone应用程序,以使reachable成为现实。如果iPhone本身已配对且可以访问,则使用手表应用程序中的WCSession发送消息将在后台启动iPhone应用程序。

因此,当iOS应用程序被杀时,我不希望在监视应用程序上调用sessionReachabilityDidChange:。这也意味着您的iPhone应用程序应该随时准备在后台启动,并立即激活WCSession,以处理来自监视应用程序的传入请求(类似于某些推送通知等可以启动iOS应用程序)

然而,从iPhone应用程序的角度来看,只有当配对且活跃的Apple Watch在范围内并且相关的Watch应用程序在前台运行时才会认为手表应用程序对应物是可以访问的。 (documentation)。

另请注意,当&#34; WCSession对象的配对,watchAppInstalled,complicationEnabled或watchDirectoryURL属性中的值发生变化时,会调用sessionWatchStateDidChange: