Es ist wichtig, dass Sie die in Ihrer AppDelegate
didFinishLaunchingWithOptions
Methode aktivieren. Außerdem müssen Sie die WCSessionDelegate
dort einstellen. Wenn Sie es anderswo machen, wird der Code möglicherweise nicht ausgeführt, wenn das System die getötete App im Hintergrund startet.
Auch sollte man die Antwort über die replyHandler
senden. Wenn Sie versuchen, etwas anderes zu senden, wartet das System auf eine Antwort, die nie kommt. Daher der Zeitüberschreitungsfehler. Hier
ist ein Beispiel, das das App aufwacht, wenn er getötet wird:
Im WatchExtension:
Einrichten der Sitzung. Typischerweise in Ihrem ExtensionDelegate:
func applicationDidFinishLaunching() {
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
}
Und dann die Nachricht senden, wenn Sie etwas aus der App benötigen:
if WCSession.defaultSession().reachable {
let messageDict = ["message": "hello iPhone!"]
WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
print(replyDict)
}, errorHandler: { (error) -> Void in
print(error)
}
}
In der iPhone App:
Gleiche Einrichtung einer Sitzung, aber dieses Mal Stellen Sie auch den Delegierten ein:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
}
Und dann implementieren die Delegatmethode die Antwort auf die Uhr senden:
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
replyHandler(["message": "Hello Watch!"])
}
Dies funktioniert, wenn es eine Verbindung zwischen der Uhr und dem iPhone. Wenn die App nicht läuft, startet das System sie im Hintergrund.
Ich weiß nicht, ob das System lange genug wartet, bis Sie Ihre Daten von iCloud empfangen, aber dieses Beispiel auf jeden Fall die App aufwacht.
Wo auf der iOS-App-Code setzen Sie WCSession up? – ccjensen
Ich habe in den AppDelegate -init-Methoden eingerichtet. Ich dachte, es sollte entweder ViewDidLoad in UIViewController oder Init richtig sein? –
Ja, das klingt gut. Ich nehme an, die Nachricht, die Sie senden, ist ziemlich klein? Wenn ja, schwer zu sagen, was ohne den ganzen Code falsch sein könnte. Vielleicht einen Fehler bei Apple einreichen? – ccjensen