【问题标题】:WKExtension state and sendMessage for Live messaging用于实时消息传递的 WKExtension 状态和 sendMessage
【发布时间】:2017-11-04 15:17:39
【问题描述】:

我正在开发一个需要与 iOS 应用程序通信的 WatchApp,并且我正在使用 Watch Connectivity fwk 来做到这一点。

每次用户显示我的 WatchApp 时,我都需要从 iOS 应用程序中获取一组必须在 Watch 上显示的新数据。

为了获取这些数据,我正在使用 sendMessage(_:replyHandler:errorHandler:) 但有时这种通信似乎无法正常工作,因为我的 WatchApp 没有更新。 从 Xcode 启动 WatchApp 时我没有问题,只有在我在现实生活中使用它时才会出现问题。

每次我的WatchApp回调时,我都会触发WatchApp和iOS App之间的同步:

  • WKInterfaceController.willActivate()(我只有一个Controller)
  • WCSessionDelegate.session(WCSession, didReceiveApplicationContext:
    [String : Any])
    当activationState == .activated 时
  • WCSessionDelegate.sessionReachabilityDidChange(WCSession)
    会话可达

在 2015 年 WWDC 的“Introducing Watch Connectivity”视频中,演讲者告诉在向 iOS 应用发送交互式消息时,WatchKit 扩展程序必须在前台运行。

这是否意味着我需要在调用 sendMessage(_:replyHandler:errorHandler:) 之前检查 WKExtention.shared().applicationState == .active,在添加 WCSession.activationState == .activated

当我的 WatchApp 在 Dock 中并且用户显示 Dock 时,我的 WatchApp 有 WKExtension.shared().applicationState == .inactiveWKExtension.shared().isApplicationRunningInDock == true,我可以使用 sendMessage(_:replyHandler:errorHandler:) 在这种状态下更新我的应用程序吗?

我只是想知道在使用 sendMessage(_:replyHandler:errorHandler:) 之前需要检查哪些条件。

谢谢,

【问题讨论】:

    标签: ios watchkit wcsession watchos-4 wkextension


    【解决方案1】:

    当我发送手表连接消息时,我总是检查 session.activationState == .activated && session.isReachable。此外,我通常会发送初始消息并等待手机响应,然后再请求数据。由于某种原因,这似乎使响应比最初请求数据更可靠。这是一个例子

    func sendActivationMessage() {
        if session.activationState == .activated && session.isReachable {
            session.sendMessage(["Watch Message" : "Activate"], replyHandler: { (reply) in
    
                // Send message requesting data
    
            }, errorHandler: { (error) in
    
                print("***** Error Did Occur: \(error) *****")
            })
        } else {
            print("***** Activation Error *****")
        }
    }
    

    如果 print("***** Activation Error *****") 被调用,那么您就知道电话无法接通。

    【讨论】:

    • 感谢您的回复!根据我的最新经验,我认为测试 activationState 和 isReachable 是不够的,因为可能会发生会话已激活且可访问但 WatchApp 正在后台运行(WKExtension applicationState != active)的情况。 sendMessage(replyHandler:error:) 用于交互式消息,它假设 WatchApp 正在前台运行(我对 WWDC 视频的理解)。我已经完成了更改,在 sendMessage() 之前检查 WatchApp 是否在前台,并且自超过 24 小时以来它似乎运行良好。拭目以待……
    猜你喜欢
    • 2021-09-04
    • 2015-09-09
    • 1970-01-01
    • 2015-11-20
    • 2015-12-20
    • 2012-04-03
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多