3

我需要从userDefaultsApple Watch 应用程序中获取一个数字以进行一些计算,我正在使用 WatchConnectivity 框架来获取这条信息,但我不喜欢我现在拥有它的方式是手机仅在加载 iPhone 应用程序 (viewDidLoad) 时将数据发送到 Watch,换句话说,我启动 Watch 应用程序需要打开 iPhone 应用程序才能将数据发送到 Apple Watch。

是否可以在 iPhone 不活动时从 iPhone 获取数据?

这是我正在使用的代码:

iOS 视图控制器

class ViewController: UIViewController, WCSessionDelegate {
    var session: WCSession!

    override func viewDidLoad() {
        super.viewDidLoad()

        if WCSession.isSupported() {
            session = WCSession.default()
            session.delegate = self
            session.activate()
        }
    }

    func session(_ session: WCSession, activationDidCompleteWith activationState:WCSessionActivationState, error: Error?) {}
    func sessionDidDeactivate(_ session: WCSession) { }
    func sessionDidBecomeInactive(_ session: WCSession) { }

    func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
        // Reply to watch with data from user defaults
        replyHandler(["dataFromiPhone": readDoubleFromUserDefaults()])
    }
}

WatchOS 接口控制器

class InterfaceController: WKInterfaceController, WCSessionDelegate{

    var session: WCSession!

    var myNumber:Double = 0

    override func willActivate() {
        super.willActivate()

        if (WCSession.isSupported()) {
            session = WCSession.default()
            session.delegate = self
            session.activate()
        }
        getDataFromiPhone()
    }

    override func didDeactivate() {
        super.didDeactivate()
    }
    /// Delegate required method
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}

    func getDataFromiPhone(){
        //Send Message to phone - I'm not sure if I need this message
        let messageToSend = ["askiPhone":"Hi Phone, send me data from userDefaults."]
        session.sendMessage(messageToSend, replyHandler: { replyMessage in
            /// handle the reply
            let dataFromPhone = replyMessage["dataFromiPhone"] as? String
            DispatchQueue.main.async {
                self.myNumber = Double(dataFromPhone!)!
            }
        }, errorHandler: {error in
            /// catch any errors here
            print("ERROR: \(error)")
        })
    }
}
4

1 回答 1

1

我建议为此使用应用程序组。在“功能”下为您的应用程序的目标和手表扩展程序的目标添加一个应用程序组:

添加应用组 然后设置您UserDefaults使用该应用程序组:

let appGroupName = "group.mobilemind.SpeedDial"
let appGroupUserDefaults = UserDefaults(suiteName: appGroupName)!

appGroupUserDefaults.set(NSNumber(value: newValue), forKey: "hasRated")
appGroupUserDefaults.synchronize()

在应用程序和手表扩展上使用UserDefaults这种方式,两者都将能够获取和设置应UserDefaults​​用程序组。

编辑

此方法不适用于 WatchOS 2.0+。但是,这种方法仍然适用于其他类型的应用程序扩展。

于 2016-12-12T18:33:28.457 回答