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