蘋果在 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,如果是 Release
或 Adhoc
,就把 NSAllowsArbitraryLoads
設為 NO;如果是 Debug
就設為 YES。