我正在尝试让iOS应用程序与手表进行通信,但我一直都会遇到不一致的行为 - 通信速度太慢,或根本没有传输任何数据。
此外,当watchKit运行时,我看不到任何“Phone disabled”屏幕(导致崩溃,因为我需要先从手机获取数据)。
这就是我在iPhone应用程序中建立WCSession的方法
应用代表
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if NSClassFromString("WCSession") != nil {
if #available(iOS 9.0, *) {
if(WCSession.isSupported()){
self.session = WCSession.defaultSession()
self.session.delegate = self
self.session.activateSession()
if session.paired {
print("Watch connected")
} else {
print("No watch")
}
}
} else {
}}
if NSClassFromString("WCSession") != nil {
if(WCSession.isSupported()){
session.sendMessage(["b":"delegateSaysHi"], replyHandler: nil, errorHandler: nil)
}}
}
MainViewController (viewDidLoad中)
if NSClassFromString("WCSession") != nil {
if(WCSession.isSupported()){
self.session = WCSession.defaultSession()
self.session.delegate = self
self.session.activateSession()
if session.paired {
print("Watch connected")
} else {
print("No watch")
}
}}
MainViewController (将一堆数据从iOS应用程序传输到watchKit应用程序的方法)
func transferData(){
do {
let dataArray = ["somedata": array2d1]
try WCSession.defaultSession().updateApplicationContext(dataArray)
let dataArray1 = ["somedata1": array2d2]
try WCSession.defaultSession().updateApplicationContext(dataArray1)
let dataArray2 = ["somedata2": array2d3]
try WCSession.defaultSession().updateApplicationContext(dataArray2)
let dataArray3 = ["somedata3": array2d4]
try WCSession.defaultSession().updateApplicationContext(dataArray3)
// and up to 12
}
catch {
print("Something wrong happened")
}
}
这适用于watchKit app
应用代表
func applicationDidFinishLaunching() {
if(WCSession.isSupported()){
self.session = WCSession.defaultSession()
self.session.delegate = self
self.session.activateSession()
}
}
func applicationDidBecomeActive() {
if(WCSession.isSupported()){
self.session.sendMessage(["b":"peek"], replyHandler: nil, errorHandler: nil)
}
InterfaceController (awakeWithContext)
if(WCSession.defaultSession().reachable){
self.session.sendMessage(["b":"peek"], replyHandler: nil, errorHandler: nil)
}
接收ApplicationContext数据的方法
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
dispatch_async(dispatch_get_main_queue()) { () -> Void in
if let retrievedArray1 = applicationContext["somedata"] as? [[String]] {
self.watchAppArray = retrievedArray1
}
if let retrievedArray2 = applicationContext["somedata2"] as? [[String]] {
self.watchAppArray = retrievedArray1
// and so on for 12 arrays sent from phone
}
}
}}
非常欢迎任何有关清除情况的建议!
谢谢。
答案 0 :(得分:1)
多个代表/激活:
您在应用的不同部分重复设置,委派和激活会话。您不断更改代理,因此在将处理委派给应用的其他部分后,将不再使用应用程序的某个部分中的代码。
您应该在整个应用中使用单个会话/代理。一种解决方案是设置一个{app}范围内可用的WCSession
单例。这里的a guide引导您完成整个过程。
只会发送最新的应用程序上下文:
通过尝试排队多个应用程序上下文请求,当系统开始传输它时,较早的那些请求将不再在队列中,因为系统已经用后者替换了前面的上下文。所以只有最后一个(dataArray3
)才能传播。
使用updateApplicationContext:error:方法将最近的状态信息传递给对方。当对方醒来时,它可以使用此信息来更新自己的状态。 ... 此方法会覆盖以前的数据字典,因此当您的应用只需要最新的数据值时,请使用此方法。
如果所有数组都代表了应用程序的最新状态,那么您希望将它们一起传输到一个字典中。
var dataArray = [String: AnyObject]()
dataArray["somedata"] = array2d1
dataArray["somedata1"] = array2d2
dataArray["somedata2"] = array2d3
dataArray["somedata3"] = array2d4
do {
try session.updateApplicationContext(dataArray)
}
catch {
print(error)
}
为sendMessage
代码添加一些错误处理也可能会有所帮助,因为配对的设备可能无法始终可以访问。
沟通缓慢:
至于沟通太慢,手头有两个问题。
转移可能不会立即发生。
当只有一个会话处于活动状态时,活动会话仍可以发送更新和传输文件,但这些传输在后台机会性地发生。
请记住,后台转移不会立即发送。系统尽可能快地发送数据,但传输不是即时的,系统可能会略微延迟传输以提高功耗。此外,发送大型数据文件需要相应的时间将数据传输到另一个设备并在接收端处理它。
您发送的数据越多,传输/接收所有数据的时间就越长。
发送消息时,仅发送应用所需的数据。所有传输都涉及将数据无线发送到对应应用程序,这会消耗功率。而不是每次都发送所有数据,而只发送已更改的项目。
您可以控制发送的数据量,以及数据是以交互方式发送还是在后台发送。如果手表可以访问,您可以使用sendMessage
进行即时通信。如果无法访问,您可以使用后台方法。