代码之家  ›  专栏  ›  技术社区  ›  Dávid Pásztor

我如何使用WatchConnectivity在iOS和Watch应用程序之间共享信息?

  •  10
  • Dávid Pásztor  · 技术社区  · 8 年前

    [免责声明:此问题旨在成为一个维基问题,以回答有关在iOS和watch应用程序之间发送数据的常见问题 watchkit watch-os 标签。]

    我正在开发一款Apple Watch应用程序,希望在 iOS 应用程序及其 WatchKit extension WatchConnectivity 框架,但并不真正理解其所有方法之间的差异。

    如果我想在我的应用程序处于后台时也能发送数据,我应该使用哪个功能?

    1 回复  |  直到 8 年前
        1
  •  19
  •   Dávid Pásztor    8 年前

    在撰写本答案时( watchOS3 是当前的稳定释放和 watchOS4 处于测试阶段),是 直接的 iOS 应用程序及其 WatchKit extension WatchConnectivity 框架( 我说直接,因为这个Q&A不关心使用云技术,例如 CloudKit )

    首先,让我们讨论 WCSession

    在深入了解细节之前,请快速了解每个功能以及何时使用这些功能:

    • updateApplicationContext :在应用程序之间同步状态,发送要在UI上显示的数据(仅用于发送小块数据)
    • transferUserInfo :在后台发送数据字典
    • transferFile
    • sendMessage :在至少一个正在前台运行的手表应用程序之间发送即时消息

    详细说明

    updateApplicationContext(_:) updateApplicationContext 。系统尝试在适当的时间调用此函数,以便在需要时接收数据,同时最大限度地减少功耗。因此,当两个应用程序都不在前台运行时,可以调用该函数,但是 updateApplicationContext 相反

    transferUserInfo( :) transferCurrentComplicationUserInfo(:) transferCurrentComplicationUserInfo 手表套件扩展 使用高优先级消息并唤醒 WatchKit app transferUserInfo 作用

    transferFile(_:metadata:) transferUserInfo ,但它接受fileURL而不是字典作为其输入参数,因此应使用它将设备的本地文件发送给对应的设备。后续呼叫排队。必须将收到的文件保存到 session(_:didReceive:) 方法,否则将删除它们。

    sendMessage( :replyHandler:errorHandler:) sendMessageData(:replyHandler:errorHandler:)

    有关更多信息,请参阅 App programming guide for watchOS - Sharing Data

    下面是一些代码示例:

    设置 WatchConnectivity 网间网操作系统 应用程序的 AppDelegate

    import UIKit
    import WatchConnectivity
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            if WCSession.isSupported() {
                let session = WCSession.default()
                session.delegate = self
                session.activate()
            }
            return true
        }
    }
    
    extension AppDelegate: WCSessionDelegate {
    
        func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
            print("Message received: ",message)
        }
    
        //below 3 functions are needed to be able to connect to several Watches
        func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
    
        func sessionDidDeactivate(_ session: WCSession) {}
    
        func sessionDidBecomeInactive(_ session: WCSession) {}
    }
    

    让你的 WatchKit WCSessionDelegate :

    extension InterfaceController: WCSessionDelegate {
        func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
    }
    

    使用即时消息功能, 发送消息 :

    WatchKit应用程序 当您想立即将信息发送到 网间网操作系统

    if WCSession.isSupported() {
        print("WCSession supported")
        let session = WCSession.default()
        session.delegate = self
        session.activate()
        if session.isReachable {
            session.sendMessage(["Instant":"Message"], replyHandler: nil, errorHandler: { error in
                print("Error sending message",error)
            })
        }
    }