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 应用程序从未完成