Ios 未调用didReceiveApplicationContext

Ios 未调用didReceiveApplicationContext,ios,watchkit,watchos-2,watchconnectivity,Ios,Watchkit,Watchos 2,Watchconnectivity,我刚刚使用教程/示例代码在我的应用程序中设置了WCConnectivity,我觉得我已经正确地实现了它。我没有使用模拟器进行测试。出于某种原因,在watch应用程序中没有调用didReceiveApplicationContext,即使一切都已正确设置 我尝试在ExtensionDelegate中调用WatchKit应用程序的接口控制器,并使用NSUserDefaults设置接口控制器数据 iOS应用程序 ViewController.m 手表分机码 extensionelegate.m 如果它

我刚刚使用教程/示例代码在我的应用程序中设置了WCConnectivity,我觉得我已经正确地实现了它。我没有使用模拟器进行测试。出于某种原因,在watch应用程序中没有调用didReceiveApplicationContext,即使一切都已正确设置

我尝试在ExtensionDelegate中调用WatchKit应用程序的接口控制器,并使用NSUserDefaults设置接口控制器数据

iOS应用程序

ViewController.m

手表分机码

extensionelegate.m


如果它不起作用,它可能没有正确实现

乍一看有几个问题:

  • 在iOS应用程序中,您可以获取对共享会话的引用并将其激活,但不要将该局部变量分配给视图控制器上的任何属性。这意味着一旦退出
    viewDidLoad
    ,局部变量将超出范围。您还需要在手表分机中更正此问题

  • saveTrip
    中,再次创建另一个本地会话,该会话未激活且没有任何委托。您需要使用之前设置并激活的第一个会话

  • 在您的手表上,您保存接收到的数据,但您的接口控制器不会知道有新数据需要加载和显示

一些提示:

  • 如果您在
    应用程序:didFinishLaunchingWithOptions
    中设置并激活该会话,该会话将在应用程序范围内可用(并且在应用程序生命周期的早期激活)

  • 您应该检查您的会话是否有效,因为手表可能未配对,或者手表应用程序可能未安装。以下是在整个应用程序中支持使用手表连接的简单方法

  • 您可能希望将更少/更轻的数据传递给手表,而不是尝试归档一组自定义对象

  • 顺便说一句,您试图用
    NSUserDefaults
    做的事情非常复杂。它的真正目的是在发布时保留首选项。将其误用为在扩展和控制器之间来回传递模型的方式是不合适的


处理任何错误可能会很有用,因此更改:

[session updateApplicationContext:applicationDict error:nil];


我有同样的问题,并已修复。
我忘了在watch extension中添加watch连接框架。

对我来说,这是两件事:

  • 在字典中传递无效值。甚至不能传递
    NSNull()
    来表示零值。如果其中有无法在plist中表示的数据,它将失败

  • 如果字典没有更改,后续对
    updateApplicationContext
    的调用将不会触发对
    didReceiveApplicationContext
    的相应调用。要在调试构建中强制更新,您可以向负载添加UUID,例如:

    上下文[“强制发送”]=UUID().UUIString


  • 没有名为
    didReceiveApplicationWithContext
    的方法。发布您的实际代码。@dan更新了原始帖子谢谢。我只是非常自由地使用NSUserDefaults,因为这是应用程序的测试版,而在实际应用程序中,我将使用数据库和API调用。我想这可能与我的实际项目有关-我正在为session.reachable实现,即使在Watch应用程序关闭时也可以访问,这是令人担忧的。我还收到一个错误,表示Watch二进制文件未连接到Watch扩展,这同样令人担忧。我可能不得不从一个新的项目开始,然后重新开始。这是最重要的发现!applicationContext在iOS设备上进行缓冲,因此,如果它没有更改,则只会将其传输到watch扩展名一次。在测试环境中,添加一个“改变者”(比如UUID解决方案,或者——也许更好——一个NSDate.date)非常有帮助。
    - (void)applicationDidFinishLaunching {
    if ([WCSession isSupported]) {
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }
    }
    - (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
    self.places= [applicationContext objectForKey:@"UserLocations"];
    [[NSUserDefaults standardUserDefaults] setObject:self.places forKey:@"UserLocations"];
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    }
    
    - (void)willActivate {
    [super willActivate];
    self.placesData = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"UserLocations"]];
    [self loadData];
    }
    
    [session updateApplicationContext:applicationDict error:nil];
    
    NSError *error;    
    if (![session updateApplicationContext:applicationDict error:&error]) {
        NSLog(@"updateApplicationContext failed with error %@", error);
    }