1

我已经阅读了下面的 q/a,这很棒。这正是我在一个测试项目中所做的,它工作得很好。

我现在已经创建了我的真实项目,但在 Watch 扩展中,session: didReceiveApplicationContext:不会触发。

这是我的发送代码:

-(void)sendPlistToWatch:(NSMutableDictionary *)dictionary {
    NSLog(@"%s", __FUNCTION__);
    if ([WCSession defaultSession]) {
        NSDictionary *applicationDict = @{@"Favorites.plist":dictionary};
        [[WCSession defaultSession] updateApplicationContext:applicationDict error:nil];

        NSLog(@"sent dictionary");
    } else {
        NSLog(@"not paired");
    }
}

这是手表上的接收代码:

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];

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

- (void)willActivate {
    [super willActivate];
}

- (void)didDeactivate {
    [super didDeactivate];
}



- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
    NSString *string = [applicationContext objectForKey:@"dictionary"];

    NSMutableDictionary *dictionary = [applicationContext objectForKey:@"dictionary"];

    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog (@"applicationContext: %@", applicationContext);
    });

}

在 watchOS2 中使用 WatchConnectivity 在 iOS 和 WatchOS 之间发送消息

我看过 WWDC 连接会话,发现这个站点很有帮助。

任何想法(也许不是代码,而是缺少或不正确的 plist 设置?)

4

2 回答 2

6

我遇到了类似的问题(iOS 9.3,watchOS 2.2),session: didReceiveApplicationContext:委托方法在预期时不会触发。似乎存在一些未记录的行为,如果字典与发送的先前值匹配,则调用会updateApplicationContext()静默失败,既不发送字典也不抛出错误(请参阅https://forums.developer.apple.com/thread/46107)。

该线程中提供的解决方案是NSUUID().UUIDString在测试时向每个字典添加一个。为我工作。

于 2016-06-17T18:10:35.907 回答
2

找到原因了...

我确实激活了会话,但在调用过程中为时已晚。

我改了代码报错:

-(void)sendPlistToWatch:(NSMutableDictionary *)dictionary {
    NSLog(@"%s", __FUNCTION__);
    NSError *error = nil;
    if ([WCSession defaultSession]) {
        NSDictionary *applicationDict = @{@"StationFavorites.plist":dictionary};
        [[WCSession defaultSession] updateApplicationContext:applicationDict error:&error];
        if (error) {
             NSLog(@"Problem: @%@", error);
        } else {
             NSLog(@"sent dictionary");
        }

    } else {
        NSLog(@"not paired");
    }
}

那报告错误7004:WCErrorDomain Code=7004操作无法完成。(WCErrorDomain 错误 7004。)“`

我将会话重置为出现在顶部ViewDidLoad,一切都很好。

于 2015-07-17T12:43:43.357 回答