Ошибка: "Ответ на сообщение занял слишком много времени" - WCSession Watch OS2
Поэтому я использую Watch Connectivity для запроса массива с iPhone на часы.
Идея заключалась в том, чтобы sendMessage
от часов, и iPhone ответит с массивом в пределах didReceiveMessage
метод.
Однако iPhone, похоже, не отвечает, я думал, что iPhone откроет приложение, когда я отправлю сообщение из Watch. Я пытался даже открыть приложение, когда я sendMessage
но все равно не повезло. Когда я жду достаточно долго, я получаю следующее сообщение об ошибке:
Ошибка домена = код WCErrorDomain =7012 "Ответ на сообщение занял слишком много времени". UserInfo={NSLocalizedDescription= Ответ на сообщение занял слишком много времени., NSLocalizedFailureReason= Истекло время ожидания ответа.}
Кто-нибудь знает, где я могу пойти не так?
Apple Watch
import WatchKit
import Foundation
import CoreData
import WatchConnectivity
class BookmarkedInterfaceController: WKInterfaceController, WCSessionDelegate {
var session : WCSession!
var objects: [AnyObject]!
@IBOutlet var table: WKInterfaceTable!
override func willActivate() {
super.willActivate()
//Check if session is supported and Activate
if (WCSession.isSupported()) {
session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
sendMessageToIphone()
}
func sendMessageToIphone() {
if WCSession.defaultSession().reachable {
print("WCSession is reachabe")
let messageDict = ["Request": "iPhone Can You Give Me The Array"]
WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
print(replyDict)
}, errorHandler: { (error) -> Void in
print(error)
})
}
}
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
//recieving message from iphone
print("recieved message from iphone \(message)")
objects.append(message["Array"]!)
print("Objects array = \(objects)")
}
Консольные выходы
WCSession является недостижимым массивом ноль
iPhone App Delegate
import UIKit
import CoreData
import WatchConnectivity
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {
var window: UIWindow?
var session : WCSession!
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//Check if session is supported and Activate
if (WCSession.isSupported()) {
session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
}
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
print("did recieve message from Watch")
let applicationData = ["Array":["One", "Two", "Three"]]
replyHandler(applicationData)
}
Ничего с iPhone не выполняется. Даже когда я вручную открываю приложение.
2 ответа
Если вы хотите, чтобы ответ на сообщение, которое отправили часы, содержал запрошенные данные, вы должны изменить свой код на следующий:
Часы
func sendMessageToIphone() {
if WCSession.defaultSession().reachable {
print("WCSession is reachabe")
let messageDict = ["Request": "iPhone Can You Give Me The Array"]
WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
print("Array \(replyDict["array"])")
}, errorHandler: { (error) -> Void in
print(error)
})
}
}
Телефон
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
print("did recieve message from Watch")
let applicationData = ["Array":["One", "Two", "Three"]]
//If identifier from recievedMessage is for Objects
replyHandler(applicationData)
}
И отдельно, причина, по которой sendMessage с телефона не принимается часами, заключается в том, что вы реализовали неправильный метод делегата для используемого вами вызова sendMessage.
Если вы вызываете sendMessage с нулевым replyHandler, то этот метод делегата будет вызван на принимающей стороне:func session(session: WCSession, didReceiveMessage message: [String : AnyObject])
Если вы вызываете sendMessage с отличным от nil replyHandler, то этот метод делегата будет вызван на принимающей стороне:func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)
Вы должны активировать сеанс перед отправкой сообщения. Также вы должны установить делегата перед активацией сеанса, потому что вы можете потерять некоторые ожидающие сообщения.
сторона iphone:
import UIKit
import WatchConnectivity
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {
var window: UIWindow?
var session : WCSession!
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
print("did recieve message from Watch")
let applicationData = ["Array":["One", "Two", "Three"]]
//If identifier from recievedMessage is for Objects
session.sendMessage(applicationData, replyHandler: { reply in
print("Got reply: \(reply)")
}, errorHandler: { error in
print("error: \(error)")
})
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
return true
}
}
Расширение iWatch InterfaceController Вы должны активировать сеанс в методе интерфейса контроллера willactivate.
import WatchKit
import Foundation
import WatchConnectivity
class InterfaceController: WKInterfaceController, WCSessionDelegate {
var session : WCSession!
var objects: [AnyObject]!
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
// Configure interface objects here.
}
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
objects = []
sendMessageToIphone()
}
override func didDeactivate() {
// This method is called when watch view controller is no longer visible
super.didDeactivate()
}
func sendMessageToIphone() {
if WCSession.defaultSession().reachable{
print("WCSession is reachabe")
let messageDict = ["Request": "iPhone Can You Give Me The Array"]
WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
print(replyDict)
}, errorHandler: { (error) -> Void in
print(error)
})
}
}
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
//recieving message from iphone
print("recieved message from iphone \(message)")
objects.append(message["Array"]!)
print("Objects array = \(objects)")
}
}
Заметка. Сначала запустите приложение iphone. Затем запустите расширение и держите приложение iphone на переднем плане.