2015-05-21 24 views
6

Sto tentando di avviare l'app ios principale dall'app watchkit. Sto usando lo schema url per avviare l'app.Ma sembra comehandleWatchKitExtensionRequest non viene chiamato

-(void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply 

non viene chiamato. Sembra che l'app di sorveglianza lanci l'app in backgound. Ma l'app principale non gestisce la richiesta del watchkit. Ho provato il mio approccio in un nuovo progetto e funziona perfettamente. C'è qualche cosa che devo prestare attenzione?

Ho già provato a eseguire il debug> Allega a elaborare> myapp e inserire un punto di interruzione all'interno del metodo handleWatchKitExtensionRequest per confermare se è stato chiamato e non viene chiamato.

Ecco il progresso, chiamo openParentApplication quando si fa clic su un pulsante nell'app watch.

@IBAction func viewOniPhoneAction() { 


    let userInfo: [NSObject : AnyObject] = [ 
     "userID" : user.userID 
    ] 


    WKInterfaceController.openParentApplication(userInfo, reply: { (userInfo : [NSObject : AnyObject]!, error : NSError!) -> Void in 

    }) 

} 

Ecco la mia app delegeate

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply 
{ 
NSDictionary *replyDict = @{@"response": @"done"}; 
reply(replyDict); 
} 

ho provato reply() in handleWatchKitExtensionRequest ma ho ottenuto questo errore nel blocco risposta da orologio app

Error Error Domain=com.apple.watchkit.errors Code=2 "The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]" UserInfo=0x60800026e0c0 {NSLocalizedDescription=The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]} 
+0

No, ho già provato che uno. Credo che il problema sia per avviare un'attività in background in handleWatchKitExtensionRequest, il metodo deve essere chiamato. In modo che il codice all'interno del metodo possa essere eseguito. Sembra che il metodo non venga nemmeno chiamato. – cloudy45man

+0

Hai provato questo? http://stackoverflow.com/questions/28112445/handlewatchkitextensionrequest-not-responding-to-openparentapplication-in-watchk – vomako

+0

Sì, non funziona. C'è qualche impostazione che posso verificare se l'app principale e l'app di controllo sono collegate correttamente. – cloudy45man

risposta

0

handleWatchKitRequest non si chiama quando si apre l'app tramite uno schema URL. Viene chiamato solo in risposta alle richieste fatte nell'estensione WatchKit realizzate usando openParentApplication:reply:. Ecco perché non lo vedi essere eseguito.

+0

Scusate per la confusione, io uso entrambi i metodi per ottenere ciò che voglio. Uso l'applicazione aperta WKInterfaceController all'interno dell'app watch e le seguo per avviare l'app. - (void) applicazione: (UIApplication *) applicazione handleWatchKitExtensionRequest: (NSDictionary *) userInfo risposta: (void (^) (NSDictionary *)) Risposta { [[UIApplication sharedApplication] openURL: [NSURL URLWithString: @" HandlingWatchKitTest: // "]]; } – cloudy45man

0

Sarà necessario avvolgere la risposta in un'attività in background per assicurarsi che l'app genitore abbia il tempo di rispondere.

-

(void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *replyInfo))reply{ 

    UIApplication *app = [UIApplication sharedApplication]; 

    UIBackgroundTaskIdentifier bgTask __block = [app beginBackgroundTaskWithName:@"watchAppRequest" expirationHandler:^{ 

     [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 

    }]; 

//make your calls here to your tasks, when finished, send the reply then terminate the background task 

//send reply back to watch 
reply(replyInfo); 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask=UIBackgroundTaskInvalid; 
    }); 
} 
+0

Ho provato il tuo codice ma non ancora funzionante. – cloudy45man

2

ho preso a lavorare !!! Avere lo stesso problema ....

Basta aumentare il tempo di beginBackgroundTaskWithExpirationHandler a un valore maggiore se non si ottengono ancora i dati !!! Ho usato 2 secondi in precedenza ma la mia rete è troppo debole !!!

io chiamo openParentApplication quando un tasto è scattato in vigilanza app:

[WKInterfaceController openParentApplication:loadDetailChatDataDictionary reply:^(NSDictionary *replyInfo, NSError *error) { 

Ecco la mia app delegato:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply { 

    __block UIBackgroundTaskIdentifier bogusWorkaroundTask; 
    bogusWorkaroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:bogusWorkaroundTask]; 
    }]; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // increase the time to a larger value if you still don't get the data!!! I used 2 secs previously but my network is too weak!!! 
     [[UIApplication sharedApplication] endBackgroundTask:bogusWorkaroundTask]; 
    }); 
    // -------------------- 

    __block UIBackgroundTaskIdentifier realBackgroundTask; 
    realBackgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     reply(nil); 
     [[UIApplication sharedApplication] endBackgroundTask:realBackgroundTask]; 
    }]; 

    NSString *value = userInfo[@"key"]; 
    if ([value isEqualToString:@"loadRecentChatData"]) { 
       reply(@{@"recents":recents}); // Add your reply here 
    } 
+0

Potrebbe spiegare perché hai bisogno di questo bogusWorkaroundTask? Non mi è chiaro il motivo per cui sembra aumentare il tempo su di esso, e non su realBackgorundTask ... – blackbox

+1

@blackbox il falso workaround compito è lì per risolvere un problema qui a volte Apple stava uccidendo l'app anche se avevi già avviato un'attività in background. Per qualche motivo, l'avvio immediato di un'attività fasulla e la sua disattivazione dopo pochi secondi hanno funzionato per consentire al codice del gestore reale di stabilire il proprio task in background prima di essere interrotto prematuramente. Questa soluzione ha funzionato anche per me, tuttavia trovo che 'application: handleWatchKitExtensionRequest: reply:' cessa di essere chiamato dopo che sono state fatte diverse richieste e il dispositivo è bloccato. –

Problemi correlati