iOS/watchos2 - 为什么 session:didReceiveApplicationContext: 不开火?
iOS/watchos2 - Why doesn't session:didReceiveApplicationContext: fire?
我已经阅读了下面的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);
});
}
我观看了 WWDC 连接 session,发现 this site 非常有帮助。
任何想法(也许不是代码,而是缺少或不正确的 plist 设置?)
找到原因...
我确实激活了session,但是在调用过程中来不及了。
我改了代码报错:
-(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),其中 session: didReceiveApplicationContext:
委托方法不会按预期触发。似乎有一些未记录的行为,如果字典与先前发送的值匹配,则对 updateApplicationContext()
的调用会静默失败,既不会发送字典也不会引发错误(请参阅 https://forums.developer.apple.com/thread/46107)。
该线程中提供的解决方案是在测试时向每个词典添加 NSUUID().UUIDString
。为我工作。
我已经阅读了下面的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);
});
}
我观看了 WWDC 连接 session,发现 this site 非常有帮助。
任何想法(也许不是代码,而是缺少或不正确的 plist 设置?)
找到原因...
我确实激活了session,但是在调用过程中来不及了。
我改了代码报错:
-(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),其中 session: didReceiveApplicationContext:
委托方法不会按预期触发。似乎有一些未记录的行为,如果字典与先前发送的值匹配,则对 updateApplicationContext()
的调用会静默失败,既不会发送字典也不会引发错误(请参阅 https://forums.developer.apple.com/thread/46107)。
该线程中提供的解决方案是在测试时向每个词典添加 NSUUID().UUIDString
。为我工作。