2015-12-01 2 views
0

Я начал мигрировать свой старый код SOAP Web Service цели с помощью Swift 2. Но мне не удалось, так как я никогда не получал ответа с помощью Swift 2, который заставлял меня гать в конце.Swift 2 SOAP Web Service Call

Я начал изолировать вещи и после этого учебника по преобразователю температуры мыла (http://webindream.com/soap-with-swift/), который основан на Swift 1.2.

Это мой преобразованный ViewController Swift 2, но connection никогда не был прав (connection == true никогда не происходило).

// 
// ViewController.swift 
// Temperature Converter 
// 
// Created by Farhad on 10/24/14. 
// Copyright (c) 2014 Web In Dream. All rights reserved. 
// 

import UIKit 

//Step 1: Add protocol names that we will be delegating. 

class ViewController: UIViewController, UITextFieldDelegate, NSURLConnectionDelegate, NSXMLParserDelegate { 

    var mutableData:NSMutableData = NSMutableData() 
    var currentElementName:NSString = "" 



    @IBOutlet var txtCelsius : UITextField! 
    @IBOutlet var txtFahrenheit : UITextField! 


    @IBAction func actionConvert(sender : AnyObject) { 
     let celcius = txtCelsius.text 

     let soapMessage = "<?xml version='1.0' encoding='utf-8'?><soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Body><CelsiusToFahrenheit xmlns='http://www.w3schools.com/webservices/'><Celsius>\(celcius)</Celsius></CelsiusToFahrenheit></soap:Body></soap:Envelope>" 


     let urlString = "http://www.w3schools.com/webservices/tempconvert.asmx" 

     let url = NSURL(string: urlString) 

     let theRequest = NSMutableURLRequest(URL: url!) 

     let msgLength = String(soapMessage.characters.count) 

     theRequest.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") 
     theRequest.addValue(msgLength, forHTTPHeaderField: "Content-Length") 
     theRequest.HTTPMethod = "POST" 
     theRequest.HTTPBody = soapMessage.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) // or false 

     let connection = NSURLConnection(request: theRequest, delegate: self, startImmediately: true) 
     connection!.start() 

     if (connection == true) { 
      var mutableData : NSMutableData = NSMutableData() 
     } 


    } 




    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    // NSURLConnectionDelegate 

    // NSURL 



    func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) { 
     mutableData.length = 0; 
    } 

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!) { 
     mutableData.appendData(data) 
    } 


    func connectionDidFinishLoading(connection: NSURLConnection!) { 
     let xmlParser = NSXMLParser(data: mutableData) 
     xmlParser.delegate = self 
     xmlParser.parse() 
     xmlParser.shouldResolveExternalEntities = true 

    } 


    // NSXMLParserDelegate 

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
     currentElementName = elementName 

    } 



    func parser(parser: NSXMLParser!, foundCharacters string: String!) { 
     if currentElementName == "CelsiusToFahrenheitResult" { 
      txtFahrenheit.text = string 
     } 
    } 



} 

Там было много коментарии вокруг в Интернете, но не реальный ответ, почему связь никогда не становится истинным с Swift 2. По крайней мере, никто не решить мою проблему, наконец ;-(

Вот почему я поднять этот вопрос еще раз с надеждой получить рабочую версию для сообщества. есть ли кто-то там сделал успешную Swift 2.1 SOAP веб-службы вызова и может разделить решение?

Большое спасибо заранее Джон

+0

Привет, я работаю над мылом, и мне тоже нужно было обновить, нашли ли вы решение? –

+0

Привет @ B.Benj, решение опубликовано, как только я исправил, что @HoaParis упомянул, что 'NSUrlConnection' не является логическим, поэтому я изменил его на' if (connection! = Nil) ... '. Поэтому надеюсь, что это тоже поможет. Cheers, John –

+0

Спасибо, но теперь у меня другая проблема, перейдя на Swift2, он не принимает IP :(Спасибо –

ответ

1

Прежде всего, вы должны использовать NSUrlSession вместо NSUrlConnection, потому что этот класс устарел в iOS9.

Во-вторых, ваше соединение NSURLConnection ?, вы должны сравнить его с 'nil' вместо 'true'. Это не логическое. Таким образом, код var mutableData : NSMutableData = NSMutableData() никогда не будет вызван.

Если вы тестируете в iOS9, вам необходимо добавить некоторые настройки в ваше приложение. В противном случае во время процесса подключения вы получите сообщение об ошибке. Взгляните на эту тему: How do I load an HTTP URL with App Transport Security enabled in iOS 9?

+0

Привет, HoaParis, спасибо за ответ. Линия _italic_NSURLConnection не является логическим_истиком_ в конце была подсказка. Это сработало. Я уже адаптировал файл 'info.plist', чтобы не работать в режиме« небезопасного соединения ». Поэтому, после первого использования бит, я попытаюсь использовать теперь «NSUrlSession». Приветствия Джона –