2015-05-21 4 views
6

Ich versuche, die übergeordnete iOS-App aus der Watchkit-App zu starten. Ich verwende URL-Schema, um die App zu starten. Aber es scheint wiehandleWatchKitExtensionRequest heißt nicht

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

ist nie genannt. Es sieht so aus, als ob die Watch App die App im Hintergrund startet. Die übergeordnete App verarbeitet jedoch nicht die Watchkit-Anfrage. Ich habe meinen Ansatz in einem neuen Projekt versucht und es funktioniert perfekt. Gibt es etwas, worauf ich achten muss?

Ich habe bereits versucht, Debug> Attach to process> myapp und setzen Sie einen Haltepunkt in handleWatchKitExtensionRequest-Methode, um zu bestätigen, ob es aufgerufen wird und es nicht aufgerufen wird.

Hier ist der Fortschritt, ich rufe openParentApplication auf, wenn eine Schaltfläche in Watch app geklickt wird.

@IBAction func viewOniPhoneAction() { 


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


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

    }) 

} 

Hier ist mein App delegeate

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

ich reply() in handleWatchKitExtensionRequest versucht, aber ich habe diesen Fehler in dem Antwortblock von Merk 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

Nein, ich habe bereits versucht, dass ein. Ich glaube das Problem ist, um eine Hintergrundaufgabe in handleWatchKitExtensionRequest zu starten, muss die Methode aufgerufen werden. Damit kann der Code innerhalb der Methode ausgeführt werden. Es scheint, als ob die Methode nicht einmal aufgerufen wird. – cloudy45man

+0

Haben Sie das versucht? http://stackoverflow.com/questions/28112445/handlewatchkitextensionrequest-not-respondering-to-openparentapplication-in-watchk – vomako

+0

Ja, es funktioniert nicht. Gibt es eine Einstellung, die ich prüfen kann, ob die Eltern-App und die Watch-App korrekt verknüpft sind? – cloudy45man

Antwort

0

handleWatchKitRequest nicht aufgerufen wird, wenn Sie öffnen die App über ein URL-Schema. Es wird nur als Reaktion auf Anforderungen in der WatchKit-Erweiterung mit openParentApplication:reply: aufgerufen. Deshalb sehen Sie nicht, dass es ausgeführt wird.

+0

Sorry für Verwirrung, ich verwende beide Methoden, um zu erreichen, was ich will. Ich benutze WKInterfaceController openapplication in der Watch App und benutze folgende um die App zu starten. - (void) Anwendung: (UIApplication *) Anwendung handleWatchKitExtensionRequest: (NSDictionary *) userinfo antworten: (void (^) (NSDictionary *)) Antwort { [[UIApplication shared] openURL: [NSURL URLWithString: @“ HandlingWatchKitTest: // "]]; } – cloudy45man

0

Sie müssen Ihre Antwort in eine Hintergrundaufgabe einbinden, um sicherzustellen, dass Ihre Eltern-App Zeit hat, zu antworten.

-

(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

Ich habe Ihren Code versucht, aber noch nicht funktioniert. – cloudy45man

2

Ich habe es zu arbeiten !!! Das gleiche Problem haben ....

Erhöhen Sie einfach die beginBackgroundTaskWithExpirationHandler Zeit auf einen größeren Wert, wenn Sie immer noch nicht die Daten erhalten !!! Ich habe vorher 2 Sekunden gebraucht, aber mein Netzwerk ist zu schwach !!!

Ich nenne openParentApplication, wenn eine Taste in der Uhr App geklickt wird:

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

Hier ist meine AppDelegate:

- (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

Kannst du erklären, warum du diese bogusWoaroundTask benötigst? Nicht klar für mich, warum Sie scheinen, um Zeit zu erhöhen, und nicht auf realBackgorundTask ... – blackbox

+1

@blackbox die falsche Workaround-Aufgabe gibt es zur Problemumgehung ein Problem hier Apple manchmal tötete die App, auch wenn Sie bereits eine Hintergrundaufgabe gestartet hatten. Aus irgendeinem Grund hat das sofortige Starten einer falschen Aufgabe und das Ausschalten nach einigen Sekunden dazu geführt, dass der echte Behandlercode seine eigene Hintergrundaufgabe einrichten konnte, bevor er vorzeitig abgebrochen wurde. Diese Lösung funktionierte auch für mich, aber ich finde, dass 'application: handleWatchKitExtensionRequest: reply:' nach mehreren Anfragen nicht mehr aufgerufen wird und das Gerät gesperrt ist. –