如何确定应用传输安全性(App Transport Security)阻止了哪个URL?

39

我正在将一个iOS应用程序升级到iOS 9,但有些URL不是安全的,我需要在应用传输安全性中添加一些例外。我已经添加了我知道的两个,但现在出现了一些警告:

由于不安全,应用传输安全性阻止了明文HTTP(http://)资源加载。可以通过您的应用程序的Info.plist文件配置临时例外。

我需要知道哪些URL被阻止,以便将它们添加到Info.plist中,它们可能是图片或媒体文件。如何让系统记录它决定不加载的URL?

2个回答

68

编辑说明: 在下面的评论中,@jessedc指出了如何执行此操作的官方Apple文档链接: https://developer.apple.com/library/content/qa/qa1887/_index.html

好吧,我有一个答案,但我不喜欢它! 我仍然非常想要一个更好的答案。

在我的application:didFinishLaunchingWithOptions:方法中,我添加了以下行:

setenv("CFNETWORK_DIAGNOSTICS", "3", 1);
当我运行应用程序时,在日志中我可以找到一个看起来像这样的条目:
2015-07-02 15:27:56.152 MyApp[45041:9125662] CFNetwork diagnostics log file
created at: /Users/micah.hainline/Library/Developer/CoreSimulator/Devices/
11BCA581-5F5F-494D-932A-2ECFCA33EA93/data/Containers/Data/Application/
9ACC6941-8039-4B86-B5E8-A6C66E2AD520/Library/Logs/CrashReporter/CFNetwork_com
.myapp.MyApp_45041.nwlrb.log

当我打开该文件时,我会看到大量关于网络上发生的所有事情的日志条目。我在该文件中搜索kCFErrorDomainCFNetwork并获取失败的网络请求的日志。我可以使用此信息查看系统尝试访问的URL,然后可以将该URL添加到App Transport Security的例外中。


当您的URL连接或数据任务以错误结束时,您不会收到错误回调吗?如果是这样,根据我所知,NSError对象中有关于被拒绝的原因的信息,包括是否由于HSTS而失败。 - dgatwood
1
这个答案实际上是官方文档中的方法:https://developer.apple.com/library/mac/qa/qa1887/_index.html 我建议将该来源添加到答案中。 - Jessedc
2
通常最好通过Scheme设置环境变量。https://developer.apple.com/library/mac/recipes/xcode_help-scheme_editor/Articles/SchemeRun.html#//apple_ref/doc/uid/TP40010402-CH4-SW1 - quellish
当我尝试这个时,它输出的文件路径并不存在。它说输出到/private/var/mobile/...长路径名...,但实际上mobile目录并不存在。 - chiliNUT
1
@chiliNUT,这是因为您正在移动设备上进行调试。在这种情况下,日志也存储在您的设备上。只需通过 Xcode 提取您的应用程序容器,并从“/ AppData / Library / Logs / CrashReporter”文件夹获取日志即可。详细信息请参见“CFNetwork Diagnostic Logging Q&A”的末尾部分。 - Alexander Dvornikov
显示剩余3条评论

3

接受的答案是正确的,但如果你在Xamarin iOS上进行此操作,你需要使用以下内容:

Environment.SetEnvironmentVariable("CFNETWORK_DIAGNOSTICS", "3", EnvironmentVariableTarget.Process);

此外,如果您正在寻找日志文件,请使用类似于模拟器管理器的工具以更轻松地找到正确位置(https://github.com/tue-savvy/SimulatorManager)。

PaulB 这只是用于模拟器吗? - nr5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接