我正在实施一款苹果手表。在我的Watchkit扩展中,我使用该方法与“主应用程序”进行通信。
[WKInterfaceController openParentApplication:applicationData reply:^(NSDictionary *replyInfo, NSError *error) {}];
根据apple documentation,该应用可以在后台处理请求。
When you call the openParentApplication:reply: method, iOS launches or
wakes up the parent app in the background and calls the
application:handleWatchKitExtensionRequest:reply:method of its app delegate.
然而,即使我的方法中没有代码,我的应用程序也始终处于活动状态, handleWatchKitExtensionRequest
是否有可能提示?
提前致谢
答案 0 :(得分:2)
根据Apple开发者论坛Apple开发者的官方回应,这是WatchKit Framework Beta 2中的错误。
https://devforums.apple.com/message/1082689#1082689
只是要明确一件事,iPhone应用程序已经推出了 背景。在模拟器中,当前正在启动应用程序 前景。这不是设备上的体验。该 文档特别说,“调用该方法会导致iOS 在后台启动应用程序......“。
(第6号)
BTW,昨天Beta 3发布了,也许它已经修好了。如果iPhone被锁定,你的iOS应用程序还将在后台启动。
答案 1 :(得分:2)
如果您的应用未处于活动状态,则openParentApplication无法激活它。它只能在后台执行任务。要使其正常工作,请务必按照documentation中的说明在handleWatchKitExtensionRequest
中启动后台任务。这可以确保iPhone上的主应用程序在发送回复之前不会被暂停。
iPhone上主应用程序的app委托中的代码:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void ( ^)( NSDictionary * ))reply
{
__block UIBackgroundTaskIdentifier watchKitHandler;
watchKitHandler = [[UIApplication sharedApplication]
beginBackgroundTaskWithName:@"backgroundTask"
expirationHandler:^{
watchKitHandler = UIBackgroundTaskInvalid;
}];
if ([[userInfo objectForKey:@"request"] isEqualToString:@"getData"]) {
// get data
// ...
reply( data );
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)NSEC_PER_SEC * 1), dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIApplication sharedApplication] endBackgroundTask:watchKitHandler];
});
}
答案 2 :(得分:1)
我认为"功能"中缺少背景模式。主应用程序的部分,将来会添加。
我尝试启用所有当前支持的后台模式,但没有一个工作(即主应用程序始终启动)。
我的小费 - 耐心等到下一个测试版。
答案 3 :(得分:0)
我有一个完全相同的问题,将WatchKit连接到现有的应用程序上。我在info.plist中将UIApplicationExitsOnSuspend
(又名应用程序不在后台运行)设置为YES
。将其更改为NO
,错误就会消失。