标签: watchos-3

"留言回复花了太长时间." - 观察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
查看次数

Apple Watch上的问题跟踪位置

我已经构建了一个Apple Watch App,它使用CLLocation来跟踪用户位置.应用程序的想法是使用内置GPS工作,而不需要手机.

当我运行手表应用程序时,它会提示我提供必须从手机应用程序授予的各种权限.

如果我这样做,然后开始跟踪手表,我会初次调用

- (void)locationManager:(CLLocationManager*)manager didFailWithError:(NSError*)error

这很正常,我只是再次开始追踪.然后我接到一些电话

- (void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations

但随后它就停止接收更新.

如果我在iPhone上运行完整曲目,然后在Watch上运行曲目,则跟踪工作正常.

测试完成:

  • 在iPhone上正确设置了锻炼和位置的已检查权限
  • 如果在未接收更新的轨道上,您拒绝对手机上的位置服务进行授权,然后再将其重新打开,则会再次调用上述两种方法,然后停止.所以一切都留在记忆中
  • 在正在运行的应用程序'Pear'上测试,并且似乎得到了相同的错误,即它在第一次运行时不会跟踪手表上的位置.

我认为这很可能是一个苹果虫,但我希望有人可以某种方式指出我可能错过的方向.

cllocationmanager apple-watch watchos-3

10
推荐指数
0
解决办法
203
查看次数

如何将瓷砖加载到SCNSphere?

我想动态加载瓷砖并将其显示在一个SCNSphere.当然我可以指定UIImageSCNMaterial:

sphere.firstMaterial!.diffuse.contents = image  
Run Code Online (Sandbox Code Playgroud)

然而,这意味着我将首先将所有图块合并在一起UIImage.每次获取新的磁贴时我都必须这样做.一个CATiledLayer基础SCNMaterial将是另一种选择,但遗憾的是它不适用于Apple Watch.

有没有办法在SceneKit中保持瓷砖分开?我尝试使用多种材料用于球体,但这不起作用.

ios scenekit watchos-3

9
推荐指数
0
解决办法
119
查看次数

使用Swift 3和后台任务更新复杂性

对于watchOS 3,Apple建议使用WKRefreshBackgroundTask而不是使用更新复杂功能getNextRequestedUpdateDate.

如何使用新方法确定两次更新之间的时间?

我只会破解我的数据请求(从网址)进入getCurrentTimelineEntry并将更新复杂功能,但我认为这不是苹果推荐的.

一个简短的代码示例将是一个很大的帮助.

swift apple-watch-complication swift3 watchos-3 wkrefreshbackgroundtask

8
推荐指数
1
解决办法
3703
查看次数

watchOS 3中的实时心率

我想在我的apple watchOS应用程序中访问实时心率.在主题演讲中,他们强调开发人员现在可以访问实时数据.但我在文档中找不到任何相关内容.

有人对我有暗示吗?

swift healthkit watchos-3

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

尝试在watchOS中进行后台刷新时,不会调用WKURLSessionRefreshBackgroundTask

我正在研究从Web服务获取计划数据的复杂性.每20-30分钟(或手动),我正在安排WKRefreshBackgroundTask来执行此操作.

正如Apple所建议的那样,我希望操作系统能够通过后台处理这些数据NSURLSession.

这是我用来下载我需要的数据的功能:

func scheduleURLSession()
{
    print("\nScheduling URL Session...")

    let backgroundSessionConfig:URLSessionConfiguration = URLSessionConfiguration.background(withIdentifier: NSUUID().uuidString)
    backgroundSessionConfig.sessionSendsLaunchEvents = true

    let backgroundSession = URLSession(configuration: backgroundSessionConfig)

    let downloadTask = backgroundSession.downloadTask(with: URL(string: "https://www.myserver.com/somedata")!)
    downloadTask.resume()
}
Run Code Online (Sandbox Code Playgroud)

关于这个的一些事情:

  1. 它在我安排时会被调用.我在控制台中看到了它的print语句.
  2. 它与Apple的例子几乎完全相同.
  3. 我省略了这个网址.同样的URL在iOS/watchOS应用程序中工作得很好,所以没有任何问题.

问题是,即使我正在调用resume()该任务并允许它在完成时唤醒我的应用程序,它似乎也没有.

完成后,它应该回到WKExtensionDelegate处理程序:

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>)
Run Code Online (Sandbox Code Playgroud)

