1. 程式人生 > >Xcode7.2與iOS9之坑 (持續更新)

Xcode7.2與iOS9之坑 (持續更新)

前幾天升級OS X EI Capitan 10.11.1, 以及Xcode7.1,正好趕上公司新產品上線,要做iOS9的適配,遇到各種坑,各種查資料,隨之記錄總結一下遇到的坑.

先說下要適配iOS9要做的事:

1.更改http為https

兩種方案:

一.公司後臺伺服器更改;

二.作為開發者,可在Xcode暫時退回到http協議.  開發者更改方法如下:

1.在Info.plist中新增App Transport Security Settings (或NSAppTransportSecurity), 型別Dictionary。
2.在App Transport Security Settings下新增Allow Arbitrary Loads (或NSAllowsArbitraryLoads), 型別Boolean,值設為YES.

2.對於使用ShareSDK第三方登入或分享,對iOS9的適配

包括:https協議支援,關閉bitcode支援,新增Scheme白名單.

您的 App 正在使用廣告識別符號 (IDFA)。您必須先提供關於 IDFA 的使用資訊或將其從 App 中移除,然後再上傳您的二進位制檔案。 

ShareSDK裡面自帶sina的原生SDK, 要刪掉SDK extend裡面 sina的所有檔案, 再打包上傳就可以. (刪掉後新浪微博還可以分享)

可用終端命令:

grep -r advertisingIdentifier .

檢測這個.a檔案

3.Xcode7報錯:Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:]

    從iOS9開始,Xcode7需要所有UIWindow在makeKeyAndVisible之前必須有一個rootViewController,否則報以上錯誤。

    解決方案:

UIViewController *emptyView = [[UIViewController allocinit];

    self.window.rootViewController = emptyView;

    [self.window makeKeyAndVisible];

4.Xcode7開啟舊專案FrameWork資料夾下的.dylib庫缺失,新增方法

     專案Target中Link Binary With Libraries  點選下方 “+”新增,  顯示搜尋頁面,在此搜.dylib搜不出來(只能搜到同名的.tbd), 需點選 Add Other,出現檔案目錄頁面 (正常情況通過Finder同樣找不到.dylib檔案,因該檔案是隱藏檔案。需按快捷鍵 CMD+Shift+G,輸入/usr/lib

後進入隱藏介面,然後新增需要的.dylib即可。

5.Xcode7 真機測試,真機出現"unavailable"字樣,Could not find developer disk image.

stackoverflower答案: 點選檢視

解決方案:
先關閉Xcode.再從Xcode 6.4中,拷貝8.4 (12H141)資料夾到Xcode 7的對應目錄下.
Xcode 6.4路徑為:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

Xcode 7路徑為:
/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
重新開啟Xcode 7,開啟專案,需要等一會,等到菊花不轉了,才能執行。

6.App上傳Appstore錯誤

ERROR ITMS-90049:"This bundle is invalid. The bundle identifier contains disallowed characters. [See the section of the Application Programming Guide entitled The Application Bundle.]" 解決方案:   在專案導航欄搜尋Info.plist檔案 查詢第三方的info.plist檔案,如ShareSDK中的騰訊Bundle檔案下的Info.plist檔案。 在該檔案下新增或者修改以下幾個欄位:
  • Bundle version
  • Bundle identifier
  • Bundle versions string, short
需要和系統自帶的Info.plist檔案一樣。 如下圖

7.App上傳Appstore錯誤

invalid package Applications built with SDK 9.0 or later must be packaged as proper IPA files.

解決方案: 按照錯誤提示原先上傳的是.zip檔案,現在需要上傳 .ipa檔案。也就是需要將打包成的app在打包成ipa檔案就可以了。 具體步驟: 1、新建資料夾 Payload  2、將xcode編譯好的app放在Payload資料夾中 3、壓縮Payload資料夾為 .zip檔案,然後重新命名為 .ipa  重新上傳即可 附快捷shell指令碼:  將指令碼放在Release-iphones資料夾下,執行該指令碼就可將app轉換為ipa。
1 2 3 4 5 6 7 8 9 10 #!/bin/bash APPNAME="appName" ZIPNAME="zipName" IPANAME="ipaName" mkdir ./ipa/Payload cp -r ./${APPNAME}.app ./ipa/Payload cd ipa zip -r ${ZIPNAME} * mv ${ZIPNAME}.zip ${IPANAME}.ipa

8.App上傳Appstore錯誤

ERROR ITMS-90535 Unexpected CFBundleExecutable Key. 

 解決方案:

1,用XCode 6.4的Product -> Archive,再提交到AppStore。
2,在Stackoverflow上也有相關的解決辦法,就是把無用的CFBundle刪除掉。點選檢視
在工程裡面搜尋info.plist,可以先搜尋info,找到第三方的info.plist檔案,刪除裡面的Executable file對應的一整行,包括值。 例如:找到騰訊的info.plist   刪除箭頭指向的一行,即可. 9.未解決問題,哪位大神看到 <1> 真機執行啟動時崩潰,並非100%出現,出現率在80%左右,不清楚是什麼原因,有知道的解答一下或者給個思路 dyld`gdb_image_notifier:

 ->  0x2be590cc <+0>: bx     lr

 在網上看到的答案:

選 Project,然後進 BuildPhases,然後進 LinkBinaryWithLibraries. 找到 GLKit.Framework ,把它的 status 更改為 optional 就 ok.(如果沒有GLKit.Framework, 新增一個再設定)

因bug無法重現,無法驗證以上方法是否可行. (有同行夥伴親測此方法可行)

<2>Xcode7.1真機測試啟動崩潰,模擬器正常,新增Enable Address Sanitizer除錯,崩潰在啟動頁.

libclang_rt.asan_ios_dynamic.dylib`__asan::AsanDie:
->  0x5e8240 <+0>:   push   {r4, r5, r7, lr}  //程式碼崩潰在此行
    0x5e8242 <+2>:   add    r7, sp, #0x8
    0x5e8244 <+4>:   dmb    ish

列印資訊如下:

AddressSanitizer debugger support is active. Memory error breakpoint has been installed and you can now use the 'memory history' command.
==891==Shadow memory range interleaves with an existing memory mapping. ASan cannot proceed correctly. ABORTING.
==891==ASan shadow was supposed to be located in the [0x3ffff000-0x5fffffff] range.
==891==Process memory map follows:

------後面部分省略

目前的解決辦法:

開啟

把Enable Address Sanitizer 取消