为什么 swift 解析 .getDataInBackgroundWithBlock 被阻止为明文 http 请求?

why swift parse .getDataInBackgroundWithBlock blocked as cleartext http request?

我正在编写一个 swift iOS 应用程序,它使用托管在 Heroku 上的 Parse。据我所知,所有数据传输都是通过 HTTPS 进行的,我没有对 info.plist 进行 App Transport Security 解决方法(并打算保持这种状态)。到目前为止,所有 Parse 查询都已在模拟器和实际 iphone 运行 9.3.3 或 9.3.5.

上执行且没有错误

直到现在我添加了这段代码,它在模拟器上完美运行,但由于通过 HTTP 发出的明文请求而在 iphone 上崩溃。但是为什么要通过 HTTP 发出请求?

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier(idInstagramFeedCell, forIndexPath: indexPath) as! InstagramFeedCell

        let imageFile = feed[indexPath.row].imageFile as PFFile
        imageFile.getDataInBackgroundWithBlock({ (data, error) in
            if let image = UIImage(data: data!) {
                cell.postImage.image = image
            } else {
                cell.postImage.image = UIImage(named: defaultImageFile)
            }
        })

        cell.postUsername.text = feed[indexPath.row].username
        cell.postCaption.text = feed[indexPath.row].caption
        return cell
    }

违规行与 imageFile.getDataInBackgroundWithBlock({ ... }) 隔离,因为如果将其注释掉,应用程序不会在 iphone 上崩溃。

控制台中的错误是:

2016-08-18 18:51:56.074 ParseStarterProject-Swift[3694:2189084] 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.
2016-08-18 18:51:56.081 ParseStarterProject-Swift[3694:2189342] [Error]: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. (Code: 100, Version: 1.12.0)
2016-08-18 18:51:56.081 ParseStarterProject-Swift[3694:2189342] [Error]: Network connection failed. Making attempt 1 after sleeping for 1.373388 seconds.
2016-08-18 18:51:56.084 ParseStarterProject-Swift[3694:2189342] [Error]: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. (Code: 100, Version: 1.12.0)

奇怪的是 this poster 有一种相反的问题。任何帮助将不胜感激。

其他观察结果:实际上我只是看到它在模拟器上崩溃了。最初上传(即发布)到 Parse 的所有图像都是来自模拟器本身的照片。当实际设备上的应用程序 运行 尝试下载这些图像时,它会按照上述方式崩溃。自从使用该应用程序后,我将实际设备上的几张照片发布到 Parse。当模拟器上的应用 运行 尝试下载这些照片时,模拟器崩溃并出现与上述相同的错误。

看来您使用的是旧版 Parse SDK,请将其更新到最新版本 (v1.14.2),问题可能会消失。

@luizmb 在 GitHub 上的礼貌,解决方案很简单。显然有一个鲜为人知的(至少对我而言)解析服务器变量 publicServerURL 需要包含与 serverURL 相同的值。如果您依赖 Heroku Parse 控制台来管理您的实例,您可以通过定义环境变量 PARSE_PUBLIC_SERVER_URL 来设置它。如果您有自定义实例,则需要在实例化 Parse 时将此行添加到 index.js

publicServerURL: process.env.PARSE_PUBLIC_SERVER_URL || process.env.PARSER_SERVER_URL || process.env.SERVER_URL,

但是有两个注意事项:1) 如果您像我一样在实施此解决方案之前上传了任何图像文件,您可能仍然会遇到 ATS 错误。要解决此问题,您需要像我一样从您的实例中删除所有此类图像。 2) 我只能让它在实际设备上工作 (iOS 9.3.5) 但 运行 在模拟器上完全相同的应用程序 (iOS 9.3),ATS 错误不显示up 但这些我还没有找到绕过的方法:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
[Error]: An SSL error has occurred and a secure connection to the server cannot be made. (Code: 100, Version: 1.14.2)
[Error]: Network connection failed. Making attempt 4 after sleeping for 15.848020 seconds.

此解决方案使您的应用程序能够从 Parse 下载图像文件,而无需通过 info.plist 中的 AllowArbitraryLoads 关闭 ATS。请参阅 here for details