2017-01-16 6 views
0

じゃないんだときの情報を取得するための解決策私は、ユーザーが完了し、SOAPリクエストで私たちにそれを送ることができるフォームがあります。彼らは私のアプリには、インターネット接続

フォームはsendedでは:

enter image description here

をしかし、私は問題を抱えている、私は、彼らは私が私のSOAPリクエストを使用してデータを送信することはできません。インターネットに接続しているん。

だからまず私はコアデータで要求を保存するので、ここでそれは大丈夫だ...そして、ユーザは、私は、彼らがそれらを送信するためのコアデータで要求しているかどうかを確認するためにスケジュールされた要求を行うアプリ上にあるとき。

しかし、アプリが実行されていない場合はどうなりますか?アンドロイドでは、私はバックグラウンドサービスを使用しますが、Appleとそれは不可能です:

Android Services equivalent in iOS Swift

誰かがデータを取得するためのアイデアを持っていますか?

石鹸機能:

func soapCall(fonction:String, soapMessageParamsTab:[SoapMessageParams], completion: @escaping (_ strData: NSString)->()/*, completion: @escaping (_ result: Int, _ resultContactWebId: Int)->()*/){ 
     let soapRequest = AEXMLDocument() 
     let attributes = ["xmlns:SOAP-ENV" : "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:ns1" : namespace, "xmlns:xsd" : "http://www.w3.org/2001/XMLSchema", "xmlns:xsi" : "http://www.w3.org/2001/XMLSchema-instance", "xmlns:SOAP-ENC" : "http://schemas.xmlsoap.org/soap/encoding/", "SOAP-ENV:encodingStyle" : "http://schemas.xmlsoap.org/soap/encoding/"] 
     let envelope = soapRequest.addChild(name: "SOAP-ENV:Envelope", attributes: attributes) 
     let body = envelope.addChild(name: "SOAP-ENV:Body") 
     let sendLead = body.addChild(name: "ns1:"+fonction) 

    for obj in soapMessageParamsTab { 
     sendLead.addChild(name: obj.soapName, value: obj.soapValue, attributes: ["xsi:type" : "xsd:"+obj.soapType]) 
    } 
     //sendLead.addChild(name: "xml", value: messageSoap, attributes: ["xsi:type" : "xsd:string"]) 


     let soapMessage = soapRequest.xmlString 
     let messageSoapMinify = minify(soapMessage) 


     //  URL Soap 
     let urlString = soapServiceURL 
     let url = URL(string: urlString) 
     var theRequest = URLRequest(url: url!) 

     //  Taille SoapMessage 
     let msgLength = String(messageSoapMinify.characters.count) 

     //  Soap Login 
     let username = soapUsername 
     let password = soapPassword 
     let loginString = NSString(format: "%@:%@", username, password) 
     let loginData: Data = loginString.data(using: String.Encoding.utf8.rawValue)! 
     let base64LoginString = loginData.base64EncodedString(options: NSData.Base64EncodingOptions.lineLength64Characters) 

     //  Requete Soap 
     theRequest.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") 
     theRequest.addValue("Keep-Alive", forHTTPHeaderField: "Connection") 
     theRequest.addValue(msgLength, forHTTPHeaderField: "Content-Length") 
     theRequest.addValue("urn:ResponseAction", forHTTPHeaderField: "SOAPAction") 
     theRequest.httpMethod = "POST" 
     theRequest.httpBody = messageSoapMinify.data(using: String.Encoding.utf8, allowLossyConversion: true) 
     theRequest.addValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization") 
     //  print("Request is \(theRequest.allHTTPHeaderFields!)") 

     let session = Foundation.URLSession.shared 

     let task = session.dataTask(with: theRequest, completionHandler: {data, response, error -> Void in 

      if error != nil 
      { 
       print(error?.localizedDescription) 
      } 

      //print("Response Login: \(response)") 
      //print("Error Login: \(error)") 
      let strData = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)! 
      //print("Body Login: \(strData)") 

      completion(strData) 
     }) 


     task.resume() 

} 
+0

これは、はるかに明確です。ありがとう。 – Rob

+0

@Rob私は難しいと思っています。「インターネットに接続されていない、後で来る」というメッセージを送信したくありません。 – Ben

+0

[コンテンツをバックグラウンドでダウンロードする](https:// developerを参照してください。 apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW5)iOS用_Appプログラミングガイド:背景Operation._そのセクションながらダウンロード用に書かれたもので、アップロードにも同様に機能します。そして、率直に言って、あなたのSOAPリクエストはダウンロードとみなすことができます( 'URLRequest'を構築し、ダウンロードはインターネット接続が確立された後にリクエストが送信されたときのサーバレスポンスです)。 – Rob

答えて

0

背景設定でNSURLSessionを使用して、あなたは大丈夫でなければなりません。 注:アプリが明示的にユーザーによって強制終了された場合、スケジュールされたリクエストはキャンセルされます。このトリックは、アプリケーションが何らかの理由でシステムによって強制終了された場合(低メモリ、クラッシュなど)にのみ機能します。アプリがユーザーによって殺された場合は、何もできません。バックグラウンドフェッチは解決策かもしれませんが、日和見的なフェッチのためにアプリを目を覚ますかどうかは、iOSによって決定されます。 これはあなたを助けることができる: https://blog.newrelic.com/2016/01/13/ios9-background-execution/

編集: このチュートリアルでは、同様に有用である可能性:https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started

+0

バックグラウンドフェッチはこの特定の問題のための良い解決策ではありません。背景 'URLSession'は行く方法です。 – Rob

+0

URLSessionは、ユーザーによって殺されたアプリの問題を解決しません。私は両方のミックスがベンのニーズを満たすべきだと思う。ユーザーがアプリケーションを強制終了しないすべての幸せなパスの背景設定を含むURLSession。アプリが明示的にユーザーによって強制終了された場合のバックグラウンドフェッチ。 –

+0

IIRC、ユーザーがアプリを殺すと、それ以上のバックグラウンドフェッチも防止されます。 – Rob

関連する問題