静默通知上的 iOS 后台发布请求
Posted
技术标签:
【中文标题】静默通知上的 iOS 后台发布请求【英文标题】:iOS background post request on silent notification 【发布时间】:2020-03-26 14:24:14 【问题描述】:我想问一下,当应用收到静默推送通知时,是否可以从应用发送 URL POST 请求。如果可以的话,我怎样才能得到它?
我的应用程序成功接收静默推送通知,并且当我将手机插入 Xcode 时,我能够执行 url 任务(即使在后台)并获得所需的结果。 从我的 Mac 上拔下手机后,手机完全停止执行 url 任务。
关于apple documentation,当出现静默推送通知时,我有30秒的时间来执行代码
您的应用有 30 秒的时间来执行任何任务并调用提供的完成处理程序
我的无声推送通知:
notification: ,
apns:
headers:
"apns-priority" : '5',
"apns-push-type" : 'background'
,
payload:
aps:
"content-available" : 1,
,
topic: topic
;
AppDelegate.swift:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
if let messageID = userInfo[gcmMessageIDKey]
print("Message ID: \(messageID)")
guard (userInfo["aps"] as? [String?: Any]) != nil else
Analytics.logEvent("fetch_failed", parameters: nil)
completionHandler(.failed)
return
self.emailFetch() // Here I call my function for sending POST request via URLSession
print(userInfo)
completionHandler(UIBackgroundFetchResult.newData)
已解决
目前我已将 dataTask 更新为 downloadTask,现在我能够从临时文件中成功读取服务器的答案。当应用程序在后台运行时,它可以正常工作。
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
if let messageID = userInfo[gcmMessageIDKey]
print("Message ID: \(messageID)")
guard (userInfo["aps"] as? [String?: Any]) != nil else
Analytics.logEvent("fetch_failed", parameters: nil)
completionHandler(.failed)
return
if login != nil && password != nil
let session = URLSession.shared
let url = URL(string: "https://....")!
let body_values = Data(("data...").utf8)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/77.0.3865.120 Safari/537.36", forHTTPHeaderField: "User-Agent")
request.httpBody = body_values
print("Starting load data")
let loadDataTask = session.downloadTask(with: request) data, response, error in
if let httpResponse = response as? HTTPURLResponse
print(httpResponse.statusCode)
if httpResponse.statusCode == 200
if let data = data
if let dataString = try? String(contentsOf: data)
This is being executed only in XCode
My logic is here...
completionHandler(.newData)
else
completionHandler(.failed)
else
completionHandler(.failed)
else
completionHandler(.failed)
else
completionHandler(.failed)
loadDataTask.resume()
else
completionHandler(.failed)
【问题讨论】:
嗨!你找到解决办法了吗? 嗨!我已经更新了问题,所以看看:) 【参考方案1】:您好,Peter 不确定您是否知道这一点,但基本上您必须在 URLSession 中使用 .downloadTask 而不是 .dataTask。这可能就是您当前的解决方案不起作用的原因。可能倾向于认为“这不是下载任务”,但它只是原理图问题。将下载视为来自服务器的响应(例如 200 “Success”)。您仍然可以使用此方法进行 POST。
【讨论】:
您好,谢谢您的回答!我仍然被这个问题困扰,如果我记得的话,我在这个例子中尝试了 .dataTask 。我会尝试使用你提到的.downloadTask,我们会看到:)以上是关于静默通知上的 iOS 后台发布请求的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 的 UAPushNotificationDelegate 上捕获后台静默推送通知?
当应用程序在后台时,使用 React Native 的静默 iOS 推送通知