iAn*_*kit 0 ios watchconnectivity wcsession swift3
当我运行在Xcode iOS和watchOS模拟器的手表连接的应用程序,WCSession委托方法didReceiveApplicationContext仅适用于第一次,但随后它不叫,并在接口控制器没什么变化。谁能解释一下为什么会发生这种情况?
下面是 UIViewController 的 WCSessionVC 类
import Foundation
import UIKit
import WatchConnectivity
class WCSessionVC: UIViewController, WCSessionDelegate {
let session = WCSession.default
override func viewDidLoad() {
super.viewDidLoad()
session.delegate = self
session.activate()
}
func updateApplicationContext(applicationContext: [String : Any]) throws {
if WCSession.default.isPaired {
do {
try WCSession.default.updateApplicationContext(applicationContext)
} catch let error {
throw error
}
}
}
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
print("Session activated")
let message = ["quote": "Hello"]
do {
try self.updateApplicationContext(applicationContext: message as [String : Any])
}
catch {
print(error)
}
}
}
Run Code Online (Sandbox Code Playgroud)
下面是 WKInterfaceController 的 InterfaceController 类
import WatchKit
import Foundation
import WatchConnectivity
class InterfaceController: WKInterfaceController, WCSessionDelegate {
@IBOutlet var lblUserId: WKInterfaceLabel!
var watchSession: WCSession? {
didSet {
if let session = watchSession {
session.delegate = self
session.activate()
}
}
}
override func awake(withContext context: Any?) {
super.awake(withContext: context)
if let session = watchSession {
session.delegate = self
session.activate()
}
// Configure interface objects here.
}
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
//loadDataFromDatastore()
watchSession = WCSession.default
}
override func didDeactivate() {
// This method is called when watch view controller is no longer visible
super.didDeactivate()
}
//MARK: Delegate Methods
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
watchSession?.activate()
print("Session activation did complete")
}
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {
DispatchQueue.main.async {
print("watch received app context: ", applicationContext)
if let data = applicationContext["quote"] as? String {
self.lblUserId.setText(data)
}
}
}
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
print(message)
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的原因是因为updateApplicationContext只有在应用程序上下文字典的内容发生变化时才会触发。在苹果的文档描述它作为(重点是我的):
使用 updateApplicationContext(_:) 方法将最近的状态信息传达给对方。当对方醒来时,它可以使用此信息来更新自己的状态。例如,支持后台应用刷新的 iOS 应用可以使用其部分后台执行时间来更新相应的 Watch 应用。此方法会覆盖之前的数据字典,因此当您的应用程序仅需要最近的数据值时,请使用此方法。
所以把它想象成一个属性设置器方法,它只在值实际发生变化时触发 KVO。此处接收方委托方法仅在字典内容更改时触发,因此在上面的示例中,如果更改此行:
let message = ["quote": "Hello"]
Run Code Online (Sandbox Code Playgroud)
是这样的:
let message = ["quote": "Hello", "date": NSDate()]
Run Code Online (Sandbox Code Playgroud)
您会看到接收方委托每次都会收到一个回调。
| 归档时间: |
|
| 查看次数: |
686 次 |
| 最近记录: |