- 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/
在我的 watch 应用程序中,我使用 openParentApplication 与父应用程序通信,但这并不总是可靠的,尤其是当我有一段时间没有使用父应用程序时。看来这不是唤醒父应用进行通信。但是,
我正在尝试使用 openParentApplication 从服务器请求数据并在 watch 扩展中使用它,但是当主应用程序未在前台运行时我没有得到任何回复。当主应用程序在前台运行时,一切正常。 最佳
我的 watch 应用程序使用 openParentApplication 从其 WatchKit 扩展请求数据。它从 watch 应用程序的主页 init() 开始: class HomePage
我目前有一个问题。我想要的行为:如果我打开我的 WatchKit 应用程序,我会调用“openParentApplication”。我收到了我想要的数据。但是如果我在真实设备上测试,它就不起作用,因为
在我的应用程序中,我从 iPhone 到 Apple Watch 以及从 Apple Watch 到 iPhone 进行通信。 对于 Apple Watch 上的 Tableview,当应用程序在 i
我在 WKInterfaceController 和 iOS 中调用 openParentApplication 方法等待来自服务器的响应。然后我想再次使用openParentApplication在
打开 Apple Watch 应用程序后,我用 openParentApplication:reply: 唤醒 iPhone 应用程序以获取当前位置。正如苹果所说 here ,您应该避免在 Watch
我正在尝试通过 Watchkit 操作打开 Swift iOS 应用程序,但我无法找到 openParentApplication 方法 // Register notifications in i
我正在实现 Apple Watch。在我的 Watchkit 扩展中,我使用该方法与“主应用程序”通信。 [WKInterfaceController openParentApplicatio
我正在开发一个 Apple Watch 应用程序,它使用 openParentApplication:reply: 方法与其父应用程序通信。 父应用程序与 Web 服务通信,并通过使用包含数据的 NS
我有一个 watch 应用程序需要与父应用程序通信以获取一些信息。这应该只在口袋里使用 watch 和手机时发生。它曾经像这样工作: 在 watch 上的 InterfaceController 中:
我正在尝试实现 Apple Watch 扩展。我需要调用我的 iPhone 应用程序类方法来触发 Web 请求。我在苹果文档中看到了这个方法,我也在尝试同样的方法。但是这个方法没有调用 - (void
在更新到 Xcode 7 之后,我刚刚将我的项目更新到 Swift 2.0,但我的 watch 扩展遇到了问题。 我想要 watchOS 1 目标和 watchOS 2 目标,所以我为 watchOS
我正在尝试将信息从我的 WatchKit 应用程序发送到我的主要父应用程序,据我所知,我应该只能使用 openParentApplication在我的 watchkit 扩展中,handleWatch
情况:我在 Watch 应用程序中使用 openParentApplication 来调用主应用程序中的 handleWatchKitExtensionRequest。这在模拟器中运行良好,并且在 i
当我激活我的 WatchApp InterfaceController 时。它所做的第一件事是尝试通过调用“OpenParentApplication”方法来唤醒 parentApplication(
我正在开发一个在 watch 和 iOS 父应用程序之间进行通信的应用程序。它通过打开 WatchKit 扩展将数据发送到父应用程序。我知道 openParentApplication:reply 在
我正在使用 openParentApplication:和 handleWatchKitExtensionRequest:请求并发送一个 NSNumber 对象,该对象包含来自核心位置 locatio
我为 Apple Watch 创建了一个较小的项目,以与其运行的父应用程序进行通信。 所以我在我现有的 iOS 项目中创建了一个 Watch 套件扩展,但是当它从 Watch 端调用 openpare
更新到 Xcode 7 beta 后,在运行代码行“WKInterfaceController.openParentApplication”时,我收到以下错误消息:“‘openParentApplic
我是一名优秀的程序员,十分优秀!