【问题标题】:Check if Apple Watch is not currently connected检查 Apple Watch 当前是否未连接
【发布时间】:2020-10-03 10:07:40
【问题描述】:

我正在尝试使用此代码检测用户的 Apple Watch 当前是否处于活动状态:

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

但即使在我关闭手表电源后,我还是会收到带有 activationState == .activated 的回调到 session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?)

这是预期的吗?有什么方法可以实际检查手表和 iPhone 是否连接?

编辑:我还注意到,如果我在模拟器中运行相同的代码,我会得到完全相同的回调,activationState == .activated,但 isPaired == false。在我看来,.activated 基本上是默认状态。我什至不知道如何获得.deactivated

编辑 2:我实际上没有 WatchKit 扩展,为了简单起见,我宁愿不创建一个。我只是想检测配对的手表是否在范围内、开机并进行通信,以便判断我的应用程序本地通知是否可以发送到手表。

【问题讨论】:

    标签: ios watchkit apple-watch


    【解决方案1】:

    编辑

    我明白你现在在问什么。问题是,如果您检查isPaired,即使应用程序已启动且手表未连接,您也会得到正确的结果。

    例子:

    import WatchConnectivity
    
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
        if WCSession.isSupported() {
          let session = WCSession.default
          session.delegate = self
          session.activate()
        }
    
        return true
      }
    }
    
    extension AppDelegate: WCSessionDelegate {
      func session(
        _ session: WCSession,
        activationDidCompleteWith activationState: WCSessionActivationState,
        error: Error?) {
    
        switch session.activationState {
    
        case .notActivated:
          print("Session no activated")
        case .inactive:
          print("Session inactive")
        case .activated:
          print("Session activated")
        @unknown default:
          break
        }
    
        if let err = error {
          print("ERROR: \(err.localizedDescription)")
        }
    
        if session.isPaired {
          print("Current phone is paired to an apple watch!")
        }
    
        print("reachable: \(session.isReachable)")
      }
    
      func sessionDidBecomeInactive(_ session: WCSession) {
        print("Session just became inactive")
      }
    
      func sessionDidDeactivate(_ session: WCSession) {
        print("session did deactivate")
      }
    }
    

    这会在手表开机或关机时产生以下输出

    Session activated
    Current phone is paired to an apple watch!
    reachable: false
    

    注意isReachable 始终为假,因为您没有手表扩展。

    查看this question 没有解决这个问题的办法。我认为如果没有手表扩展程序/应用程序,您无法确定此信息。

    另请注意,您无法在手表应用程序之外访问WKInterfaceDevice

    【讨论】:

    • 谢谢。所以 isPaired 确实会告诉我手表是否已配对,但如果它存在并连接到手机则不会。我试过 isReachable 但它总是返回 false,即使手表已连接,可能是因为我没有 WatchKit 扩展。我只是想检测是否存在手表。我编辑了我的问题以澄清。
    • 抱歉,想了解一下...isPaired 和“当前并连接到手机”有什么区别?看看这些问题12
    • 根据我的测试,isPaired 标志仅表示用户在过去某个时间点将手机与手表配对。它不会告诉您手表是否在手机附近通电 - 即使手机已关闭或超出无线电范围,isPaired 也会返回 true。我正在寻找手机是否主动连接到手表的指标。 (iOS 手表应用在 UI 中有这个指示器)
    【解决方案2】:

    您正在寻找:isPairedWCSession 的属性。

    调用activateSession并获得回调后,您可以检查Watch是否在那里配对。

    如果您需要了解 Watch 上是否安装了应用 - 请查看 isWatchAppInstalled

    【讨论】:

    • 谢谢,isPaired 确实告诉我手机是否与手表配对,但我想知道该手表是否存在并处于活动状态。请参阅有问题的编辑以澄清。
    • @davidgyoung isPaired 就是这样
    • 不幸的是,我的测试表明无论手机是物理存在还是开机,isPaired 都会返回 true。
    猜你喜欢
    • 1970-01-01
    • 2022-07-27
    • 2015-03-03
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多