雖然 iOS 9 上了一陣子了,可能 Unity 在 iOS 9 上面的問題大家都遇過或是解過了,但是就還是在這裡整理一下我遇過的問題。

效能問題

第一個最明顯的就是一樣的 build 在 iOS 9 上面效能變低很多,然後 profiler 開起來是這個非常誇張的鋸齒狀。

這個問題在論壇上面有討論了一陣子:

http://forum.unity3d.com/threads/unity-5-2-ios-performance-issues.353646/

我自己亂試的結果是把 Graphics API 從 Automatic 改成 Force OpenGL ES2,就能避開。猜測是 Unity 跟 iOS 9 上面的 Metal 不合,開到 Metal 的時候效能就會崩潰。目前針對 5.2 的用戶官方建議把 5.1.2 的 shader 塞到 5.2 裡面跑,然後等 5.3 上市。至於 4.6.X 有沒有要解決好像就沒有提了,我是就設成 OpenGL ES2 當作 workaround 掉。

App Transport Security

在 iOS 9 上面 Apple 實做了新的安全機制 App Transport Security 。主要的影響一個是要求 App 從網路上獲取資料的時候要走 HTTPS 或是加白名單,另一個是要跳轉到別的 App 的時候也要有加白名單。這個跟 Unity 關係最密切的就是 Facebook 整合會爆掉。Twitter 方面要看實作,Prime31 好像是走 iOS 內建的 twitter.framework ,升級  iOS 9 後還是正常運作。但是 Facebook 就是要依照官方的指示改 info.plist

https://developers.facebook.com/docs/ios/ios9

我本來以為 Prime31 的作者會在新版本裡面加入修改 info.plist 的選項,不過他老兄很霸氣的說應該是 Facebook 的責任要自己把連線修成 HTTPS ,所以現在還是得自己加:

http://support.prime31.com/22777/social-networking-plugin-on-ios-9?show=22777#q22777

以我之前的 Xcode Postprocessing 教學 的當作基底,可以用完全一樣的 PlistDocument 操作把這些設定加到 info.plist 。Code 大概像是:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
PlistDocument plist = _GetInfoPlistDocument (path);
PlistElementDict root = plist.root;
PlistElementDict atsDict = root.CreateDict ("NSAppTransportSecurity");
PlistElementDict domainsDict = atsDict.CreateDict ("NSExceptionDomains");
PlistElementDict fbDict = domainsDict.CreateDict ("facebook.com");
fbDict.SetBoolean ("NSIncludesSubdomains", true);
fbDict.SetBoolean ("NSThirdPartyExceptionRequiresForwardSecrecy", false);
PlistElementDict fbcdnDict = domainsDict.CreateDict ("fbcdn.net");
fbcdnDict.SetBoolean ("NSIncludesSubdomains", true);
fbcdnDict.SetBoolean ("NSThirdPartyExceptionRequiresForwardSecrecy", false);
PlistElementDict akamaihdDict = domainsDict.CreateDict ("akamaihd.net");
akamaihdDict.SetBoolean ("NSIncludesSubdomains", true);
akamaihdDict.SetBoolean ("NSThirdPartyExceptionRequiresForwardSecrecy", false);
PlistElementArray schemesArray = root.CreateArray ("LSApplicationQueriesSchemes");
// SDK v4.5 or older
schemesArray.AddString ("fbapi");
schemesArray.AddString ("fbapi20130214");
schemesArray.AddString ("fbapi20130410");
schemesArray.AddString ("fbapi20130702");
schemesArray.AddString ("fbapi20131010");
schemesArray.AddString ("fbapi20131219");
schemesArray.AddString ("fbapi20140410");
schemesArray.AddString ("fbapi20140116");
schemesArray.AddString ("fbapi20150313");
schemesArray.AddString ("fbapi20150629");
schemesArray.AddString ("fbauth");
schemesArray.AddString ("fbauth2");
schemesArray.AddString ("fb-messenger-api20140430");
// v4.6 or older
schemesArray.AddString ("fb-messenger-platform-20150128");
schemesArray.AddString ("fb-messenger-platform-20150218");
schemesArray.AddString ("fb-messenger-platform-20150305");
// v4.6.0
schemesArray.AddString ("fbapi");
schemesArray.AddString ("fb-messenger-api");
schemesArray.AddString ("fbauth2");
schemesArray.AddString ("fbshareextension");
File.WriteAllText (path, plist.WriteToString ());

如果你沒有辦法列舉所有網站的網域,例如說你接的廣告是走 HTTP 然後每次來的網域都不一樣。Apple 是有提供把 HTTPS 檢查整個關掉的選項,但是就是後果自負:

http://stackoverflow.com/questions/30739473/nsurlsession-nsurlconnection-http-load-failed-on-ios-9

選項的名稱是

NSAllowsArbitraryLoads

設定成 true 就會關掉要求 HTTPS 的防護。目前還沒有聽到有人開這個送審被 Apple 刁難的。不過未來還是沒有個準,如果主機是自己的,還是趕快找時間改走 HTTPS 吧。

BITcode

如果有 plug-in 沒有用支援 Bitcode 的選項建置,那在 Xcode 7 裡面開啟 Bitcode 就會建置失敗。這個問題在之前的 Xcode 腳本教學就有提過了,因為 Bitcode 而建置不出來的人請參考 這篇

以上