- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试将 CoreData 数据从我的 iOS 应用程序获取到 watchOS 扩展程序。我正在使用 WatchConnectivity 框架通过 sendMessage(_ message: [String : Any], replyHandler: (([String : Any]) -> Void)?, errorHandler: ((Error) -> Void)? = nil)
函数。基本连接工作正常。可以访问 iOS 应用程序,如果我尝试回复示例词典,一切正常。
到目前为止一切顺利,但当我开始在后台对 iOS 应用程序执行提取请求时,Watch 应用程序从未接收到数据。过了一会儿,我收到了这个错误: Error while requesting data from iPhone: Error Domain=WCErrorDomain Code=7012 “Message reply too long.” UserInfo={NSLocalizedFailureReason=发生回复超时。, NSLocalizedDescription=消息回复时间过长。}
如果我在 iPhone 上打开 iOS 应用程序并重新启动 Watch 应用程序,回复处理程序就会得到结果。但是强制用户在 iPhone 上主动打开 iOS 应用是没有用的。
有人可以解释为什么会这样吗?正确的方法是什么?自 watchOS 2 以来,应用组似乎已过时。
我正在使用 Swift 4 顺便说一句……
在 Apple Watch 上:
import WatchConnectivity
class HomeInterfaceController: WKInterfaceController, WCSessionDelegate {
// (…)
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
session.sendMessage(["request": "persons"],
replyHandler: { (response) in
print("response: \(response)")
},
errorHandler: { (error) in
print("Error while requesting data from iPhone: \(error)")
})
}
在 iPhone 上:
import CoreData
import WatchConnectivity
class ConnectivityHandler: NSObject, WCSessionDelegate {
var personsArray:[Person] = []
// (…)
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
// only using the next line is working!
// replyHandler(["data": "test"])
if message["request"] as? String == "persons" {
fetchAllPersons()
var allPersons: [String] = []
for person in personsArray {
allPersons.append(person.name!)
}
replyHandler(["names": allPersons])
}
}
// this seems to be never executed (doesn't matter if it's in an extra function or right in the didReceiveMessage func)
func fetchAllPersons() {
do {
// Create fetch request.
let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()
// Edit the sort key as appropriate.
let sortDescriptor = NSSortDescriptor(key: #keyPath(Person.name), ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
personsArray = try DatabaseController.getContext().fetch(fetchRequest)
} catch {
fatalError("Failed to fetch: \(error)")
}
}
最佳答案
在研究了这个问题后,我自己找到了解决方案。问题是我正在使用 sendMessage(_:replyHandler:errorHandler:)
协议(protocol)。这仅用于在两个应用都处于事件状态时传输数据。
Use the
sendMessage(_:replyHandler:errorHandler:)
orsendMessageData(_:replyHandler:errorHandler:)
method to transfer data to a reachable counterpart. These methods are intended for immediate communication between your iOS app and WatchKit extension. The isReachable property must currently be true for these methods to succeed.
如果您想在后台传输数据,您必须根据需要使用 updateApplicationContext(_:)
或 transferUserInfo(_:)
。这正是我所需要的!
Use the
updateApplicationContext(_:)
method to communicate recent state information to the counterpart. When the counterpart wakes, it can use this information to update its own state. For example, an iOS app that supports Background App Refresh can use part of its background execution time to update the corresponding Watch app. This method overwrites the previous data dictionary, so use this method when your app needs only the most recent data values.Use the
transferUserInfo(_:)
method to transfer a dictionary of data in the background. The dictionaries you send are queued for delivery to the counterpart and transfers continue when the current app is suspended or terminated.
现在,如果 iPhone 应用对应方打开 ApplicationContext 或 UserInfo 队列,我可以将数据添加到我的核心数据库。
关于ios - 使用 WatchConnectivity 获取核心数据请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47734060/
我正在使用 WatchConnectivity 将图像从 iOS 传输到 Watch OS。在模拟器中调试时遇到问题 如我在(发件人端,即 iOS)中所见,文件已成功传输 public func se
我有一个 watchOS 应用程序,它使用 WatchConnectivity 框架在 Safari 中打开 URL。当我的应用程序在 iPhone 上运行并同时在 Apple Watch 上运行时,
我想在 Today Extension 中显示在 watch OS 2 应用程序上输入的数据,而无需先启动 iPhone 应用程序。 Today Extensions 是否支持通过 WatchConn
借助新的 Watch OS 2 和新的 Watch Connectivity,不再需要使用应用程序组在 watch 和 iOS 应用程序之间共享数据。但是如何避免应用程序和扩展程序中重复字符串呢? 例
我正在访问一个用户的联系人,以便将联系人姓名和生日从 iPhone 发送到 AppleWatch。我可以访问联系人并可以在手机上显示数据,但我无法使用 WatchConnectivity 发送信息。我
我目前正在尝试将 CoreData 数据从我的 iOS 应用程序获取到 watchOS 扩展程序。我正在使用 WatchConnectivity 框架通过 sendMessage(_ message:
我正在尝试使用 Swift 中的 WatchConnectivity API 在 Apple Watch(版本 2.0.1)和我的 iPhone(运行 iOS 9.1)之间建立连接。 我关注了this
我正在开发我的第一个 Apple Watch 应用程序(我的 iOS 应用程序的扩展)。我在将数据从一个 WKInterfaceController 发送到另一个时遇到了一个小问题。 我的第一个 Co
我一直在为 WCSession 使用 NatashaTheRobot 单例,但无法使 sendMessage 正常工作。 我的目标是从 Watch 应用程序向 iOS 应用程序发送一条消息,并将字典从
我希望我的复杂功能通过 Watch Connectivity 从 iPhone 获取数据。我正在使用 sendMessage 即时消息技术。 我不想在尝试获取数据时打开我的 iPhone 应用程序,因
当使用 WatchConnectivity 框架发送数据时,无论是从手机到 watch 还是反之亦然,在框架给我 WCErrorCodePayloadTooLarge 错误之前负载有多大? 我无法在
Apple 是否表明对于 sendMessage(_ message: [String : AnyObject]...) 从 watch 到 iPhone 的传输时间的实际预期是多少?对于单个字符串的
我正在尝试将数据从我的 iOS 应用发送到 Watch 应用。我为此使用 updateApplicationContext。 我有一个在 NSDictionary 中转换的 json 文件并尝试发送它
我正在尝试从 iOS -> Watch 发送数据,当事件 Controller 实现了 didReceiveApplicationContext 时,这工作正常。我可以接收上下文对象并且一切正常。 但
我试图将我的 swift 对象从 iOS 应用程序传递到 watch 。但是,我发现它适用于 NSString 等基本类型,但适用于我的自定义对象类型。 我的自定义对象能够转换为 NSData 我已经
我一直致力于从我的 iOS 应用向我的 WatchOS 发送 ApplicationContext 形式的 int notificationCount。 func session(_ session:
我正在开发我们应用程序的 WatchOS 2 版本,并且坚持这样一个事实,即我只能发送一个带有函数“updateApplicationContext:(NSDictionary *)”的字符串。 我希
我想使用 WatchConnectivity 和设置 WCSession 将在 watch 上创建的文件发送到 iOS 配套应用程序,但它无法通过 iPhone。当我改为使用发送包含字典的消息时,数据
创建独立的watchOS应用程序时是否可以使用WatchConnectivity框架? 文档 https://developer.apple.com/documentation/watchkit/cr
我有一个 iOS 应用程序,它使用 WatchConnectivity 与配对的 watch 进行通信。在大多数情况下,它可以在模拟器和设备上正常运行。 问题: 在模拟器上的开发过程中,当我尝试使用
我是一名优秀的程序员,十分优秀!