Forked from NatashaTheRobot/WatchConnectivitySingletonDemo.swift
Last active
September 17, 2015 11:21
-
-
Save speaktoalvin/c3d0e92140a4ce4dca93 to your computer and use it in GitHub Desktop.
WatchConnectivity Singleton Demo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// WatchSessionManager.swift | |
// WatchConnectivityDemo | |
// | |
// Created by Natasha Murashev on 9/3/15. | |
// Copyright © 2015 NatashaTheRobot. All rights reserved. | |
// | |
import WatchConnectivity | |
class WatchSessionManager: NSObject, WCSessionDelegate { | |
static let sharedManager = WatchSessionManager() | |
private override init() { | |
super.init() | |
} | |
private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil | |
private var validSession: WCSession? { | |
// paired - the user has to have their device paired to the watch | |
// watchAppInstalled - the user must have your watch app installed | |
// Note: if the device is paired, but your watch app is not installed | |
// consider prompting the user to install it for a better experience | |
if let session = session where session.paired && session.watchAppInstalled { | |
return session | |
} | |
return nil | |
} | |
func startSession() { | |
session?.delegate = self | |
session?.activateSession() | |
} | |
} | |
// MARK: Application Context | |
// use when your app needs only the latest information | |
// if the data was not sent, it will be replaced | |
extension WatchSessionManager { | |
// Sender | |
func updateApplicationContext(applicationContext: [String : AnyObject]) throws { | |
if let session = validSession { | |
do { | |
try session.updateApplicationContext(applicationContext) | |
} catch let error { | |
throw error | |
} | |
} | |
} | |
// Receiver | |
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) { | |
// handle receiving application context | |
dispatch_async(dispatch_get_main_queue()) { | |
// make sure to put on the main queue to update UI! | |
} | |
} | |
} | |
// MARK: User Info | |
// use when your app needs all the data | |
// FIFO queue | |
extension WatchSessionManager { | |
// Sender | |
func transferUserInfo(userInfo: [String : AnyObject]) -> WCSessionUserInfoTransfer? { | |
return validSession?.transferUserInfo(userInfo) | |
} | |
func session(session: WCSession, didFinishUserInfoTransfer userInfoTransfer: WCSessionUserInfoTransfer, error: NSError?) { | |
// implement this on the sender if you need to confirm that | |
// the user info did in fact transfer | |
} | |
// Receiver | |
func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { | |
// handle receiving user info | |
dispatch_async(dispatch_get_main_queue()) { | |
// make sure to put on the main queue to update UI! | |
} | |
} | |
} | |
// MARK: Transfer File | |
extension WatchSessionManager { | |
// Sender | |
func transferFile(file: NSURL, metadata: [String : AnyObject]) -> WCSessionFileTransfer? { | |
return validSession?.transferFile(file, metadata: metadata) | |
} | |
func session(session: WCSession, didFinishFileTransfer fileTransfer: WCSessionFileTransfer, error: NSError?) { | |
// handle filed transfer completion | |
} | |
// Receiver | |
func session(session: WCSession, didReceiveFile file: WCSessionFile) { | |
// handle receiving file | |
dispatch_async(dispatch_get_main_queue()) { | |
// make sure to put on the main queue to update UI! | |
} | |
} | |
} | |
// MARK: Interactive Messaging | |
extension WatchSessionManager { | |
// Live messaging! App has to be reachable | |
private var validReachableSession: WCSession? { | |
if let session = validSession where session.reachable { | |
return session | |
} | |
return nil | |
} | |
// Sender | |
func sendMessage(message: [String : AnyObject], | |
replyHandler: (([String : AnyObject]) -> Void)? = nil, | |
errorHandler: ((NSError) -> Void)? = nil) | |
{ | |
validReachableSession?.sendMessage(message, replyHandler: replyHandler, errorHandler: errorHandler) | |
} | |
func sendMessageData(data: NSData, | |
replyHandler: ((NSData) -> Void)? = nil, | |
errorHandler: ((NSError) -> Void)? = nil) | |
{ | |
validReachableSession?.sendMessageData(data, replyHandler: replyHandler, errorHandler: errorHandler) | |
} | |
// Receiver | |
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { | |
// handle receiving message | |
dispatch_async(dispatch_get_main_queue()) { | |
// make sure to put on the main queue to update UI! | |
} | |
} | |
func session(session: WCSession, didReceiveMessageData messageData: NSData, replyHandler: (NSData) -> Void) { | |
// handle receiving message data | |
dispatch_async(dispatch_get_main_queue()) { | |
// make sure to put on the main queue to update UI! | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment