对于想要在不阅读帖子的情况下快速回复的人:我没有达到任何内存限制。 阅读整篇文章了解详情。
我的WatchKit扩展程序无法正常运行,如果没有用户首先加入" onboarded"通过手机应用程序。用户必须接受我们需要的权限,因此非常重要。
在我的WatchKit扩展程序中,我想为尚未在我们的手机应用程序中完成入职的用户显示一个简单的警告。
因此,我认为我可以通过两种方式从手机获得入职状态:
当用户打开应用程序/应用程序被激活时(我使用willActivate
方法检测到这一点)
当应用程序完成入职后,它会向手表发送一条消息,表明其完成(如果扩展名可以到达)
这两者的结合将确保入职状态始终与手表保持同步。
我写了第一个可能性,利用回复处理程序来交换信息。它工作得很好,没有任何麻烦。告诉用户完成的警告消失,扩展名不会崩溃,一切都很顺利。
然后我在第二种可能性中写道,当用户完成入职时可以到达分机(用手机然后直接向同伴发送新的入职状态)。我的扩展程序在收到此消息时崩溃,我遇到了这个奇怪的错误。
Program ended with exit code: 0
我的扩展程序甚至没有机会处理新的入职状态,扩展程序退出并且给出了上述错误。
我没有达到任何内存限制。我已经阅读了technical Q&A which describes what a memory usage limit error looks like,但我没有收到任何类似的输出。同样,在扩展应该收到消息之前,这就是我的内存消耗情况。
我在完成入职后立即监控了分机的内存消耗情况,我发现没有一个尖峰表示我已超过任何一种门限。
我已经尝试逐行扫描管理启动错误的代码,我找不到它会因此错误而崩溃的原因。特别是因为获取入职状态的回复处理方法如此可靠地工作。
以下是我如何将信息发送到手表的代码。
- (void)sendOnboardingStatusToWatch {
if(self.connected){
[self.session sendMessage:@{
LMAppleWatchCommunicationKey: LMAppleWatchCommunicationKeyOnboardingComplete,
LMAppleWatchCommunicationKeyOnboardingComplete: @(LMMusicPlayer.onboardingComplete)
}
replyHandler:nil
errorHandler:^(NSError * _Nonnull error) {
NSLog(@"Error sending onboarding status: %@", error);
}];
}
}
(所有LMAppleWatchCommunicationKey
只是#define
' d键,其键完全符合字符串值。即#define LMAppleWatchCommunicationKey @"LMAppleWatchCommunicationKey"
)
即使它从未被扩展程序调用,但如果有帮助,这里是处理传入数据的扩展程序的确切接收代码。
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message {
NSString *key = [message objectForKey:LMAppleWatchCommunicationKey];
if([key isEqualToString:LMAppleWatchCommunicationKeyOnboardingComplete]){
BOOL newOnboardingStatus = [message objectForKey:LMAppleWatchCommunicationKeyOnboardingComplete];
[[NSUserDefaults standardUserDefaults] setBool:newOnboardingStatus
forKey:LMAppleWatchCommunicationKeyOnboardingComplete];
dispatch_async(dispatch_get_main_queue(), ^{
for(id<LMWCompanionBridgeDelegate> delegate in self.delegates){
if([delegate respondsToSelector:@selector(onboardingCompleteStatusChanged:)]){
[delegate onboardingCompleteStatusChanged:newOnboardingStatus];
}
}
});
}
}
在包含此与入职相关的代码之前,我的WatchKit扩展程序已经过100多人的测试,没有任何麻烦。我正在使用之前使用的完全相同的自定义错误对话框,只是使用不同的字符串。我不能为我的生活找出导致这次崩溃的原因,而且它的模糊性让我很少有工作。
非常感谢任何帮助。非常感谢你花时间阅读我的帖子。
编辑:我刚刚尝试为exit()
创建一个永不被击中的符号断点。如果我自己调用exit()
,它会调用断点,所以我知道断点本身正在工作。