- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
情况:我在 Watch 应用程序中使用 openParentApplication
来调用主应用程序中的 handleWatchKitExtensionRequest
。这在模拟器中运行良好,并且在 iPhone 应用程序处于事件/打开状态时也适用于实际设备(Apple Watch 和 iPhone)。
问题: 当我在实际设备(Apple Watch 和 iPhone)上运行它时,handleWatchKitExtensionRequest
没有返回数据给 openParentApplication
主 iPhone 应用程序未激活/打开。
WatchKit 扩展中 InterfaceController.m 中的代码:
NSDictionary *requst = @{ @"request" : @"getData" };
[InterfaceController openParentApplication:requst
reply:^( NSDictionary *replyInfo, NSError *error ) {
// do something with the returned info
}];
iPhone 上主应用的应用委托(delegate)中的代码:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void ( ^)( NSDictionary * ))reply
{
if ( [[userInfo objectForKey:@"request"] isEqualToString:@"getData"] )
{
// get data
// ...
reply( data );
}
}
最佳答案
当 iPhone 上的主应用程序未激活时,reply()
可能无法到达,因为后台任务之前已被操作系统杀死。
解决方案是在 handleWatchKitExtensionRequest
中显式启动后台任务,如 documentation 中指定的那样.如果像这样启动后台任务,它最多可以运行 180 秒。这可确保 iPhone 上的主应用程序在发送回复之前不会暂停。
iPhone 上主应用的应用委托(delegate)中的代码:
- (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];
} );
}
如果您需要异步获取数据,请使用以下方法确保该方法不会立即返回(不调用 reply):
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void ( ^)( NSDictionary * ))reply
{
__block UIBackgroundTaskIdentifier watchKitHandler;
watchKitHandler = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"backgroundTask"
expirationHandler:^{
watchKitHandler = UIBackgroundTaskInvalid;
}];
NSMutableDictionary *response = [NSMutableDictionary dictionary];
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[ClassObject getDataWithBlock:^(BOOL succeeded, NSError *error){
if (succeeded)
{
[response setObject:@"update succeded" forKey:@"updateKey"];
}
else
{
if (error)
{
[response setObject:[NSString stringWithFormat:@"update failed: %@", error.description] forKey:@"updateKey"];
}
else
{
[response setObject:@"update failed with no error" forKey:@"updateKey"];
}
}
reply(response);
dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
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];
});
}
关于ios - 如何正确使用 "openParentApplication"和 "handleWatchKitExtensionRequest"以便调用 "reply()"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30000274/
handleWatchKitExtensionRequest 中的操作是否有限制?我尝试从资源包返回一个 UIImage,但我得到一个 nil 回复。 这个有效: -(void)application
我正在测试 iPhone 应用程序上某些代码的执行情况。我遵循 Apple 建议的文档(不使用后台任务,仅使用控制台日志)。但是我在控制台上没有得到任何东西(我想看到字符串“howdy”)。 这是因为
我正在尝试从 watchkit 应用程序启动父 ios 应用程序。我正在使用 url scheme 来启动应用程序。但它看起来像 -(void)application:(UIApplication *
我正在尝试将 2 个 PFQuery 嵌套在 HandleWatchKitExtensionRequest 中,以便我可以在回复中将数据传回我的 Watch Extension。在下面的代码中,第一个
通过上述方法请求 XML 项字典时出现以下错误: > NSLocalizedDescription=The UIApplicationDelegate in the iPhone App never
我正在试验一个 WatchKit 应用程序,它将在 iPhone 上触发音频警报。我已将其设置为触发,每 5 秒重复一次。在 iPhone 上,我有在后台播放短音频 wav 文件的逻辑。即使应用程序最
问之前看了几个问题/答案,也附上了流程,但是好像不行。 我的 watchkit 扩展是用 Swift 编写的,而 AppDelegate 是用 Objective-C 编写的(因为它是旧代码)。 在我
我在我的 iOS 应用程序委托(delegate)中的 handleWatchKitExtensionRequest 中放置了一堆 NSLog 语句。当我从调用 handleWatchKitExten
所以我有一个父应用程序可以登录服务器、创建用户等。然后我使用 WatchApp 中的 handleWatchKitExtensionRequest 来访问父应用程序,但一切都是空的。 我的问题是,ha
我正在尝试实现 Apple Watch 扩展。我需要调用我的 iPhone 应用程序类方法来触发 Web 请求。我在苹果文档中看到了这个方法,我也在尝试同样的方法。但是这个方法没有调用 - (void
我正在尝试将信息从我的 WatchKit 应用程序发送到我的主要父应用程序,据我所知,我应该只能使用 openParentApplication在我的 watchkit 扩展中,handleWatch
情况:我在 Watch 应用程序中使用 openParentApplication 来调用主应用程序中的 handleWatchKitExtensionRequest。这在模拟器中运行良好,并且在 i
得到 nil 或错误代码的不一致结果:当在应用程序 func handleWatchKitExtRequest 中调用 Parse 代码时,没有结果匹配查询。 (使用 Apple iOS SDK 8.
我正在构建一个 watch 扩展程序,它使用 handleWatchKitExtensionRequest 让 iPhone 应用程序刷新其填充共享首选项(应用程序组)的数据。 因此,每次我加载该应用
我正在使用 openParentApplication:和 handleWatchKitExtensionRequest:请求并发送一个 NSNumber 对象,该对象包含来自核心位置 locatio
好的,我正在制作这个 Apple Watch 应用程序,在我的 Watch 应用程序中,我有一个按钮。当您触摸按钮时,它会执行以下操作: [WKInterfaceController openPare
我是一名优秀的程序员,十分优秀!