在后台接收静默推送时无法向 Alamofire 发出请求

Posted

技术标签:

【中文标题】在后台接收静默推送时无法向 Alamofire 发出请求【英文标题】:Unable to make request with Alamofire upon receiving silent push while in background 【发布时间】:2017-11-10 11:01:54 【问题描述】:

当某些事件发生时,我们的后端会向我们的应用发送静默推送。收到静默推送后,应用程序应该向服务器发出 API 调用,以便用户稍后打开应用程序时,他会看到更新的内容。应用程序收到静默推送通知,但 Alamofire 没有向我们的后端发出请求。以下是我在收到静默推送时调用的 AppDelegate 方法的实现(代码已被编辑以使其更易于阅读):

func application(_ application: UIApplication,     didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 
    self.alamoFireManager.request("someUrl/", method: .get, encoding: JSONEncoding.default).responseJSON 
        response in

        //Parse data...
        completionHandler(.newData)
    

self.alamoFireManager 设置如下:

let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = timeout
configuration.timeoutIntervalForResource = timeout

self.alamoFireManager = Alamofire.SessionManager(configuration: configuration)

这就是奇怪的地方。当我从 Xcode 启动应用程序并将其置于后台并从服务器向应用程序发送推送时,应用程序会收到推送通知并向服务器发出必要的请求。当我终止应用程序并在设备上正常启动应用程序(而不是通过 Xcode)并触发推送时,应用程序永远不会发出请求。我无法确定是推送没有到达还是 AF 没有发出请求但推送通知配置正确(内容可用,值为 1)并且调用了相应的委托方法至少在调试器中,所以我认为是 AF 没有发出请求。我还将 URLSessionConfiguration 更改为后台会话,如下所示:

let configuration = URLSessionConfiguration.background(withIdentifier: "someIdentifier")

此更改对应用的行为没有明显影响。我究竟做错了什么? Alamofire 是否不支持在应用程序处于后台时发出请求(使用 request())?我必须直接使用 NSURLSession 吗?这是我第一次处理任何静默推送触发的后台请求。任何帮助表示赞赏,谢谢。

问候 克里斯

【问题讨论】:

【参考方案1】:

您是否为您的应用目标设置了适当的背景模式?您需要设置它们以便系统在后台启动/唤醒您的应用程序以响应推送通知:

通常,在测试后台行为时,您不应依赖调试器,因为它会阻止 ios 暂停应用程序。尽管如此,它在正常运行时会被挂起(没有调试器),它会导致像您所经历的那样的混乱。

重要事项如上所述,调试器会阻止您的应用暂停。

https://forums.developer.apple.com/thread/14855

【讨论】:

感谢您的回复。是的,后台模式已启用。但是,当我的应用程序委托的 didReceiveRemoteNotification 方法被调用时,我尝试发布本地通知,现在我可以看到通知是在通过调试器启动时发布的,而不是在调试器外部启动时发布的。所以我的应用程序似乎没有从后台唤醒…… 请注意,本地通知无法按设计唤醒您的应用程序!只有远程通知可以。您应该使用远程通知测试您的应用程序,例如通过apn 工具:github.com/nomad/houston【参考方案2】:

在 didReceiveRemoteNotification 方法中发布本地通知后,我注意到该通知仅在应用程序从 Xcode 启动时发布。直接从设备启动应用程序时,应用程序从未发布本地通知。这让我相信我的应用实际上并没有被推送通知唤醒。因此,目前这与 Alamofire 无关,因此我将关闭此问题。

【讨论】:

使用 Mac 的控制台应用程序分析我的 iOS 设备上的 APNS 日志后,我看到推送通知已到达 iOS 设备,但该应用程序的后台应用程序刷新已被禁用。在 iOS 设置应用中查看应用的设置后,我看到后台应用刷新开关已设置为关闭。重新启用后,我开始收到通知。我想我应该先在那里检查一下,但至少我学会了通过 mac 的控制台应用程序查看 APNS 日志。您甚至可以使用 os.log 从应用程序登录到它! 您找到了哪些替代方案或解决方案?

以上是关于在后台接收静默推送时无法向 Alamofire 发出请求的主要内容,如果未能解决你的问题,请参考以下文章

仅接收来自 GCM 的最后一个后台静默推送通知

当应用程序未运行时,通过静默推送通知在后台更新本地数据库

静默推送通知不起作用

静默通知上的 iOS 后台发布请求

静默推送不触发代码执行

静默推送消息,如果应用程序处于后台并拔下电源,则无法做出反应