所以我正在使用 Watch Connectivity 来请求从 iPhone 到 Watch 的数组。
想法是从 watch sendMessage
,iPhone 将在didReceiveMessage
方法中回复数组。
但是iPhone似乎没有响应,我以为当我从Watch发送消息时iPhone会打开应用程序。我什至尝试在 sendMessage
时打开应用程序,但仍然没有成功。当我等待足够长的时间时,我收到以下错误消息:
Error Domain=WCErrorDomain Code=7012 "Message reply took too long." UserInfo={NSLocalizedDescription=Message reply took too long., NSLocalizedFailureReason=Reply timeout occured.}
有人知道我可能哪里出错了吗?
苹果 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 is reachabe Array nil
iPhone 应用程序代理
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 中没有任何内容正在执行。即使我手动打开应用程序。
最佳答案
如果您希望 watch 发送的消息的回复包含所请求的数据,您应该将代码更改为以下内容:
观看
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)
}
另外, watch 未收到来自手机的 sendMessage 的原因是您为正在使用的 sendMessage 调用实现了错误的委托(delegate)方法。
如果您使用 nil replyHandler 调用 sendMessage,那么此委托(delegate)方法将在接收方调用:
func session(session: WCSession, didReceiveMessage message: [String : AnyObject])
如果您使用 非 nil replyHandler 调用 sendMessage,那么此委托(delegate)方法将在接收方调用:
func session(session: WCSession, didReceiveMessage 消息: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)
关于ios - 错误 : "Message reply took too long" - WCSession Watch OS2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35160934/