标签: watchconnectivity

"留言回复花了太长时间." - 观察Watch OS 3的连接问题

在我的项目中,我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)

ios swift watchconnectivity watchos-3

38
推荐指数
1
解决办法
1284
查看次数

WCErrorCodeDeliveryFailed:无法传递Payload

我正在开发一款使用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)

ios swift watchconnectivity wcsession watchos-3

14
推荐指数
2
解决办法
2640
查看次数

通过WatchConnectivity发送数据时有效负载有多大?

使用WatchConnectivity框架发送数据时,从手机到手表,反之亦然,在框架给我WCErrorCodePayloadTooLarge错误之前,有效载荷有多大?

我在Apple的文档上找不到答案,此时互联网上似乎没有太多关于此的信息(事实上,谷歌搜索只WCErrorCodePayloadTooLarge给我4个结果).

有没有人测试过试图找到答案?如果这个问题没有得到答案,我会尝试自己做并发布结果.

到目前为止,我所拥有的所有信息是它可能能够支持大于30 MB的文件.我想这是因为我在我的iPhone上拍了很多原始照片,它们通常大小约为36MB,而且它们总是出现在我手表的照片应用程序中.

作为参考,WCSession的文档具有以下描述WCErrorCodePayloadTooLarge:

指示正在发送的项目超出最大大小限制的错误.数据字典和文件都可能发生此类错误.

适用于watchOS 2.0及更高版本.

ios ios9 watchos-2 watchconnectivity wcsession

13
推荐指数
1
解决办法
2226
查看次数

使用updateApplicationContext发送keychain值是否安全

在watchOS 2中,没有更多共享的钥匙串.

如果我想将iOS应用程序中的钥匙串值发送到Watch应用程序,是否可以通过WCSession updateApplicationContext发送它?

ios watchkit watchos-2 watchconnectivity

13
推荐指数
3
解决办法
1063
查看次数

使用Core Data时如何使用Watch Connectivity共享数据

在我的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)

core-data ios swift watchkit watchconnectivity

11
推荐指数
1
解决办法
1935
查看次数

如何将自定义相机从iOS应用流式传输到watchOS应用程序?

我在网上搜索高低,找到了解决方案.WatchOS能够几乎实时地使用iPhone和流媒体中的库存相机应用程序到库存watchOS相机应用程序.这有什么可能,因为我有一个需要在我的watchOS应用程序上显示摄像头视图的相机应用程序.

据我所知,WatchConnectivity.framework速度不足以模拟实时流媒体图像作为股票watchOS相机应用程序.(我真的怀疑他们是在多个图像中拍摄了相机图层WKInterfaceImage并在手表上显示.)有没有人有任何建议?苹果是否使用自己的私有API将iOS相机的流媒体流向watchOS?我很惊讶没有人深入研究这个功能.

我还发现Apple允许他们的手表应用程序打开他们的iOS主机应用程序令人沮丧,但不会让我们的开发人员也这样做.(但这是针对不同的论点.:()

提前感谢您的回复/建议.一切都有帮助.

camera ios apple-watch watchconnectivity

11
推荐指数
0
解决办法
357
查看次数

在Xcode 8 Beta 3中观看网络破坏

从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)

xcode ios watchkit watchconnectivity

7
推荐指数
0
解决办法
1699
查看次数

Apple Watch 并发症无法可靠更新

我有一个 iPhone 应用程序,可将数据从 iPhone 应用程序直接发送到表盘以显示为复杂功能。

我使用该WatchConnectivity框架创建了一个WCSession将数据从手机发送到手表的方法。

我的数据存储在字典中,并使用WCSessiontransferCurrentComplicationUserInfo方法发送到手表。(这种方法每天可以使用 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

7
推荐指数
1
解决办法
441
查看次数

错误:"消息回复花了太长时间" - WCSession观看OS2

所以我使用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)

ios swift watchconnectivity wcsession

6
推荐指数
1
解决办法
1480
查看次数

WatchConnectivity:WCSession.transferUserInfo 在手表上成功,但数据从未到达 iPhone

语境

我正在使用 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)

ios ios-simulator watchos watchconnectivity

6
推荐指数
1
解决办法
1781
查看次数