ios - 重新启动 Apple Watch WCSession 'isRechable' 后每次都返回 false
问题描述
我想在手表应用程序中显示来自 firebase 实时数据库的数据。我有一种方法可以从 iOS 父应用程序中的 firebase 获取数据。我从手表应用程序向 iOS 父应用程序发送消息,iOS 父应用程序将从 firebase 获取数据并使用该数据回复手表应用程序。
在 iOS 父 App 中激活 WCSession 如下,
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Watch Connectivity setup
if WCSession.isSupported() {
let session = WCSession.default
session.delegate = self
session.activate()
}
return true
}
在 Watch Extension 的 ExtensionDelegate 中以同样的方式激活会话,
ExtensionDelegate.swift
func applicationDidFinishLaunching() {
// Perform any final initialization of your application.
if WCSession.isSupported() {
let session = WCSession.default
session.delegate = self
session.activate()
}
}
现在在 InterfaceController 类中向 iOS 父应用发送消息并获取数据作为回复。
接口控制器.swift
override func awake(withContext context: Any?) {
super.awake(withContext: context)
getData()
}
func getData() {
if WCSession.default.isReachable {
session.sendMessage(["Request": "GetData"], replyHandler: { (dictReply) in
print(dictReply)
}) { (error) in
print(error)
}
} else {
let action = WKAlertAction(title: "Ok", style: .cancel) {
}
self.presentAlert(withTitle: "Error", message: "iPhone is not reachable, try reconnecting watch with iPhone and try again.", preferredStyle: .alert, actions: [action])
}
}
在 iOS 父应用程序中处理接收到的消息并作为字典发送数据作为回复。
AppDelegate.swift
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
guard let request = message["Request"] as? String else {
replyHandler([:])
return
}
switch request {
case "GetData":
// Call method to get data from firebase realtime database and send response dictionary in replyHandler for demo purpose currently passed test data
replyHandler(["test" : "Hello..!!!"])
default:
replyHandler([:])
}
}
现在第一次在设备中运行时它工作正常,在重新启动 Apple Watch 后打开手表应用程序并在警报“iPhone 无法访问,尝试将手表与 iPhone 重新连接并重试”中给我错误。这意味着 WCSession.default.isReachable 每次都返回 false。应用程序卡在这里,只是在 Apple Watch 上显示黑屏。
另外,如果我从 xcode 运行应用程序,那么它每次都可以工作。
我正在使用 iPhone 8 和 Apple Watch 系列 1
解决方案
推荐阅读
- ios - Firebase - 使用未声明的标识符“FIRAnalyticsConfiguration”
- azure-devops - 授权我的 Angular 应用程序中的用户访问 Azure DevOps REST API 服务
- python-3.x - 使用openCV打开网络摄像头并每五秒用它拍照
- capybara - Rails Minitest / Capybara - 为 JS 界面元素添加系统集成测试
- airflow - 应该如何在 Airflow 挂钩中处理类似 REST 的 API 错误?
- python - 美丽的汤 - 获取所有元素
- r - 如何在弹出窗口打开时保持背景元素可用
- swift - 可以简化此 Swift 代码以删除空协议和空类吗?
- css - 更改 Django 用户表单的标签颜色
- protractor - 如果测试被跳过/挂起,量角器会以 retcode 1 退出