Nelson 寫些 iOS 開發的東東

如何在 Debug mode 自動停用 ATS

| Comments

蘋果在 WWDC 2015 上發表了 App Transport Security (ATS),大力推廣網路安全連線。對於這樣的發展,我個人是樂見其成的,也相信在蘋果的影響力之下,安全連線也會進一步的普及。

不過對工程師來說,這代表你又要修改程式,以便符合蘋果規範了。在修改的過程中,我就遇到了一個問題:Release 版的 app 是會走安全連線的,但在 Debug 的時候它是連到本機(localhost),這不是安全連線。該怎麼讓它在 Release / Debug 都能正常連線呢?

因為 ATS 的設定是寫在 Info.plist 裡頭,所以最直覺的想法就是建立兩份 plist 分別給 Release / Debug 用。但實際情況是,這兩份 plist 的重複性會很高,而且你得隨時維護彼此之間的設定同步。一聽就知道這樣很容易出現人為失誤,不妥!

還好我找到另一個解決辦法,測試之後確實有效。

1.

Info.plist 裡頭寫入你的 ATS 設定,在這裡要注意的是,一定要包含 NSAllowsArbitraryLoads 這筆鍵值,至於它的值是 YES 或 NO 倒是無所謂,因為我們等一下會自動判斷要設為什麼值。

2.

選擇你的 target,切換到 Build Phases 分頁,點擊 + 按鈕並選擇 New Run Script Phase,新增的這個 script 名稱你可以自訂。

3.

script 內容如下:

#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

它做的事情就是去判斷你目前的 build mode,如果是 ReleaseAdhoc,就把 NSAllowsArbitraryLoads 設為 NO;如果是 Debug 就設為 YES。


同場加映:如何正確設定 AFNetworking 的安全連線

xcode ATS

Comments

comments powered by Disqus