【问题标题】:Adding NSAllowsArbitraryLoads to plist Still Not Working将 NSAllowsArbitraryLoads 添加到 plist 仍然无法正常工作
【发布时间】:2016-03-08 09:45:07
【问题描述】:

我在另一台机器上有一个创建 JSON 的 PHP 文件,并想从 iOS 应用程序中获取它。

我尝试使用 IP 地址通过 NSURL 从 iOS 应用程序连接

NSURL *url = [NSURL URLWithString:@"http://192.168.xx.xxx/JSON/JSONtoIOS.php"];
NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error];  

然后,我在info.plist 文件中添加了以下代码:

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

但是,我仍然收到相同的错误消息:

传输安全已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用的 Info.plist 文件配置临时例外。

该 URL 在 Web 浏览器上可以正常打开,但 NSData 返回 nil 时出现问题。

谁能帮我解决这个问题?

编辑:在 (​​void)viewDidLoad 中使用 NSURLSession

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"http://192.168.xx.xxx/JSON/JSONtoIOS.php"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSLog(@"%@", json);
}];
[dataTask resume];

【问题讨论】:

  • 所以您直接将 Info.plist 编辑为 XML 文本?您可能以某种方式弄乱了 XML。
  • 我检查了 XML 文本和列表。没有问题。

标签: ios objective-c json nsurl


【解决方案1】:

问题出在这一行:

NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error];

这不是你做网络的方式!这是对dataWithContentsOfURL 的滥用(用于打开本地文件URL),而且它是同步的,所以即使你在联网,你也会做坏事。

使用 NSURLSession 通过数据任务检索数据。现在您的 NSAppTransportSecurity 设置将得到遵守(此外,随着网络的进行,您将获得关于正在发生的事情的更好信息)。

【讨论】:

  • 谢谢。我尝试过使用 NSURLSession,但仍然遇到同样的错误。它还说原因是因为数据参数为nil:Terminating app due to uncaught exception 'NSInvalidArgumentException',原因:'data parameter is nil'
  • 不确定我是否正确使用了 NSURLSession。我已经编辑了我的问题。
  • 我当然不会那样做。一方面,会话需要持续存在;您正在使您的本地变量成为局部变量,甚至在网络开始之前就消失了。另一方面,您在此过程中不会在任何地方进行任何错误检查。你只是闭着眼睛从悬崖上跳下来,忽略了等待你的漂亮电梯。
  • 我是 iOS 开发的新手,之前从未使用过 NSURLSession。如果你能帮助我,那就太好了。所以我假设我必须为 NSURLSession 创建一个强大的@property。另外,我使用了 NSError 并显示相同的错误消息。
  • 使用 dataWithContentsOfURL 通常不是一个好主意,因为正如您所说,它是同步的。但是,在非主线程上,我很确定这是合法的,如果有点恶心的话。 :-)
【解决方案2】:

试试这个,

NSData *postData = [someStringToPost dataUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString:someURLString];

我认为这就是问题所在。

希望这会有所帮助。

【讨论】:

  • NSData 不应该使用带有 dataWithContentsOfURL 的 URL 吗?
【解决方案3】:

首先应该是Info.plist。文件系统在 iOS 上区分大小写。只是挑剔-我怀疑这是您的问题。 :-)

其次,确保您在 Info.plist 中的正确位置添加了它。它必须在顶层。

第三,如果此应用包含任何应用扩展、框架或任何其他可能包含 Info.plist 文件的内容,请确保您正在编辑正确的 Info.plist 文件。

第四,确保您在之后重新构建了您的应用,并且您确实在运行重新构建的副本。

第五,如果没有帮助,请启用 CFNetwork 诊断日志记录,如 QA1887 中所述。

【讨论】:

  • 嗯...我很确定我将它添加到正确的 info.plist 文件中。我试图将它设置在顶层,但它仍然无法正常工作。另外,我认为这不是网络问题,它在网络浏览器上运行良好。
  • 我不确定您所说的“网络问题”是什么意思。 CFNetwork 是执行所有 URL 获取的软件。通过启用调试,您可能会获得有关 ATS 为何忽略您在 Info.plist 文件中放置的内容的更多信息。无论哪种方式,问题都出在 Info.plist 文件中。我不能准确地说出你做错了什么,但这就是问题所在。好吧,正如其他人所提到的那样,使用 NSData 来获取非文件 URL 通常是一个坏主意,但您已经在解决这个问题了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 2012-04-18
  • 2016-01-18
相关资源
最近更新 更多