【问题标题】:Code will run in playground, but fails when executed in application simulator代码将在操场上运行,但在应用程序模拟器中执行时失败
【发布时间】:2015-10-29 14:38:41
【问题描述】:

我正在尝试使用 NSURL 函数获取 URL 的 HTML。代码运行良好,并且在从操场执行时正确返回了 HTML,但是当我将它实现到情节提要的按钮中时,应用程序崩溃了。我更改了 Info.plist 文件中的应用程序传输安全性,但我仍然遇到崩溃。这是我的 Info.plist:http://imgur.com/a/BB3KF。错误消息还说有一个 nil 值,但是我已经测试了函数中的变量,一切似乎都是 != nil。

游乐场代码:

let myUrl = NSURL(string: "http://www.google.com")
        let request = NSMutableURLRequest(URL: myUrl!)
        request.HTTPMethod = "POST"
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            data, response, error in
            let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            self.testLabel.text = "\(responseString)"
            if error != nil {
                print("Error: \(error)")
            }
        }
        task.resume()

XCode 代码:

import UIKit
import Foundation

class ViewController: UIViewController {

    @IBOutlet weak var testLabel: UILabel!

    @IBAction func testButton(sender: UIButton) {
        let myUrl = NSURL(string: "http://www.google.com")
        let request = NSMutableURLRequest(URL: myUrl!)
        request.HTTPMethod = "POST"
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            data, response, error in
            let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            self.testLabel.text = "\(responseString)"
            if error != nil {
                print("Error: \(error)")
            }
        }
        task.resume()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

错误信息:

2015-10-29 10:20:36.127 testProject[1263:49414] App Transport Security 已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用程序的 Info.plist 文件配置临时例外。 致命错误:在展开可选值时意外发现 nil (lldb)

【问题讨论】:

  • 将 Allow Arbitrary Loads 的布尔值更改为 YES,之后您可能需要清理或清除派生数据。
  • @EricKenny 非常感谢您的帮助。我添加了它,但它仍然不起作用。 imgur.com/a/n8aJ8 我收到的错误消息:2015-10-29 11:14:26.368 testProject[1403:58840] App Transport Security 已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用程序的 Info.plist 文件配置临时例外。致命错误:在展开可选值 (lldb) 时意外发现 nil
  • @EricKenny 也收到了这个:imgur.com/Rg0TMsZ 谢谢

标签: ios swift ios-simulator nsurl swift-playground


【解决方案1】:

发生错误是因为 iOS9 与服务器的连接必须是安全的 (https ) 以允许使用 http 将以下内容添加到 info.plist 中

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

【讨论】:

  • 非常感谢您的帮助。我添加了它,但它仍然不起作用。 imgur.com/a/n8aJ8 我收到的错误消息:2015-10-29 11:14:26.368 testProject[1403:58840] App Transport Security 已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用程序的 Info.plist 文件配置临时例外。致命错误:在展开可选值 (lldb) 时意外发现 nil
  • 您必须更改的 info.plist 在 testProject 中,而不是在 testProjectTest 中
  • @NickPitoniak 请检查我的答案
  • 感谢您的帮助,现在我已经成功了!但是,从网站获取 HTML 需要很长时间(40 秒)。有什么方法可以缩短加载时间,或者引导和检索 HTML 需要多长时间?非常感谢。
  • @WilliamKinaan 感谢您的帮助。我看到您建议将服务器更改为 localhost。我的想法是让用户通过 PHP 脚本访问 MySQL 以获取数据。如果每个人的应用程序都指向他们自己的本地主机,而不是我选择的可以编译数据的网站,我将如何获取现有数据?如果这没有意义,我将更深入地解释我的意思。非常感谢您在这个问题上的帮助。
【解决方案2】:

您需要将info.plist 中的NSAppTransportSecurity 值设置如下:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>localhost</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
        </dict>
    </dict>

localhost 更改为您的实际服务器

App Transport Security has blocked a cleartext HTTP resource

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2012-05-15
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多