【问题标题】:iOS/watchos2 - Why doesn't session:didReceiveApplicationContext: fire?iOS/watchos2 - 为什么 session:didReceiveApplicationContext: 不触发?
【发布时间】:2015-07-17 10:52:23
【问题描述】:

我已阅读下面的 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);
    });

}

Send messages between iOS and WatchOS with WatchConnectivity in watchOS2

我观看了 WWDC 连接会话,发现 this site 非常有帮助。

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

【问题讨论】:

    标签: ios session watchos-2


    【解决方案1】:

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

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

    【讨论】:

    • 我认为他们故意这样做是为了保护手表电池。如果值和对象相同,则无论如何都没有必要使用 applicationcontext 发送。您可能需要重新考虑使用其他方法,因为 applicationcontext 的目的主要是更新手表应用状态。
    • 这只发生在模拟器上吗?还是在实际设备上?
    • 只在模拟器上测试过,无法确认这是否也是真机上的问题。
    【解决方案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 顶部,一切都很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 2011-10-12
      • 2015-06-16
      • 2022-08-03
      • 1970-01-01
      • 2017-03-16
      • 2014-11-05
      • 1970-01-01
      相关资源
      最近更新 更多