【发布时间】:2015-11-30 03:36:11
【问题描述】:
我正在开发一个没有 HTTPS 设置的开发环境。是否可以仅为开发(调试)模式自动禁用 ATS?
【问题讨论】:
-
这个 SO 答案 (stackoverflow.com/a/30836686/3395008) 可以帮助您了解如何处理 ATS。
我正在开发一个没有 HTTPS 设置的开发环境。是否可以仅为开发(调试)模式自动禁用 ATS?
【问题讨论】:
我的解决方案是将 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
【讨论】:
另一种解决方案。通过使用INFOPLIST_PREPROCESS = YES 和INFOPLIST_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 :(
【讨论】:
是的,您可以将项目设置配置为使用不同的 Info.plist 文件进行调试、发布或您在项目中使用的任何配置(类似于设置配置文件的方式),因此您可以在调试 plist 中禁用 ATS完全。
转到项目 -> 你的目标 -> 构建设置 -> Info.plist 文件
【讨论】:
NSAppTransportSecurity键3.添加NSAppTransportSecurity和NSAllowsArbitraryLoads使用PlistBuddy,并随时更新我的答案:)
我已经根据上面的方法制作了解决方案,但使用 git 存储库可以顺利运行。我们的想法是维护发布配置的原始 Info.plist,唯一的区别是在构建时自动生成 NSAllowsArbitraryLoads 中的 Debug。
我的 Xcode 版本是 11.3.1。有 3 个简单的步骤:
# 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
echo Info.debug.plist >> .gitignore
【讨论】: