静默通知上的 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 推送通知

收到静默推送通知且应用在后台运行时执行几行代码,ios

当应用程序在 iOS 11.4.1 中处于后台时,静默通知不起作用

在 iOS 中处理静默推送通知的最佳方法是啥

当应用程序处于终止状态时,iOS 静默推送通知不会收到