2015-01-09 13 views
5

Possiamo chiamare il metodo openParentApplication:reply: nell'app ios genitore dall'estensione del kit orologio.Come chiamare il metodo nell'estensione del watchkit dall'app genitore i

Ma c'è un modo per chiamare il metodo nell'estensione di watchkit dall'app ios principale?

Ad esempio: nella mia app quando l'utente aggiunge un evento nell'app ios, l'elenco degli eventi del watchkit deve anche essere aggiornato, per cui devo chiamare il metodo di aggiornamento nell'estensione del watchkit quando l'utente aggiunge un nuovo evento nell'app principale.

Per favore aiuto.

Grazie.

risposta

4

Non è possibile chiamare direttamente un metodo da un'estensione watchkit, ma è possibile inviare una notifica di Darwin (o usare MMWormhole libreria (here), ed eseguire il metodo corretto, dopo aver ricevuto esso.

+0

Ottima risposta! Tuttavia, vorrei aggiungere che questo non è documentato come supportato. Questo potrebbe essere prevenuto in futuro o potrebbe non passare la certificazione Apple quando iniziano ad accettare app di watchkit. Anche se, per ora funziona splendidamente! –

1

È possibile utilizzare l'incorporato in WatchConnectivity quadro per inviare messaggi da iOS app per l'Apple Osservare abbinato.

1) in primo luogo, attivare orologio sessione di connettività sia in iOS ed estensione WatchKit. Sul lato iOS può essere fatto in application didFinishLaunchingWithOptions del delegato dell'app. Sul lato orologio è possibile eseguire questo codice nel metodo applicationDidFinishLaunching del delegato di estensione WatchKit.

if WCSession.isSupported() { 
    let session = WCSession.defaultSession() 
    session.delegate = self 
    session.activateSession() 
} 

2) Ora invia un messaggio dalla tua app iOS.

let session = WCSession.defaultSession() 

session.sendMessage(["message from iOS app":""], replyHandler: { reply in 
    // Handle reply from watch (optional)  
}, errorHandler: nil) 

3) ricevere il messaggio nel proprio interno WatchKit implementando il metodo session didReceiveMessage nella classe WCSessionDelegate delegato.

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 
    if let message = message["message from iOS app"] { 
    NSNotificationCenter.defaultCenter().postNotificationName("myapp.reload", object: self, userInfo: ["data": message]) 
    } 
} 

Alla ricezione del messaggio da iOS stiamo inviando una notifica con postNotificationName metodo.

4) Abbonarsi a questa notifica nel proprio InterfaceController che richiede l'aggiornamento (o in qualsiasi altro luogo in cui si desidera ricevere questa notifica di aggiornamento).

override func awakeWithContext(context: AnyObject?) { 
    super.awakeWithContext(context) 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "didReceiveReloadNotification:", name: "myapp.reload", object: nil) 
} 

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self, 
    name: "myapp.reload", object: nil) 
} 

5) Infine, implementare il metodo del gestore di notifica. Qui è dove puoi aggiornare la tua interfaccia utente.

func didReceiveReloadNotification(notification: NSNotification) { 
    let userInfo = notification.userInfo as? [String: String] 
    if let userInfo = userInfo, data = userInfo["data"] { 
    // Update UI 
    } 
} 

Nota: per il bene di leggibilità Sto usando stringa di testo in linea per il "messaggio da iOS app" messaggio chiave nome di notifica "myapp.reload" e. Ma nell'app reale è meglio usare le proprietà per queste stringhe di testo per evitare errori di battitura.

Problemi correlati