我在询问之前已经阅读了几个问题/答案,并且还附上了程序,但似乎没有用。
我的watchkit扩展是用Swift编写的,而AppDelegate是用Objective-C编写的(因为它是旧代码)。
在我的分机中,我致电:
@IBAction func toPage2() {
println("to page 2")
WKInterfaceController.openParentApplication(["page":"2"], reply: {(reply, error) -> Void in })
}
在我的AppDelegate中,我尝试了打印
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply
{
NSLog(@"handle watchkit");
NSString *file = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"page2"] ofType:@"wav"];
AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:file] error:nil];
[audio play];
...
我也试过Debug>附加到流程并选择iPhone应用程序,但仍然没有发生任何事情。有人能指点我的方向吗?
答案 0 :(得分:1)
在documentation中指定的handleWatchKitExtensionRequest中启动后台任务。这可以确保iPhone上的主应用程序不会被暂停(当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];
} );
}
答案 1 :(得分:0)
您需要注册背景模式音频,然后将您的代码整理到UIBackgroundTask
中。您还需要在reply()