2015-05-06 3 views
1

Я прочитал несколько вопросов/ответов перед тем, как задать вопрос, а также приложил процесс, но, похоже, не работает.Родительская ручкаWatchKitExtensionRequest никогда не вызывал?

Мое расширение 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

ли эта проблема происходит также в тренажере, когда основной приложение iPhone является активным? Возможно, это поможет: http://stackoverflow.com/questions/30000274/calling-parent-application-from-watch-app – vomako

ответ

0

Вам нужно будет зарегистрироваться в режиме фонового звука, а затем взять код и завернуть его в UIBackgroundTask Кроме того, необходимо вернуть reply() как часть вашего handleWatchKitExtensionRequest

Вот хорошая ссылка на background tasks

+1

Вам не нужно регистрироваться в фоновом режиме. Это приведет к тому, что ваше приложение будет потенциально отклонено, если вы не воспроизводите фоновый звук. – bgilham

+0

Вы используете 'handleWatchKitExtensionRequest', который запустит ваше приложение в фоновом режиме, если он еще не запущен на переднем плане. – rmp

+0

Я запускаю приложение на переднем плане ... ничего не распечатывается, ничего не играет. –

1

Запустите фоновое задание в handleWatchKitExtensionRequest, как указано в documentation. Это гарантирует, что основное приложение на iPhone не будет приостановлено (когда приложение на iPhone не будет активным), прежде чем он сможет отправить свой ответ.

код в приложение делегата от основного приложения на iPhone:

- (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]; 
    }); 
} 
Смежные вопросы