从未调用父handleWatchKitExtensionRequest?

时间:2015-05-06 14:25:26

标签: objective-c swift watchkit

我在询问之前已经阅读了几个问题/答案,并且还附上了程序,但似乎没有用。

我的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应用程序,但仍然没有发生任何事情。有人能指点我的方向吗?

2 个答案:

答案 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() handleWatchKitExtensionRequest >

这是background tasks

上的一个很好的链接