这个通用的 SOAP 客户端允许您使用您的 iOS 应用、Mac OS X 应用和 Apple TV 应用访问网络服务。
使用此框架,您可以创建支持 SOAP 客户端协议的 iPhone、iPad、Mac OS X 和 Apple TV 应用。此框架能够使用 SOAP 标准协议执行远程网络服务的方法。
Swift 4: 该库目前是用 Objective-C 编写的,当您导入 swift 库时,您会收到类似这样的构建错误:The use of Swift 3 @objc inference in Swift 4 mode is deprecated
。
为了消除此警告,需要在目标的构建设置中将 Swift 3 @objc Inference
设置为默认值。 但这还不是全部;用于创建请求的类必须使用 @objcMembers
和 NSObject
声明,例如
class MyClass { ... }
let param = MyClass()
// ...
// ...
let soap = SOAPEngine()
soap.setValue(param, forKey: "myKey")
// ...
// ...
MyClass 的声明必须变为
@objcMembers class MyClass: NSObject { ... }
从新的 Xcode 8 开始,应用程序需要额外的设置,如果此设置不存在,您将看到如下日志消息
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
要解决此问题,请在 info.plist 中添加几个键,步骤如下
info.plist
文件。NSAppTransportSecurity
的键,类型为 Dictionary。NSAllowsArbitraryLoads
的子键,类型为 Boolean,并将其值设置为 YES,如下图所示。参考链接: http://stackoverflow.com/a/32631185/4069848
import SOAPEngine64
class ViewController: UIViewController, SOAPEngineDelegate {
var soap: SOAPEngine = SOAPENgine()
override func viewDidLoad() {
soap.delegate = self
soap.actionNamespaceSlash = true
soap.setValue("Genesis", forKey: "BookName")
soap.setIntegerValue(1, forKey: "chapter")
// standard soap service (.asmx)
soap.requestURL("http://www.prioregroup.com/services/americanbible.asmx",
soapAction: "http://www.prioregroup.com/GetVerses")
}
func soapEngine(_ soapEngine: SOAPEngine!, didFinishLoadingWith dict: [AnyHashable : Any]!, data: Data!)
{
let dict = soapEngine.dictionaryValue()
print(dict)
}
}
import SOAPEngine64
class ViewController: UIViewController {
var soap: SOAPEngine = SOAPENgine()
override func viewDidLoad() {
super.viewDidLoad()
soap.actionNamespaceSlash = true
soap.setValue("Genesis", forKey: "BookName")
soap.setIntegerValue(1, forKey: "chapter")
soap.requestURL("http://www.prioregroup.com/services/americanbible.asmx",
soapAction: "http://www.prioregroup.com/GetVerses",
completeWithDictionary: { (statusCode: Int?, dict: [AnyHashable: Any]?) -> Void in
let book:NSDictionary = dict! as NSDictionary
let verses = book["BibleBookChapterVerse"] as! NSArray
print(verses)
}) { (error: Error?) -> Void in
print(error!)
}
}
}
import SOAPEngine64
class ViewController: UIViewController {
var soap: SOAPEngine = SOAPENgine()
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self,
selector: #selector(soapEngineDidFinishLoading(_:)),
name: NSNotification.Name.SOAPEngineDidFinishLoading,
object: nil)
soap.actionNamespaceSlash = true
soap.setValue("Genesis", forKey: "BookName")
soap.setIntegerValue(1, forKey: "chapter")
// standard soap service (.asmx)
soap.requestURL("http://www.prioregroup.com/services/americanbible.asmx",
soapAction: "http://www.prioregroup.com/GetVerses")
}
@objc func soapEngineDidFinishLoading(_ notification: NSNotification) {
let engine = notification.object as? SOAPEngine
let dict = engine()
print(dict)
}
}
import SOAPEngine64
class ViewController: UIViewController {
var soap: SOAPEngine = SOAPENgine()
override func viewDidLoad() {
super.viewDidLoad()
soap.actionNamespaceSlash = true
soap.setValue("Genesis", forKey: "BookName")
soap.setIntegerValue(1, forKey: "chapter")
// standard soap service (.asmx)
do {
let result = try soap.syncRequestURL("http://www.prioregroup.com/services/americanbible.asmx",
soapAction: "http://www.prioregroup.com/GetVerses")
print(result)
}
catch {
print(error)
}
}
}
SOAP Authentication(SOAP 身份验证) 的设置
soap.authorizationMethod = .AUTH_BASICAUTH; // basic auth
soap.username = "my-username";
soap.password = "my-password";
Social OAuth2.0 令牌的设置
// token authorization
soap.authorizationMethod = .AUTH_SOCIAL;
soap.apiKey = "1234567890"; // your apikey https://dev.twitter.com/
soap.socialName = ACAccountTypeIdentifierTwitter; // import Accounts
无需 SSL/HTTPS 的 Encryption/Decryption(加密/解密) 数据
soap.encryptionType = ._ENCRYPT_AES256; // or SOAP_ENCRYPT_3DES
soap.encryptionPassword = "my-password";
带有 Attributes(属性) 的参数
// book
var book = ["name": "Genesis"] as! NSMutableDictionary
var attr = ["order": "asc"]
// chapter
var child = soap.dictionary(forKey: "chapter", value: "1", attributes: attr)
book.addEntries(from: child!)
// book attributes
soap.setValue(book, forKey: "Book", attributes: ["rack": "2"])
它构建了一个如下所示的请求
<Book rack="2">
<name>Genesis</name>
<chapter order="asc">1</chapter>
</Book>
首先,如果您注意到请求响应速度变慢,请尝试更改名为 actionNamespaceSlash
的属性的值。其次,当使用名为 requestWSDL
的方法时,会执行三个步骤
这是未优化的,非常慢,您可以改用以下优化方法
SOAPEngine 可作为 Swift 包使用。存储库 URL 对于通过 Xcode 在您的应用中添加包是有效的。
阅读 Integrating SOAPEngine with a Swift project
试用 仅限模拟器 |
单应用 单个 bundle-id |
企业版 多 bundle-id |
---|---|---|
下载 | 购买 12,99€ | 购买 77,47€ |