在我的项目中,我Watch Connectivity
用来向Watch和iPhone发送消息.我可以向手机发送消息并在启动应用程序时收到一串字符串,但是在使用操作时,我收到以下错误;
错误域= WCErrorDomain代码= 7012"消息回复花了太长时间."
这是事情的建立方式;
首先,手表向手机发送消息,然后手机发送一串字符串以显示在手机中WKInterfaceTable
.这有时适用于加载应用程序.(我获取所有调用的NSManagedObjects Items
并使用它们的title
字符串属性存储在被array
调用的中watchItems
.
但是,我在手表上有一个操作,删除数组中的所有项目并使用新数据刷新表格.
手表上的操作使用一个sendMessage
功能发送item
到手机以从阵列中删除,然后手机将新更新的阵列发送到手表,手表更新表.但是,我要么返回相同的数组,要么出错.
非常简单,所以在Swift 3和Watch OS3/iOS 10之前一切正常工作; 整个应用程序曾经工作过.
这是我如何设置一切;
电话应用代表
import WatchConnectivity
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {
var session : WCSession!
var items = [Items]()
func loadData() {
let moc = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext
let request = NSFetchRequest<Items>(entityName: "Items")
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
request.predicate = NSPredicate(format: "remove == 0", "remove")
do {
try
self.items = …
Run Code Online (Sandbox Code Playgroud) 我正在开发一款使用WCSession
方法 在iPhone和Apple Watch之间共享数据的应用程序sendMessage:replyHandler:errorHandler:
实现该方法后,我收到如下错误:
WCSession _onqueue_notifyOfMessageError:withErrorHandler:errorHandler:YES,WCErrorCodeDeliveryFailed.
错误=无法传递Payload.
import Foundation
import WatchKit
import WatchConnectivity
class ResultInterfaceController: WKInterfaceController, WCSessionDelegate {
override func awake(withContext context: Any?) {
super.awake(withContext: context)
let applicationData = ["name": "ViratKohli"]
self.sendToPhone(data: applicationData)
}
func sendToPhone(data: [String: Any]) {
if WCSession.isSupported() {
let session = WCSession.default
session().delegate = self
session().activate()
if WCSession.default().isReachable {
session().sendMessage(data, replyHandler: {(_ replyMessage: [String: Any]) -> Void in
print("ReplyHandler called = \(replyMessage)")
WKInterfaceDevice.current().play(WKHapticType.notification)
},
errorHandler: {(_ error: Error) -> Void in
print("Error = …
Run Code Online (Sandbox Code Playgroud) 使用WatchConnectivity框架发送数据时,从手机到手表,反之亦然,在框架给我WCErrorCodePayloadTooLarge
错误之前,有效载荷有多大?
我在Apple的文档上找不到答案,此时互联网上似乎没有太多关于此的信息(事实上,谷歌搜索只WCErrorCodePayloadTooLarge
给我4个结果).
有没有人测试过试图找到答案?如果这个问题没有得到答案,我会尝试自己做并发布结果.
到目前为止,我所拥有的所有信息是它可能能够支持大于30 MB的文件.我想这是因为我在我的iPhone上拍了很多原始照片,它们通常大小约为36MB,而且它们总是出现在我手表的照片应用程序中.
作为参考,WCSession的文档具有以下描述WCErrorCodePayloadTooLarge
:
指示正在发送的项目超出最大大小限制的错误.数据字典和文件都可能发生此类错误.
适用于watchOS 2.0及更高版本.
在watchOS 2中,没有更多共享的钥匙串.
如果我想将iOS应用程序中的钥匙串值发送到Watch应用程序,是否可以通过WCSession updateApplicationContext发送它?
在我的iOS应用程序中,我使用Core Data来存储数据和获取请求以创建NSManagedObject
要在a中显示的s 数组UITableView
.
在Watch OS上,我检查是否WCSession
支持并激活会话,然后从iOS应用程序向watchOS扩展发送消息.
当iOS应用程序从watchOS收到消息时,它应该将数组发送Objects
到watchOS扩展中以显示数据WKInterfaceTable
,但我不确定如何执行此操作.最终我想要实现的是;
如何Objects
与watchOS扩展共享数组?
如果用户在Watch上的数组中添加/编辑/删除对象,我们如何更新iPhone上的数据?
此外,iOS应用程序嵌入在一个内容中,UITabBarController
因此与哪个视图控制器进行通信也很重要?
观看OS FavouritesInterfaceController
var session : WCSession!
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
//Check if session is supported and Activate
if (WCSession.isSupported()) {
session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
}
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
// Interface Objects
//Send Message …
Run Code Online (Sandbox Code Playgroud) 我在网上搜索高低,找到了解决方案.WatchOS能够几乎实时地使用iPhone和流媒体中的库存相机应用程序到库存watchOS相机应用程序.这有什么可能,因为我有一个需要在我的watchOS应用程序上显示摄像头视图的相机应用程序.
据我所知,WatchConnectivity.framework
速度不足以模拟实时流媒体图像作为股票watchOS相机应用程序.(我真的怀疑他们是在多个图像中拍摄了相机图层WKInterfaceImage
并在手表上显示.)有没有人有任何建议?苹果是否使用自己的私有API将iOS相机的流媒体流向watchOS?我很惊讶没有人深入研究这个功能.
我还发现Apple允许他们的手表应用程序打开他们的iOS主机应用程序令人沮丧,但不会让我们的开发人员也这样做.(但这是针对不同的论点.:()
提前感谢您的回复/建议.一切都有帮助.
从WatchKit扩展发送任何类型的http请求时,我收到以下错误:
WatchKit Extension[6128:479936] [WC] __33-[WCXPCManager onqueue_reconnect]_block_invoke error reconnecting to daemon due to NSXPCConnectionInterrupted
Run Code Online (Sandbox Code Playgroud)
如果会话可以访问,则仅尝试发送该消息,此时此消息就是该消息.但是,当我检查会话对象时,我可以看到,当reacable为true且activationState为2(WCSessionActivationStateActivated)时,其他属性(如paired和watchAppInstalled)实际上是false.
事实上,当我在模拟器或设备中使用应用程序时,错误只是每秒重复发送多次.我不确定发生了什么,但我在使用Xcode 8 Beta 3时才开始收到此错误.
应用代表:
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: NSError?) {
if activationState == WCSessionActivationState.activated {
NSLog("Activated")
}
if activationState == WCSessionActivationState.inactive {
NSLog("Inactive")
}
if activationState == WCSessionActivationState.notActivated {
NSLog("NotActivated")
}
}
func sessionDidBecomeInactive(_ session: WCSession) {
NSLog("sessionDidBecomeInactive")
}
func sessionDidDeactivate(_ session: WCSession) {
NSLog("sessionDidDeactivate")
// Begin the activation process for the new Apple Watch.
WCSession.default().activate()
}
Run Code Online (Sandbox Code Playgroud)
扩展代表:
func applicationDidFinishLaunching() { …
Run Code Online (Sandbox Code Playgroud) 我有一个 iPhone 应用程序,可将数据从 iPhone 应用程序直接发送到表盘以显示为复杂功能。
我使用该WatchConnectivity
框架创建了一个WCSession
将数据从手机发送到手表的方法。
我的数据存储在字典中,并使用WCSession
的transferCurrentComplicationUserInfo
方法发送到手表。(这种方法每天可以使用 50 次左右,我知道这一点 - 这不是问题。)
该transferCurrentComplicationUserInfo
方法似乎在我第一次尝试发送数据时起作用。
我的问题是我的 iPhone 应用程序打算在一个会话中多次调用这个函数,而且它只能在第一次可靠地工作。
当我发送第二组数据时,第一组数据仍保留在并发症上。通常,当我发送第三组时,会出现第二组。有时第二组永久出现,有时只出现一秒钟,然后显示第三组。
这是不一致的,这就是我遇到的问题。
有什么我设置不正确的吗?
代码:
//iPhone code to send data to Apple Watch:
func sendComplication(complication: Complication) {
guard let session = session else {
delegate?.failedToSendComplication(reason: "Could not connect to your Apple Watch.")
return
}
guard let context = convertComplicationToDictionary(complication: complication) else {
delegate?.failedToSendComplication(reason: "Couldn't cast complication to a dictionary.")
return
}
if session.remainingComplicationUserInfoTransfers > 0 { …
Run Code Online (Sandbox Code Playgroud) apple-watch watchkit clockkit apple-watch-complication watchconnectivity
所以我使用Watch Connectivity来请求从iPhone到Watch的阵列.
这个想法sendMessage
来自手表,iPhone将在didReceiveMessage
方法中回复数组.
然而,iPhone似乎没有响应,我认为iPhone会在我从Watch发送消息时打开应用程序.我甚至尝试打开应用程序,sendMessage
但仍然没有运气.当我等待足够长时间时,我收到以下错误消息:
错误域= WCErrorDomain代码= 7012"消息回复花了太长时间." UserInfo = {NSLocalizedDescription =消息回复耗时太长.,NSLocalizedFailureReason =发生回复超时.}
有人知道我哪里出错吗?
Apple Watch
import WatchKit
import Foundation
import CoreData
import WatchConnectivity
class BookmarkedInterfaceController: WKInterfaceController, WCSessionDelegate {
var session : WCSession!
var objects: [AnyObject]!
@IBOutlet var table: WKInterfaceTable!
override func willActivate() {
super.willActivate()
//Check if session is supported and Activate
if (WCSession.isSupported()) {
session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
sendMessageToIphone()
}
func sendMessageToIphone() {
if WCSession.defaultSession().reachable {
print("WCSession is reachabe")
let …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Xcode 12.3 为 iOS 应用程序构建 watchOS 应用程序(即它不是独立的 watchOS 应用程序)。
我的 watchOS 应用程序需要根据手表上的用户操作向 iOS 发送小块数据(包含字符串和日期的结构),然后 iOS 应用程序会将收到的数据保留在自己的存储中。手表中的数据不需要立即传输,但也不会丢失,最终必须到达 iOS 应用程序。我认为这种transferUserInfo(_:)
方法WCSession
最适合我的需要。
当我transferUserInfo_:
在 watchOS 模拟器上调用默认 WCSession 时,一切都会成功,但数据永远不会到达对应的 iOS 应用程序。
我使用 Xcode 12.3、iOS 14.3 模拟器和配对的 watchOS 7.2 模拟器。
我确保在应用程序启动时激活 WCSession 并检查它是否已成功激活,并在尝试传输用户信息之前检查会话是否处于活动状态。
奇怪的是,我可以使用updateApplicationContext(_:)
WCSession 的方法将数据从 iOS 传输到 watchOS,但无法将数据从手表传输回 iOS 应用程序。
我构建了一个最小的示例来说明该问题。watchOS 应用程序显示一个按钮,当用户点击它时,它应该向 iOS 发送一个随机数。iOS 应用程序应该在屏幕上的文本标签中显示收到的号码。
这是示例 iOS 应用程序的完整代码,它只是一个文件:
import os
import SwiftUI
import WatchConnectivity
class WatchConnectivityService: NSObject, ObservableObject {
@Published private(set) var receivedNumber: Int
private …
Run Code Online (Sandbox Code Playgroud)