Episode #252
Watch Connectivity
Series: Up to Speed with watchOS

Episode #252
This episode was authored by Conrad Stoll.
import WatchConnectivity
let session = WCSession.default()
session.delegate = self
if session.activationState != .activated {
session.activate()
return
}
var context = session.applicationContext
context["beers"] = arrayOfBeerDictionaries()
do {
try session.updateApplicationContext(context)
} catch let error {
print(error)
}
public func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
if activationState == .activated {
// Send Data If Necessary
}
}
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
if let arrayOfDictionaries = applicationContext["key"] as? [[String : AnyObject]] {
}
}
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
for task in backgroundTasks {
if let watchConnectivityBackgroundTask = task as? WKWatchConnectivityRefreshBackgroundTask {
handleWatchConnectivityBackgroundTask(watchConnectivityBackgroundTask)
} else {
handleRefreshTask(task)
}
}
completeAllTasksIfReady()
}
var watchConnectivityBackgroundTasks: [WKWatchConnectivityRefreshBackgroundTask] = []
override init() {
super.init()
let session = WCSession.default()
// https://developer.apple.com/library/content/samplecode/QuickSwitch/Listings/QuickSwitch_WatchKit_Extension_ExtensionDelegate_swift.html
session.addObserver(self, forKeyPath: "activationState", options: [], context: nil)
session.addObserver(self, forKeyPath: "hasContentPending", options: [], context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
DispatchQueue.main.async {
self.completeAllTasksIfReady()
}
}
func completeAllTasksIfReady() {
let session = WCSession.default()
// the session's properties only have valid values if the session is activated, so check that first
if session.activationState == .activated && !session.hasContentPending {
watchConnectivityBackgroundTasks.forEach { $0.setTaskCompleted() }
watchConnectivityBackgroundTasks.removeAll()
}
}
WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate: Date(timeIntervalSinceNow: 60 * 5), userInfo: nil) { (error) in
}
let session = WCSession.default()
session.sendMessage(["message" : "refreshRequest"], replyHandler: { (items : [String : Any]) in
if let array = items["beers"] as? [[String : AnyObject]] {
self.handleArrayOfBeers(array: array)
}
}) { (_) in
}
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
if let message = message["message"] as? String, message == "refreshRequest" {
replyHandler(["beers" : arrayOfBeerDictionaries()])
}
}
This episode uses Watchos 3, Xcode 8.2.