【问题标题】:Is it possible to disable ATS in iOS 9 just for debug environment?是否可以仅在调试环境中禁用 iOS 9 中的 ATS?
【发布时间】:2015-11-30 03:36:11
【问题描述】:

我正在开发一个没有 HTTPS 设置的开发环境。是否可以仅为开发(调试)模式自动禁用 ATS?

【问题讨论】:

标签: ios9 xcode7


【解决方案1】:

我的解决方案是将 ATS 禁用选项保留为默认 NO 值,并添加一个新的运行脚本阶段以在构建应用程序时在应用程序包的 Info.plist 中更改它。

这是脚本:

#Disables ATS in debug builds.
INFOPLIST="${TARGET_BUILD_DIR}"/"${INFOPLIST_PATH}"
case "${CONFIGURATION}" in
"Release"|"Adhoc")
/usr/libexec/PlistBuddy -c "Set :NSAppTransportSecurity:NSAllowsArbitraryLoads NO" "${INFOPLIST}"
;;
"Debug")
/usr/libexec/PlistBuddy -c "Set :NSAppTransportSecurity:NSAllowsArbitraryLoads YES" "${INFOPLIST}"
;; 
esac

【讨论】:

  • 这比@MaciekCzarnik 的回答要好,因为您不会在第二个 .plist 文件中复制所有其他设置。
  • 您好,我已经尝试过您的建议,它在设备上运行良好,但似乎不适用于模拟器。这很奇怪,因为当我检查构建文件夹中的输出 Info.plist 文件时,NSAllowArbitraryLoads 设置正确设置为 YES。有什么线索吗?
  • 注意:将“运行脚本”保留为最后一个阶段。我开始移动它并把它弄坏了。
  • @Sajjon 这不会使 repo 变脏,它会更改应用程序包中已编译的 plist,而不是原始项目的 plist 文件。
  • 我不得不将此解决方案与another one 配对。然后它起作用了。
【解决方案2】:

另一种解决方案。通过使用INFOPLIST_PREPROCESS = YESINFOPLIST_PREPROCESSOR_DEFINITIONS = DEBUG=1

它可以像 C 代码一样在 Info.plist 中直接使用 #ifdef#if 进行条件预处理。

<key>UIMainStoryboardFile</key>
<string>Main</string>
#if DEBUG
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
#endif
<key>UIRequiredDeviceCapabilities</key>
<array>

缺点:无法打开 Xcode 的属性列表编辑器,因为它不是格式正确的 XML :(

【讨论】:

  • 我真的很喜欢这种方法,尽管它不是(预处理的)格式良好的 XML。
  • 一旦 Xcode 无法正确打开和渲染它,这是一个坏主意。如果您将来需要进行其他更改,您只会在编译时看到有问题。 @nobre 有更好的方法。
  • 这也破坏了项目设置的 Identity 部分(即通常设置显示名称、捆绑标识符、版本和构建的位置),因为 plist 格式不正确。就我而言,这也导致了一些与启动屏幕相关的警告。
【解决方案3】:

是的,您可以将项目设置配置为使用不同的 Info.plist 文件进行调试、发布或您在项目中使用的任何配置(类似于设置配置文件的方式),因此您可以在调试 plist 中禁用 ATS完全。

转到项目 -> 你的目标 -> 构建设置 -> Info.plist 文件

【讨论】:

  • 这样,我需要多个 Info.plist 文件的副本,其内容非常相似,除了 ATS 相关的设置。有什么办法可以减少这种重复?
  • 嗯,我知道 :) 您可以创建一个 shell 脚本,每次构建都会调用该脚本(运行脚本构建阶段)。它需要做的是:1.创建一个副本原始plist文件2.从副本中删除NSAppTransportSecurity键3.添加NSAppTransportSecurityNSAllowsArbitraryLoads使用PlistBuddy,并随时更新我的​​答案:)
  • 嘿,这很有趣,我会试试看。同时,我会接受你的回答。谢谢!
【解决方案4】:

我已经根据上面的方法制作了解决方案,但使用 git 存储库可以顺利运行。我们的想法是维护发布配置的原始 Info.plist,唯一的区别是在构建时自动生成 NSAllowsArbitraryLoads 中的 Debug。

我的 Xcode 版本是 11.3.1。有 3 个简单的步骤:

  1. Build settings - Packaging - Info.plist File 中为 Debug 配置添加 Info.debug.plist

  1. 构建阶段添加此运行脚本
    # Disables ATS in debug configuration
    if [ "${CONFIGURATION}" = "Debug" ]; then
        plist=$PRODUCT_SETTINGS_PATH
        src="`dirname $plist`/Info.plist"
        cp -f $src $plist
        /usr/libexec/PlistBuddy -c "Set :NSAppTransportSecurity:NSAllowsArbitraryLoads YES" "${plist}"
    fi

  1. Info.debug.plist放到.gitignore

echo Info.debug.plist &gt;&gt; .gitignore

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 2016-05-13
    • 2015-12-23
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多