iOS/watchos2-为什么不';会话:didReceiveApplicationContext:火灾?

iOS/watchos2-为什么不';会话:didReceiveApplicationContext:火灾?,ios,session,watchos-2,Ios,Session,Watchos 2,我已经阅读了下面的问答,非常棒。这正是我在一个测试项目中所做的,它工作得很好 我现在已经创建了真正的项目,但在Watch扩展中,session:didReceiveApplicationContext:不会启动 这是我的发送代码: -(void)sendPlistToWatch:(NSMutableDictionary *)dictionary { NSLog(@"%s", __FUNCTION__); if ([WCSession defaultSession]) {

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

我现在已经创建了真正的项目,但在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);
    });

}
-(void)唤醒上下文:(id)上下文{
[super awakeWithContext:context];
如果([WCSession isSupported]){
[自我会话激活会话];
self.session=[WCSession defaultSession];
self.session.delegate=self;
}
}
-(无效)将激活{
[super-willActivate];
}
-(无效)无效{
[超级迪迪];
}
-(void)会话:(非空WCSession*)会话didReceiveApplicationContext:(非空NSDictionary*)applicationContext{
NSString*string=[applicationContext objectForKey:@“dictionary”];
NSMutableDictionary*dictionary=[applicationContext objectForKey:@“dictionary”];
dispatch\u async(dispatch\u get\u main\u queue()^{
NSLog(@“applicationContext:%@”,applicationContext);
});
}

我观看了WWDC连接会话,发现非常有用

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

找到了原因

我确实启动了会话,但在这个过程中太晚了,无法调用

我更改了代码以报告错误:

-(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顶部,一切正常。

找到了原因

我确实启动了会话,但在这个过程中太晚了,无法调用

我更改了代码以报告错误:

-(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
顶部,一切正常。

我遇到了类似的问题(iOS 9.3,watchOS 2.2),其中
会话:didReceiveApplicationContext:
委托方法在预期情况下不会触发。似乎存在一些未记录的行为,如果字典与之前发送的值匹配,则对
updateApplicationContext()
的调用会自动失败,既不会发送字典也不会抛出错误(请参阅)


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

我遇到了类似的问题(iOS 9.3,watchOS 2.2),其中
会话:didReceiveApplicationContext:
委托方法无法在预期时启动。似乎存在一些未记录的行为,如果字典与之前发送的值匹配,则对
updateApplicationContext()
的调用会自动失败,既不会发送字典也不会抛出错误(请参阅)


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

我想他们是故意这样做的,以保护手表的电池。如果值和对象相同,则使用applicationcontext发送没有任何意义。您可能需要重新考虑使用其他方法,因为applicationcontext的目的主要是更新watch应用程序状态。这是否仅在模拟器上发生?还是在实际设备上?仅在模拟器上测试,无法确认这是否也是实际设备上的问题。我认为他们故意这样做是为了保护手表电池。如果值和对象相同,则使用applicationcontext发送没有任何意义。您可能需要重新考虑使用其他方法,因为applicationcontext的目的主要是更新watch应用程序状态。这是否仅在模拟器上发生?还是在实际设备上?仅在模拟器上测试,无法确认这是否也是实际设备上的问题。