iOS游戲開發(fā)和提交的一些「坑」和「解決方案」
鑒于在iOS類的游戲開發(fā)和提交審核的過程中老是遇到一些坑,為了避免在同一個坑里跌倒兩次,故在產(chǎn)生了記錄之的想法。經(jīng)過了幾個月,已經(jīng)積攢了十個坑,現(xiàn)在將其共享出來,以后將會持續(xù)更新。
我已經(jīng)將本文markdown源文件放在了Github上,通過Fork和P&R來提交你的「坑」和「解決方案」,幫助我完善之。你也可以通過關(guān)注這個項目對這些「坑」保持持續(xù)關(guān)注。
iOS設(shè)備出現(xiàn)本地存檔丟失
描述:在蘋果設(shè)備上,當(dāng)系統(tǒng)提示存儲空間已滿時,發(fā)現(xiàn)本地的存檔會丟失。
原因:在默認(rèn)情況下,本地存檔放在了/Library/Caches下面,根據(jù)蘋果官方的描述,放在/Library/Caches目錄下的任意文件將在系統(tǒng)彈出存儲空間將滿的警告時被系統(tǒng)清空。
解決方案:將所有數(shù)據(jù)和熱更新文件放在/Library/Application Support目錄下,此目錄下的所有文件在收到空間將滿警告時不會被移除。此外,這還避免了放在Documents目錄下可能會被蘋果在審核中干掉的風(fēng)險。
Apple Watch 版本提交失敗
描述:***向AppStore提交帶Apple Watch的版本,提示失敗,導(dǎo)致提交無法繼續(xù)。
原因:Apple Watch版本的AppIcon的PNG圖帶了Alpha通道,故被拒。
解決方案:去除Apple Watch版本的所有AppIcon的PNG圖的Alpha通道。
Apple Watch 版本審核被拒
描述:Apple Watch版本提交后,在蘋果審核的階段被拒了。
原因:在iPhone上的Apple Watch的這個應(yīng)用內(nèi),我們的游戲名稱顯示為codename:xxx ios。
解決方案:發(fā)現(xiàn)在Watchkit Extension的Info.plist里,Bundle name為默認(rèn)的PRODUCT_ID,這就是我們的codename,將Bundle name修正為游戲名稱即可。需要注意的是Bundle name不等同于Bundle display name,前者用于系統(tǒng)的設(shè)置的一些顯示名稱,后者用于在Launcher的App的名稱顯示。
單機(jī)游戲內(nèi)購(IAP)被破解
描述:根據(jù)后臺的Counter報告,我們確信我們的單機(jī)游戲內(nèi)購被破解了。
原因:一個高度可能的原因是我們把訂單編號存在本地的一個緩存文件里,每次去蘋果服務(wù)器詢問訂單是否成功時,先去此緩存文件內(nèi)查找是否有相同的訂單編號,若找到則說明訂單有重復(fù)發(fā)。但是一旦玩家刪除了這個緩存文件,則可反復(fù)利用一個已經(jīng)支付成功了的訂單號來反復(fù)刷了。
解決方案:最穩(wěn)妥的解決方案是將訂單編號存在服務(wù)端,然后對服務(wù)端的通信進(jìn)行加密。我們采用了一種不走服務(wù)器的方法:即在***充值成功時,給金幣的緩存文件添加一個標(biāo)記位(負(fù)號),然后查詢訂單緩存文件時,先去查詢此標(biāo)記位,若找到標(biāo)記位,則說明之前充值過,訂單緩存文件應(yīng)有內(nèi)容,如果訂單緩存文件內(nèi)容為空,或找不到有意義的訂單編號,則說明玩家作弊,此次充值金幣將不會加上(作弊懲罰)。由于緩存文件事先已被AES加密過,所以玩家很難去找到該標(biāo)記位。
Apple Watch OS2 運行時找不到圖片
描述:Apple Watch OS1的版本一行代碼沒改,但運行起來卻提示圖片無法找到。
原因:WatchKit App 下的Images.xcassets里的圖只設(shè)置了1x的圖片,2x和3x沒有設(shè)置。
解決方案:設(shè)置好2x和3x的圖片。
用Application Loader 上傳二進(jìn)制時報錯ERROR ITMS-90168: "The binary you uploaded was invalid."
描述:同標(biāo)題。
原因:未知,可能跟Xcode升級到7有關(guān)。
解決方案:打開命令行,輸入以下代碼:
- cd ~/.itmstransporter
- rm update_check*
- mv softwaresupport softwaresupport.bak
- cd UploadTokens
- rm *.token
iOS 9 以下的設(shè)備不支持ReplayKit導(dǎo)致無法啟動游戲
描述:同標(biāo)題。
原因:ReplayKit是iOS9才引入的framework,所以無法在iOS9以下的設(shè)備上使用。
解決方案:打開Xcode,在target的Build Phases下搜索ReplayKit,把ReplayKit.framework的Status由Require改成Optional。同理,在遇到低版本iOS系統(tǒng)不支持的情況,比如iOS8以下不支持CloudKit,一律將framework的Status由Require改成Optional即可。
Xcode 7以上默認(rèn)不支持http請求
描述:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.。
原因:Xcode 7以上為了安全考慮默認(rèn)只支持https請求。
解決方案:打開Xcode,編輯Info.plist或選中target的Info欄,新增字段App Transport Security Settings,將其內(nèi)鍵Allow Arbitrary Loads設(shè)置值為YES。
Xcode 7 ERROR ITMS-90474: “Bundle Invalid…”
描述:提交二進(jìn)制文件時報錯:ERROR ITMS-90474: "Bundle Invalid. iPad Multitasking support requires there orientations: 'UIInterfaceOrientationPortrait,UIIinterfaceOrientationPortraitUpsideDown,UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight'. Found 'UIInterfaceOrientationPortrait' in bundle.。
原因:由于iOS 9引進(jìn)了多任務(wù)處理,所以iOS應(yīng)用必須設(shè)置其是否要求全屏顯示。
解決方案:打開Xcode,選中target,在General一欄,將Requires full screen勾選上。
Xcode 7 ERROR UnityAds.Bundle ITMS-90535 Unexpected CFBundleExecutable Key
描述:提交二進(jìn)制文件時報錯:ERROR UnityAds.Bundle ITMS-90535 Unexpected CFBundleExecutable Key。
原因:老版本的UnityAds.Bundle里包含CFBundleExecutable字段,蘋果在Xcode7之后會對其進(jìn)行驗證。
解決方案:Xcode內(nèi)搜索UnityAds,找到UnityAds.Bundle里的Info.plist,刪除其CFBundleExecutable字段即可,該字段在Xcode中顯示的名稱為:Executable file。