- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我终于(忽略我从未见过在“收到应用程序任务,启动 URL session ”之后工作的示例代码)设法让我的 WatchOS3 代码启动后台 URL session 任务,如下所示:
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
for task in backgroundTasks {
if let refreshTask = task as? WKApplicationRefreshBackgroundTask {
// this task is completed below, our app will then suspend while the download session runs
print("application task received, start URL session")
let request = self.getRequestForRefresh()
let backgroundConfig = URLSessionConfiguration.background(withIdentifier: NSUUID().uuidString)
backgroundConfig.sessionSendsLaunchEvents = true
backgroundConfig.httpAdditionalHeaders = ["Accept":"application/json"]
let urlSession = URLSession(configuration: backgroundConfig, delegate: self, delegateQueue: nil)
let downloadTask = urlSession.downloadTask(with: request)
print("Dispatching data task at \(self.getTimestamp())")
downloadTask.resume()
self.scheduleNextBackgroundRefresh(refreshDate: self.getNextPreferredRefreshDate())
refreshTask.setTaskCompleted()
}
else if let urlTask = task as? WKURLSessionRefreshBackgroundTask {
//awakened because background url task has completed
let backgroundConfigObject = URLSessionConfiguration.background(withIdentifier: urlTask.sessionIdentifier)
self.backgroundUrlSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil) //set to nil in task:didCompleteWithError: delegate method
print("Rejoining session ", self.backgroundUrlSession as Any)
self.pendingBackgroundURLTask = urlTask //Saved for .setTaskComplete() in downloadTask:didFinishDownloadingTo location: (or if error non nil in task:didCompleteWithError:)
} else {
//else different task, not handling but must Complete all tasks (snapshot tasks hit this logic)
task.setTaskCompleted()
}
}
}
但是,我现在看到的问题是我的委托(delegate)方法urlSession:task:didReceiveChallenge:
从未被攻击,所以我无法完成下载。 (我还添加了 session 级 urlSession:didReceiveChallenge: 委托(delegate)方法,它也没有被命中)。
相反,我立即点击了我的 task:didCompleteWithError:
委托(delegate)方法,它有错误:
“此服务器的证书无效。您可能正在连接到伪装成……的服务器,这可能会使您的 secret 信息面临风险。”
有没有人得到后台监视更新来满足在后台 URL session 期间点击 didReceiveChallenge
方法的额外要求?
如果您能提供任何帮助或建议,我们将不胜感激。
最佳答案
事实证明,服务器证书错误实际上是由于我们测试环境中的一种罕见情况造成的。在后端人员为我们解决该问题后,这段代码在我们的生产和测试环境中都运行良好。
我从来没有点击过 urlSession:task:didReceiveChallenge:
但事实证明我不需要。
做了一个不相关的小改动:
在没有打印/断点的情况下,我有时会在点击 downloadTask:didFinishDownloadingTo location:
之前像毫秒一样点击 task:didCompleteWithError Error:
。
所以我改为在 downloadTask:didFinishDownloadingTo location:
中设置 self.pendingBackgroundURLTask completed。我只将它设置为在 task:didCompleteWithError Error:
if error != nil.
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
//Complete task only if error, if no error it will be completed when download completes (avoiding race condition)
if error != nil {
self.completePendingBackgroundTask()
}
}
func completePendingBackgroundTask()
{
//Release the session
self.backgroundUrlSession = nil
//Complete the task
self.pendingBackgroundURLTask?.setTaskCompleted()
self.pendingBackgroundURLTask = nil
}
希望其他人觉得这有帮助。
关于ios - WatchOS 3 WKApplicationRefreshBackgroundTask didReceiveChallenge,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40404749/
我有一个现有的 WatchOS 2 应用程序。我想升级它并添加一些 WatchOS 3 功能,所以我安装了 Xcode 8 beta 3。我的问题是我是否需要为 WatchOS 3 项目创建另一个目标
我正在尝试构建一个应用程序,它支持 watch OS2 上的多个复杂功能系列,例如模块化大、实用大、圆形小等,每个都显示来自应用程序的各种有意义的信息。我知道复杂性与我们自 OS1 以来在用户交互方面
我的 iOS 和 watchOS 应用程序之间有一个共享框架,其中包含一个带有一些命名颜色的 Assets 目录。我想在我的 watchOS 应用程序中访问命名颜色。在 iOS 中,我可以使用 UIC
我在 watchOS 5 和 Apple Watch Series 4 上遇到了一些问题,因为它们没有正确使用它们的tintColor。相反,它们仅显示白色文本。同一张脸上的其他第 3 方并发症显示出
在昨天的 WWDC 上,Apple 宣布在 watchOS 5 中支持 WebKit。我已经下载了 Xcode 10,但在 Interface Builder 或 Frameworks and Lib
我正在考虑更新到 watchOS 6 的独立应用程序 (as Apple suggests),但我不清楚安装了我的应用程序的旧 watchOS 版本的用户会发生什么。更具体地说: 如果用户在其 wat
我有一个仅针对 watchOS 6 及更高版本的 watchOS Xcode 项目,它是用 SwiftUI 编写的,并且它的所有依赖项都由 Swift Package Manager 处理。我注意到在
我知道 Apple watchOS 2.0 应用程序需要一些修改(特别是在双向通信方面).... 但是,对于已经在 App Store 中为 1.0 编写的所有 Watch 应用程序,它们会在没有修改
Previous 我使用 NSUserDefaults 在 watch 和应用程序之间共享基本变量。 我的目标是在 watch 上显示存储在 iPhone 应用程序 NSUserDefaults 上的
想要在 watchOS 下运行应用程序,在 Xcode beta 下出现错误:域:IDELaunchErrorDomain 代码:15 失败原因:构建和运行启动失败,因为系统似乎无法识别要运行的应用程
我有一个公共(public)交通应用程序,其中包含火车的实时出发数据。我想添加一个复杂功能,显示下一趟火车的出发时间。 是否可以显示(或刷新)复杂功能的实时数据?例如,显示“到 X 站 3 分钟”。根
我正在为营养跟踪应用程序构建并发症。我想使用提供多个较小的并发症,以便用户可以跟踪他们的营养。 例如: 'MyApp - 碳水化合物' 'MyApp - 蛋白质' 'MyApp - 胖子' 通过这种方
我希望有人能够帮助我理解在我的 WatchOS 2 应用程序中尝试实现 NSURLSession 时遇到的问题。 无论出于何种原因,我收到错误; Error Domain=NSCocoaErrorDo
我想让界面像健康应用一样在全屏高度上可滚动,并且不允许在中间停止滚动,这可能吗? 例如,我有两个按钮,我希望它们在屏幕上可见,另一个在滚动后显示。主要部分是,如果滚动开始,它将自行继续,直到第二个按钮
在 watchOS 中,如果应用程序中嵌入了自定义字体,则该字体肯定可以在 WkInterfaceLabel、WKInterfaceButton 等上使用。 该字体适用于 watchOS 的通知 Vi
现在我没有开发者帐户,所以我曾经使用 Xcode 在 Apple Watch Series 3 上安装 watch 应用程序。在过去的几个月中,我观察到即使我每天运行该应用程序,我的应用程序通常也会在
我做了一个应用程序。我向应用程序发送推送通知。我也想在 watchos 上收到它们。我必须为 watchOs 制作一个项目并制作一个应用程序吗?或者我在 watchOs 上自动收到来自 iPhone
问题:Apple Watch 上创建的通知只是间歇性地提醒用户它们的存在。从屏幕顶部向下滑动时,通知中心会显示已收到通知。为什么我们不是每次都收到警报? 我们正在使用 Apple 推荐的方法(如 UN
我有一个 Core Data 应用程序。这就像一个比方说一个新闻应用程序。每个条目都有名称、ID、日期、发布者、详细信息等。主 iOS 应用程序可以有很多新闻条目。我只想展示 WatchOS 应用程序
在 Xcode 中,有一个地方可以设置界面 Controller 关闭时的 Action : override func didDeactivate() { // This method
我是一名优秀的程序员,十分优秀!