2014-12-30 12 views
12

So che l'estensione openParentApplication in kit orologio può aprire l'app host sullo sfondo ma non in primo piano.Avvia l'app host dall'app orologio

Ho anche provato ad utilizzare openUrl() api di NSExtensionContext come di seguito:

NSExtensionContext *ctx = [[NSExtensionContext alloc] init]; 

NSURL *url = [NSURL URLWithString:@"myScheme://today"]; 
[ctx openURL:url completionHandler:^(BOOL success) { 
    NSLog(@"fun=%s after completion. success=%d", __func__, success); 
}]; 
[ctx completeRequestReturningItems:ctx.inputItems completionHandler:nil]; 

Anche in questo caso l'applicazione host non è lanciato. Mi sto perdendo qualcosa? o non è possibile avviare l'app host dall'estensione del kit watch?

risposta

9

Se è necessario aprire l'app principale in primo piano, utilizzare Handoff!

https://developer.apple.com/handoff/

Esempio:

Da qualche parte condivisa per entrambi:

static let sharedUserActivityType = "com.yourcompany.yourapp.youraction" 
static let sharedIdentifierKey = "identifier" 

sul tuo orologio:

updateUserActivity(sharedUserActivityType, userInfo: [sharedIdentifierKey : 123456], webpageURL: nil) 

sul vostro iPhone in App Delegato:

func application(application: UIApplication, willContinueUserActivityWithType userActivityType: String) -> Bool { 
    if (userActivityType == sharedUserActivityType) { 
     return true 
    } 
    return false 
} 

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]!) -> Void) -> Bool { 
    if (userActivity.activityType == sharedUserActivityType) { 
     if let userInfo = userActivity.userInfo as? [String : AnyObject] { 
      if let identifier = userInfo[sharedIdentifierKey] as? Int { 
       //Do something 
       let alert = UIAlertView(title: "Handoff", message: "Handoff has been triggered for identifier \(identifier)" , delegate: nil, cancelButtonTitle: "Thanks for the info!") 
       alert.show() 
       return true 
      } 
     } 
    } 
    return false 
} 

E infine (Questo passaggio è importante !!!): Nella tua Info.plist (s)

enter image description here

+0

Hai letto la documentazione e guardato il video? – stk

+0

Questo codice mostra l'avviso che hai menzionato ?? –

+0

Dovrebbe, sì. Non funziona per te? – stk

21

A partire dalla Beta 3 di iOS 8.2 non è attualmente possibile aprire l'app iOS in primo piano. Come hai detto openParentApplication puoi aprire l'app in background. Sfortunatamente non vi è alcun segno di API per aprire l'app su iPhone.

più post su Apple Dev Forum detto che non è possibile

https://devforums.apple.com/message/1076125#1076125

corretta, una notifica può ancora dichiarare un'azione background che l'iPhone app gestirà, quindi in questo senso si può lanciare l'app per iPhone. Ma l'app per iPhone non può essere portata in primo piano da un'app WatchKit.

E altro post

https://devforums.apple.com/message/1082620#1082620

su un dispositivo, esso [applicazione Watch] non sarà - portare la vostra app iOS in primo piano.

+2

Grazie per ricordare me la Forum degli sviluppatori Apple. Era un posto dimenticato per molto tempo. Ti meriti 50 ripetizioni. –

+1

È possibile rilevare se l'host/app principale è già aperta e in primo piano? –

12

Sono fiducioso che Apple fornirà API per lanciare l'applicazione genitore da un'applicazione orologio in un futuro beta, ma per ora sono riuscito a realizzarlo nel modo seguente ...

Chiama openParentApplication:reply: come normale:

- (void)openPhoneApp { 
    [WKInterfaceController openParentApplication:[NSDictionary new] reply:nil]; 
} 

Implementare application:handleWatchKitExtensionRequest:reply: nel vostro AppDelegate, e lanciare se stesso utilizzando uno schema URL personalizzato:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply { 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myappscheme://open"]]; 
} 
+0

Eccellente suggerimento. Ho provato lo stesso codice dalle estensioni ma non era supportato lì. L'app sarà approvata ?? È legale? –

+0

Non sono sicuro se Apple approverebbe questo. Non riesco a vedere perché no perché, per quanto posso dire, non infrange nessuna regola. Questa è solo una soluzione temporanea in ogni caso, spero che Apple fornirà un modo ufficiale per farlo in una beta futura. – JTaylor

+8

Mentre questo approccio avvia l'app per iOS principale in primo piano nel simulatore, ho verificato due volte con Apple che questa funzionalità non sarà consentita nell'App Store. Questa risposta non è corretta e non dovrebbe essere utilizzata. @Ivp ha la risposta corretta qui. – cnoon