微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从userNotificationCenter的后台模式进行Alamofire API调用不起作用

如何解决从userNotificationCenter的后台模式进行Alamofire API调用不起作用

我正在使用我的应用程序中的Notification Service Extension实施Rich通知。单击动作按钮时,我正在调用一个API,该API在应用程序处于前台模式时有效,而在应用程序处于后台模式时无效。 我收到“错误完成[-1005],错误域= NSURLErrorDomain代码= -1005“网络连接丢失。”我已启用了后台获取功能

下面是我在应用程序委托中的代码

func userNotificationCenter(_中心:UNUserNotificationCenter, didReceive response:UNNotificationResponse,withCompletionHandler completeHandler:@escaping()-> Void){

    if let domain_name = UserDefaults.standard.value(forKey: DOMAIN_NAME) as? String,let device_id = UserDefaults.standard.value(forKey: "deviceid") as? String
    {
        let hash_key = UserDefaults.standard.value(forKey: LoginKey) as! String
        let user_name = UserDefaults.standard.value(forKey: USER_NAME) as! String
        let url = domain_name + "/abc.PHP"
        let parameters : Dictionary<String,Any> = [
            "action" : "xyz","user_name" : user_name,"hash_key" : hash_key,"parking_status": "0","latitude":0,"longitude" : 0,"device_id": device_id
        ]
        print("parking set URL: \(url),parameters:\(parameters)")
        
        apimanager.sharedInstance.CallNewTrackResult(urlString: url,parameters: parameters,completionHandler: {data,r_error,isNetwork in
            if isNetwork{
                let result = data?[K_Result] as? Int ?? 100
                switch (result){
                case 0 :
                    if let message = data?[K_Message] as? String
                    {
                        print("parking message is :\(message)")
                        let alert = UIAlertController(title: "",message: message,preferredStyle: .alert)
                        let actionYes = UIAlertAction(title: "OK",style: .default,handler: { action in
                        })
                        alert.addAction(actionYes)
                        dispatchQueue.main.async {
                        self.window?.rootViewController?.present(alert,animated: true,completion: nil)
                        }
                    }
                    break
                case _ where result > 0 :
                    let message = data?[K_Message] as! String
                    print(message)
                    break
                default:
                    print("Default Case")
                }
            }else{
                //showToast(controller: self,message: "Please check your Internet Connection.",seconds: 0.3)
                print("ERROR FOUND")
            }
      })
   }
}

func apiCall(){

unparsed-text()

解决方法

当您调用完成处理程序时,系统正在断开网络连接。

您应该将完成处理程序从 userNotificationCenter(_:didReceive:withCompletionHandler:) 传递给您的 func 并在进程结束时调用它

func userNotificationCenter(_ center: UNUserNotificationCenter,didReceive response:UNNotificationResponse,withCompletionHandler completionHandler: @escaping () -> Void) {
   apiCall(completion: completionHandler)
}

func apiCall(completion: () -> Void) {
  ...
  APIManager.sharedInstance.CallNewTrackResult(urlString: url,parameters: parameters,completionHandler: {data,r_error,isNetwork in
     completion()
     ...
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。