Apple Watch 在 15 分钟后失去与 iOS 应用程序的连接

Posted

技术标签:

【中文标题】Apple Watch 在 15 分钟后失去与 iOS 应用程序的连接【英文标题】:Apple Watch losing connection to iOS app after 15 minutes 【发布时间】:2015-05-13 07:15:35 【问题描述】:

按照 Apple 的建议,我的 WatchKit 扩展大量使用 openParentApplication 将数据和图像加载到 WatchKit 应用程序中。这工作正常,尤其是在使用了这里的聪明建议之后: http://www.fiveminutewatchkit.com/blog/2015/3/11/one-weird-trick-to-fix-openparentapplicationreply

但是,它只能工作大约 15 分钟。之后,WatchKit 扩展无法在后台唤醒 iPhone 应用程序,并且 ios AppDelegate handleWatchKitExtensionRequest 永远不会被调用。如果我手动打开 iPhone 应用程序,呼叫就会通过,它会直接响应 WatchKit 扩展,但这几乎不是我可以要求用户做的事情......我希望 WatchKit 应用程序可以使用,而无需手动唤醒iOS 应用每 15 分钟一次。

我在测试设备 Swift 和 Xcode 6.2 上使用 iOS 8.2。也许它可能与使用开发人员配置文件有关?有其他人经历过吗?

在实用程序类 WatchUtils 中使用的代码,这在应用程序中的多个场合使用:

class func openPhoneApp(userInfo: [NSObject : AnyObject], complete:(reply:[NSObject : AnyObject]!, error:NSError!) -> Void) 
    WKInterfaceController.openParentApplication(userInfo, reply:  (reply:[NSObject : AnyObject]!, error:NSError!) -> Void in
        complete(reply:reply, error:error)
    )

openPhoneApp 是这样使用的:

WatchUtils.openPhoneApp(requestData, complete:  (reply, error) -> Void in
    if let reply = reply 
        // Do stuff
    
)

AppDelegate:

func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) 

    // Bogus task for keeping app going
    var bogusTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler  () -> Void in
    
    // End bogus task after 2 seconds
    delay(2.0, closure:  () -> () in 
        UIApplication.sharedApplication().endBackgroundTask(bogusTask)
    )

    // Code here for collecting information from phone app
    // ...
    var replyDict:[NSObject : AnyObject] = ["userHighscore":45]
    reply(replyDict)

    UIApplication.sharedApplication().endBackgroundTask(bogusTask) // End the bogusTask in case the work was faster than 2 seconds


// Utility function for delay
func delay(delay:Double, closure:()->()) 
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(),
        closure
    )

【问题讨论】:

显示您的代码、请求父应用程序的方式和位置openParentApplication...??? 您好 Zubair,感谢您的回复。用代码更新了原始帖子。 你没有为这个父应用调用设置任何计时器......??? 检查块中的错误。有时它会因为某些原因而失败。这就是为什么你有一个从系统发送的错误对象。 @hobert 我的整个应用程序完全是网络调用:youtu.be/poValYfohLg 我不需要等待他们的任何回复。该应用程序比从扩展程序拨打电话要好得多。它已被批准,所以没有什么反对这样做的。 【参考方案1】:

我遇到了同样的问题,阅读文档为我解决了这个问题。 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:handleWatchKitExtensionRequest:reply:

因为这个方法很可能在你的应用在后台时被调用,所以在你的实现开始时调用 beginBackgroundTaskWithName:expirationHandler: 方法,在你处理完回复并执行完回复块之后调用 endBackgroundTask: 方法。启动后台任务可确保您的应用在有机会发送回复之前不会暂停。

我的一些代码:

    nint taskId = 0;
    public override void HandleWatchKitExtensionRequest (UIApplication application, NSDictionary userInfo, Action<NSDictionary> reply)
    
        try 
            taskId= UIApplication.SharedApplication.BeginBackgroundTask(delegate
                    //this is the action that will run when the task expires                       
                );
            if (userInfo != null && userInfo.Keys [0] != null && userInfo.Keys [0].ToString() == "match") 

                MyWebClient wc = new MyWebClient ();
                wc.Encoding = Encoding.UTF8;
                wc.DownloadStringCompleted += (object sender, DownloadStringCompletedEventArgs e) => 
                    String res = e.Result;
                    reply (new NSDictionary (                   
                        "justTesting", new NSString (res)
                    ));
                    if(taskId != 0)                               
                        UIApplication.SharedApplication.EndBackgroundTask(taskId);
                ;
                wc.DownloadStringAsync(new Uri(myUrl));
            
       

在我改为这样做之后,它对我来说已经稳定了好几天,而以前它总是在 5-15 分钟后停止工作。

【讨论】:

以上是关于Apple Watch 在 15 分钟后失去与 iOS 应用程序的连接的主要内容,如果未能解决你的问题,请参考以下文章

还有这操作!你搜的羞羞网站,谷歌都截图保存了;黑客分分钟越狱Apple Watch;TypeScript 2.4.2发布

UNUserNotification 是不是可以选择仅在 Apple Watch 上显示通知?

Xcode 7 安装 Apple Watch 应用程序从未完成

如何修复 Apple Watch 页面控制器中缺少的界面控制器?

在Apple Watch上找不到“i”图标的解决方法

Apple Watch的通信机制