- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我希望我的复杂功能通过 Watch Connectivity 从 iPhone 获取数据。我正在使用 sendMessage
即时消息技术。
我不想在尝试获取数据时打开我的 iPhone 应用程序,因此这需要在后台运行。
在我 iPhone 上的 ViewController 中:
import UIKit
import WatchConnectivity
class ViewController: UIViewController, WCSessionDelegate {
var session: WCSession!
override func viewDidLoad() {
super.viewDidLoad()
if WCSession.isSupported() {
self.session = WCSession.defaultSession()
self.session.delegate = self
self.session.activateSession()
}
}
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
if message.count != 1 { return }
if message["request"] != nil {
replyHandler(["response" : "data"])
}
}
在我的 ComplicationController 中
var session: WCSession!
func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) {
if complication.family != .ModularSmall {
handler(nil)
}
if WCSession.isSupported() {
self.session = WCSession.defaultSession()
self.session.delegate = self
self.session.activateSession()
}
var respondedString = "not"
session.sendMessage(["request" : ""], replyHandler: {
(resp) -> Void in
respondedString = resp["response"]
}, errorHandler: nil)
let circularTemplate = CLKComplicationTemplateModularSmallSimpleText()
circularTemplate.textProvider = CLKSimpleTextProvider(text: respondedString)
let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(), complicationTemplate: circularTemplate)
handler(timelineEntry)
}
我在 watch 上唯一能看到的是“不”。为什么复杂功能不显示接收到的数据?
最佳答案
主要问题是您正试图在您的并发症 Controller 中进行异步调用。
sendMessage:
调用之后的代码将在您的回复处理程序收到响应之前执行。这就是为什么您的并发症显示为“不”,因为在您收到回复之前已设置模板的文本。
一段时间后,在 getCurrentTimelineEntryForComplication
返回后,sendMessage
将收到一个响应并调用回复处理程序,它只会设置 respondedString
,然后退出那个街区。
您应该避免做的事情:
你应该考虑Apple's recommendations ,而不是尝试在并发症 Controller 中获取任何数据。
The job of your data source class is to provide ClockKit with any requested data as quickly as possible. The implementations of your data source methods should be minimal. Do not use your data source methods to fetch data from the network, compute values, or do anything that might delay the delivery of that data. If you need to fetch or compute the data for your complication, do it in your iOS app or in other parts of your WatchKit extension, and cache the data in a place where your complication data source can access it. The only thing your data source methods should do is take the cached data and put it into the format that ClockKit requires.
此外,您在数据源中执行的任何事件都将不必要地用完分配给您的复杂功能的每日执行时间预算。
您如何为您的并发症提供数据?
Apple 提供了一个 Watch Connectivity transferCurrentComplicationUserInfo
方法,它将 immediately将(字典)复杂功能信息从手机传输到 watch 。
When your iOS app receives updated data intended for your complication, it can use the Watch Connectivity framework to update your complication right away. The transferCurrentComplicationUserInfo: method of WCSession sends a high priority message to your WatchKit extension, waking it up as needed to deliver the data. Upon receiving the data, extend or reload your timeline as needed to force ClockKit to request the new data from your data source.
在 watch 端,您有 WCSessionDelegate
句柄 didReceiveUserInfo
并使用您收到的数据来更新您的复杂功能:
func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {
if let ... { // Retrieve values from dictionary
// Update complication
let complicationServer = CLKComplicationServer.sharedInstance()
guard let activeComplications = complicationServer.activeComplications else { // watchOS 2.2
return
}
for complication in activeComplications {
complicationServer.reloadTimelineForComplication(complication)
}
}
}
Apple 工程师通常建议设置一个数据管理器来保存数据。在您的并发症 Controller 中,您将从数据管理器中检索最新信息以用于您的时间线。
GitHub 上有几个现有项目使用这种方法。
如果您仍然更喜欢从 watch 端请求数据:
您希望将 WCSession
代码从并发症 Controller 中移出,放入 watch 扩展中,并将其作为 WKExtension
初始化的一部分激活。
关键是让回复处理程序在收到数据后手动更新并发症。
当您的 session 委托(delegate)的回复处理程序被调用时,您可以使用我之前提供的更新复杂功能代码来重新加载您的复杂功能的时间线。
如果您使用预定的复杂功能更新来触发此操作,那么该特定方法的缺点是您将执行两次更新。第一次更新会发起数据请求,但没有任何新数据可供使用。第二次(手动)更新发生在接收到数据之后,此时新数据将出现在时间线上。
这就是为什么在后台从手机提供数据的方法效果更好,因为它只需要一次更新。
关于swift - 结合 WatchConnectivity 和并发症,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36856436/
我正在使用 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 进行通信。在大多数情况下,它可以在模拟器和设备上正常运行。 问题: 在模拟器上的开发过程中,当我尝试使用
我是一名优秀的程序员,十分优秀!