作为一个WKURLSessionRefreshBackgroundTask,但它没有.

我的代码与Apple的示例代码相同,然后创建另一个会话,但通过WKURLSessionRefreshBackgroundTask标识符重新加入它.这是设置委托以处理下载数据的位置.检查代码:

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
    for task in backgroundTasks {
        switch task {

        case let backgroundTask as WKApplicationRefreshBackgroundTask:
            print("\nWatchKit - WKApplicationRefreshBackgroundTask")
            // self.updateComplicationDataArrivalTimes(backgroundTask)
            self.scheduleURLSession()
            backgroundTask.setTaskCompleted()

        case let snapshotTask as WKSnapshotRefreshBackgroundTask: …
Run Code Online (Sandbox Code Playgroud)

nsurlsession watchkit watchos watchos-3 wkrefreshbackgroundtask

7
推荐指数
2
解决办法
2017
查看次数

Swift3:通过AppGroups从Watch Extension访问Core Data时的空提取

目前我正在为已有的App(迁移到Swift 3)进行更新.我有针对Today-,Search-,Message-和Watch Extensions的目标.每个目标都需要访问我的应用程序的核心数据模型,因此我创建了一个AppGroup并为每个目标启用了Capability.虽然我已经将NSPersistentStoreCoordinator子类化,但所有内容都存储在共享文件夹中:

import CoreData
class PFPersistentContainer: NSPersistentContainer {
    override open class func defaultDirectoryURL() -> URL {
        if let url = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "add-groupname-here") {
            return url
        }
        // Fallback
        return super.defaultDirectoryURL()
    }
}
Run Code Online (Sandbox Code Playgroud)

这个类文件,以及我的Core-Data-Model和下面的类都是所有提到的目标的目标成员.实体的Codegen设置为Class Definition.到目前为止,我正在使用Core Data Stack的默认实现:

class DataManager {
    /**
     * Singleton Implementation
     */
    internal static let sharedInstance:DataManager = {
        let instance = DataManager()
        return instance
    }()

    // MARK: - Core Data stack
    lazy var persistentContainer: PFPersistentContainer = {
        let container = PFPersistentContainer(name: "Data")
        container.loadPersistentStores(completionHandler: { (storeDescription, …
Run Code Online (Sandbox Code Playgroud)

core-data ios swift3 watchos-3 appgroups

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

watchOS是否有替代图标?

从iOS 10.3开始,开发人员可以设置非常好的替代图标.

是否在配套的watchOS应用程序中支持?

我的应用程序最近被拒绝了.

具体来说,我们注意到,对于用户选择的替代图标主题,没有提交与iPhone图标主题匹配的替代Apple Watch图标.

ios apple-watch watchos-3

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

WatchKit:reloadRootControllers 未删除控制器(对象仍然存在,我希望它被销毁)

我正在尝试在 WatchKit 中实现登录方案(这里不应该关心用户是否在手表中输入数据),这意味着登录后,用户应该看到一个不允许他查看的视图返回登录屏幕(<左上角没有)

如果用户被踢出会话(例如,未支付订阅费用时),我希望应用程序返回到登录屏幕。

从登录屏幕重定向到主屏幕可以正常使用

DispatchQueue.main.async() { [weak self] in
                    WKInterfaceController.reloadRootControllers(
                        withNames: ["mainController"], contexts: [values]
                    )
                }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在主控制器中使用相同的方法时

DispatchQueue.main.async() { [weak self] in
                    WKInterfaceController.reloadRootControllers(
                        withNames: ["loginController"], contexts: [message]
                )
}
Run Code Online (Sandbox Code Playgroud)

登录屏幕显示,但主屏幕中的视图控制器保持活动状态,不断接收来自其他对象的通知并不断生成新的登录控制器。我已经尝试过了

    self?.pop()
    self?.dismiss()
    self?.popToRootController()
    self?.presentController(withName: 
Run Code Online (Sandbox Code Playgroud)

这些似乎都没有停用主控制器。在这种情况下我能做什么?

我不需要主控制器中的任何内容,因为我将在成功登录后创建一个新控制器,那么如何确保完全销毁该对象?我不想处理 mainController 中的所有引用、侦听器、计时器……这就是为什么我完全可以销毁它。

swift watchkit watchos-3

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