iOS游戲開發和提交的一些「坑」和「解決方案」
鑒于在iOS類的游戲開發和提交審核的過程中老是遇到一些坑,為了避免在同一個坑里跌倒兩次,故在產生了記錄之的想法。經過了幾個月,已經積攢了十個坑,現在將其共享出來,以后將會持續更新。
我已經將本文markdown源文件放在了Github上,通過Fork和P&R來提交你的「坑」和「解決方案」,幫助我完善之。你也可以通過關注這個項目對這些「坑」保持持續關注。
-
iOS設備出現本地存檔丟失
-
描述:在蘋果設備上,當系統提示存儲空間已滿時,發現本地的存檔會丟失。
</li> -
原因:在默認情況下,本地存檔放在了/Library/Caches下面,根據蘋果官方的描述,放在/Library/Caches目錄下的任意文件將在系統彈出存儲空間將滿的警告時被系統清空。
</li> -
解決方案:將所有數據和熱更新文件放在/Library/Application Support目錄下,此目錄下的所有文件在收到空間將滿警告時不會被移除。此外,這還避免了放在Documents目錄下可能會被蘋果在審核中干掉的風險。
</li> </ul> </li> -
Apple Watch 版本提交失敗
-
描述:首次向AppStore提交帶Apple Watch的版本,提示失敗,導致提交無法繼續。
</li> -
原因:Apple Watch版本的AppIcon的PNG圖帶了Alpha通道,故被拒。
</li> -
解決方案:去除Apple Watch版本的所有AppIcon的PNG圖的Alpha通道。
</li> </ul> </li> -
Apple Watch 版本審核被拒
-
描述:Apple Watch版本提交后,在蘋果審核的階段被拒了。
</li> -
原因:在iPhone上的Apple Watch的這個應用內,我們的游戲名稱顯示為codename:xxx ios。
</li> -
解決方案:發現在Watchkit Extension的Info.plist里,Bundle name為默認的PRODUCT_ID,這就是我們的codename,將Bundle name修正為游戲名稱即可。需要注意的是Bundle name不等同于Bundle display name,前者用于系統的設置的一些顯示名稱,后者用于在Launcher的App的名稱顯示。
</li> </ul> </li> -
單機游戲內購(IAP)被破解
-
描述:根據后臺的Counter報告,我們確信我們的單機游戲內購被破解了。
</li> -
原因:一個高度可能的原因是我們把訂單編號存在本地的一個緩存文件里,每次去蘋果服務器詢問訂單是否成功時,先去此緩存文件內查找是否有相同的訂單編號,若找到則說明訂單有重復發。但是一旦玩家刪除了這個緩存文件,則可反復利用一個已經支付成功了的訂單號來反復刷了。
</li> -
解決方案:最穩妥的解決方案是將訂單編號存在服務端,然后對服務端的通信進行加密。我們采用了一種不走服務器的方法:即在首次充值成功時,給金幣的緩存文件添加一個標記位(負號),然后查詢訂單緩存文件時,先去查詢此標記位,若找到標記位,則說明之前充值過,訂單緩存文件應有內容,如果訂單緩存文件內容為空,或找不到有意義的訂單編號,則說明玩家作弊,此次充值金幣將不會加上(作弊懲罰)。由于緩存文件事先已被AES加密過,所以玩家很難去找到該標記位。
</li> </ul> </li> -
Apple Watch OS2 運行時找不到圖片
-
描述:Apple Watch OS1的版本一行代碼沒改,但運行起來卻提示圖片無法找到。
</li> -
原因:WatchKit App 下的Images.xcassets里的圖只設置了1x的圖片,2x和3x沒有設置。
</li> -
解決方案:設置好2x和3x的圖片。
</li> </ul> </li> -
用Application Loader 上傳二進制時報錯ERROR ITMS-90168: "The binary you uploaded was invalid."
-
描述:同標題。
</li> -
原因:未知,可能跟Xcode升級到7有關。
</li> -
解決方案:打開命令行,輸入以下代碼:
</li> </ul> </li> </ul>123456</div> </td>cd ~/.itmstransporterrm update_check*mv softwaresupport softwaresupport.bakcd UploadTokensrm *.token-
iOS 9以下的設備不支持ReplayKit導致無法啟動游戲
-
描述:同標題。
</li> -
原因:ReplayKit是iOS9才引入的framework,所以無法在iOS9以下的設備上使用。
</li> -
解決方案:打開Xcode,在target的Build Phases下搜索ReplayKit,把ReplayKit.framework的Status由Require改成Optional。同理,在遇到低版本iOS系統不支持的情況,比如iOS8以下不支持CloudKit,一律將framework的Status由Require改成Optional即可。
</li> </ul> </li> -
Xcode 7以上默認不支持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.。
</li> -
原因:Xcode 7以上為了安全考慮默認只支持https請求。
</li> -
解決方案:打開Xcode,編輯Info.plist或選中target的Info欄,新增字段App Transport Security Settings,將其內鍵Allow Arbitrary Loads設置值為YES。
</li> </ul> </li> -
Xcode 7 ERROR ITMS-90474: “Bundle Invalid…”
-
描述:提交二進制文件時報錯:ERROR ITMS-90474: "Bundle Invalid. iPad Multitasking support requires there orientations: 'UIInterfaceOrientationPortrait,UIIinterfaceOrientationPortraitUpsideDown,UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight'. Found 'UIInterfaceOrientationPortrait' in bundle.。
</li> -
原因:由于iOS 9引進了多任務處理,所以iOS應用必須設置其是否要求全屏顯示。
</li> -
解決方案:打開Xcode,選中target,在General一欄,將Requires full screen勾選上。
</li> </ul> </li> -
Xcode 7 ERROR UnityAds.Bundle ITMS-90535 Unexpected CFBundleExecutable Key
- 描述:提交二進制文件時報錯:ERROR UnityAds.Bundle ITMS-90535 Unexpected CFBundleExecutable Key。
- 原因:老版本的UnityAds.Bundle里包含CFBundleExecutable字段,蘋果在Xcode7之后會對其進行驗證。
- 解決方案:Xcode內搜索UnityAds,找到UnityAds.Bundle里的Info.plist,刪除其CFBundleExecutable字段即可,該字段在Xcode中顯示的名稱為:Executable file。 </ul> </li> </ul> 來自:http://wuzhiwei.net/ios_dev_trap_and_solution/
-
-
-
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關資訊
sesese色 -
-
-
-
-
-
-