前言:各類證書生產就不贅訴
公司或個人開發者證書與企業開發者證書的申請和發布不同之處在于用企業賬號申請的證書不需要添加設備的UUID進證書里面,而其他賬號申請的證書需要添設備的UUID,設備才可以使用。
開發(Development)證書用于測試環境下使用,可以直接安裝到手機上(不用提交到Appstore),但一個描述文件最多只能綁定100臺設備(因此通過這種證書正式發布應用是行不通的)。
打包測試iPa 選中Product-Archive(注意選擇前把各種斷點去掉)
證書的使用
如果開發者B,登錄開發者賬號,下載證書(cer文件)運行,只有證書沒有私鑰,是不能正常使用的。所以如果有新同事加入到開發組的時候,應該從本地鑰匙串中選擇證書,一定要記得展開證書那一條顯示出私鑰并將兩行都選中,右鍵導出2項,輸入密碼之后就生成p12文件(包含證書和私鑰)給同事。
另外可以給同事一份描述文件(Provisioning Profiles),用于本地開發識別測試設備。
需要強調一點,證書和項目關系其實并不大,證書一般有效期只有一年,當證書過期后,只需要重新生成一份證書,上傳到開發者賬號
就行,同時因為原有證書過期,需要重新生成Provisioning Profiles
文件。然后給同事們最新的p12文件和Provisioning Profiles文件就行
所以開發者賬號
中的證書,配置文件是可以放心操作的(比如誤刪了,或者找不到證書私鑰了)
·
證書過期/即將過期
疑問一:證書過期了,會影響到 AppStore 上面的應用嗎?
答:證書過期不會影響已上架 AppStore 應用,但是推送會出問題,更新推送證書也不用下架重新發布,可以重新生成,只要保證 developer.apple.com 中那個 APP ID 的推送證書和推送服務器上的一致即可。但是賬號欠費的話應用會被下架。
疑問二:證書過期了/即將過期怎么辦?
答:首先,打開密鑰中心,生成一個CSR(證書請求)。然后,到Apple Center把證書revoke,然后新建一個,新建的將會默認是剛剛revoke的證書的所有設置的。把下載回來的證書導出一份p12格式的保存起來(因為如果其他人需要的時候,只能跟你拿了,在Apple Center下載的用不了的。原因是還需要你電腦的密鑰)然后去provision profile edit 一下,從新下載,替換掉原來的。你就可以繼續開發了。不需要提交新 App 到 AppStore。
??官方資料
Provisioning Profiles 描述文件
在這里,我引用別人的一段話,因為覺得寫得很喜感,但又很實在。
我想這個界面一彈出來的時候,蛋蛋憂傷迎面撲來。然后怒點 Fix issue,然后你們團隊負責管理證書的基友突然發現證書中心多了好多好亂的證書以及描述文件,然后他爆了一句:what the f××k!刪掉了帶有Xcode *的證書以及描述文件,然后自己又暴力的點了一發Fix issue,然后你突然調試不了了,再暴擊Fix issue鍵,最后整個團隊都只有通過Fix issue來真機調試了…
所以慎點Fix issue,如果點擊這個選項,聰明的(蠢哭的)Xcode就會自己管理描述文件,然后各種莫名其妙的帶有Xcode *的證書以及描述文件…
其實只要堅信一點,證書、設備ID、AppID、描述文件都弄對了就絕逼不會出問題的!
描述文件過期
蘋果官方文檔寫明,企業證書有效期是3年,而描述文件只有1年有效期。所以當你的描述文件過期(expire)時。不用慌張,我看到網上好多朋友說刪除重新生成,其實不用這么麻煩,只需要3步完成:點擊過期的描述文件展開詳情界面
-點擊Edit按鈕
-點擊Generate按鈕
打包安裝失敗
前言:iOS 的內測應用在安裝時,很多人都遇到過安裝失敗的情況,安裝失敗的原因比較多,下面將一些常見原因總結如下,方便開發者進行排查。在 iOS 9 中啟動應用時,出現提示“未受信任的企業級開發者”這樣問題是因為在 iOS 9 以后的版本中,蘋果對企業簽名的應用做了更嚴格了限制。在 iOS 9 中點擊“安裝”按鈕后,沒有彈出“是否安裝”的提示這個問題是因為 iOS 9 的一個 Bug 導致的。出現這個問題的前提,一般是由于用戶已經從蘋果官方 App Store 上安裝了相同的應用。
【解決辦法】
先在設備中刪除之前已經安裝的應用,然后再從托管平臺安裝即可。
為什么在 iOS 9 中,點擊“安裝”按鈕后,沒有任何反應,桌面也沒有出現應用圖標,但是狀態欄上的網絡圖標在轉這是由于 iOS 9 中的一個 Bug 造成的。雖然看上去沒有反應,其實應用已經在后臺開始下載并安裝了,狀態欄上的網絡圖標在轉就是一個證明。這個時候,只要多等待一會兒就好了,應用安裝完成之后會在桌面上顯示出來的。
應用安裝過程中提示"無法下載應用程序"
原因一:在導出 iOS App 的安裝包文件( .ipa 文件)時,選擇了 App-Store 方式。
在導出 iOS 的.ipa文件時,有些開發者選擇了App-Store方式,這種方式導出的.ipa文件,只適合于上傳到蘋果App Store,并不能通過托管平臺來安裝。如果是這種方式導出的.ipa文件,傳到托管平臺上是不能通過安裝的。
原因二:在導出 iOS App 的安裝包文件( .ipa 文件)時,選擇了 Ad-hoc 方式,但是沒有添加設備 UDID 。
在導出 iOS 的安裝包文件時,如果選擇了Ad-hoc方式(一般用于蘋果個人開發者賬戶),那么,如果要某臺設備可以安裝,則必須要將這臺設備的UDID
添加到導出安裝包時所用的證書文件中(.mobileprovision
文件),才可以在這臺設備上安裝。使用Ad-hoc方式導出的安裝包文件上傳到托管平臺后,托管平臺會顯示為內測版,同時會在應用管理中,顯示出該安裝包的證書中包含的UDID列表。開發者可以根據顯示出的UDID列表,來排查某臺設備的UDID有沒有被添加到安裝包的證書中。
原因三:在導出 iOS App 的安裝包文件( .ipa 文件)時,選擇了 In-house 方式,但是證書已過期或被撤銷。
在導出 iOS 的安裝包文件時,如果選擇了In-house
方式(一般用于蘋果企業開發者賬戶),此時,如果出現無法安裝的情況,開發者可以檢查一下自己的企業開發者證書是否已過期或被撤銷。因為蘋果對于企業開發者證書管理較為嚴格,所以開發者如果使用不當,可能會導致企業證書被封,被封后的企業證書導出的安裝包,也是無法正確安裝的。
原因四:開發者在生成App安裝包時,沒有在 Xcode 中設置正確的 Architecture 。
iOS 應用的Architecture(架構),決定了這款 iOS 應用可以在哪些設備機型上安裝。例如,如果某個應用在 Xcode 中只添加了 arm64 這一種Architecture
,那么最終打包后的安裝包文件上傳到托管平臺后,對于 iPad mini、iPhone5 等以下設備,都是無法安裝的(因為這些設備都不是 arm64 架構)。換句話說,如果需要在某個設備上可以安裝,App 就必須支持那個設備的Architecture
。所以,正確的解決方法是,在生成 App 安裝包時,盡可能讓 App 支持更多的Architecture。
具體操作方法是:在Xcode-Build Settings-Architecture中,增加 armv7、armv7s、arm64,以便所有設備都可以安裝。然后,將"Build active architecture only"設置為NO。對于各個 iOS 設備支持的Architecture
類型。請點擊這里查看。
原因五:App 支持的 iOS 系統版本,和當前設備系統版本不符。
打包時 App 選擇支持的 iOS 系統版本過低或者過高,都可能導致 App 無法安裝成功。例如,如果某個 App 設置了只支持 iOS 7.0 以上的系統時,那么,如果在 iOS 6.1 系統上安裝時,肯定是無法安裝成功。
因此,我們應該盡量讓 App 盡可能支持更寬泛的系統版本。
具體操作方式是:在Xcode-General-Deployment Info-Deployment Target
中,給 App 設置一個盡量低的版本,例如 iOS 5.0。
原因六:開發者上傳的是一個破解的 ipa 安裝包,或者是一個使用破解 Xcode 方式打包生成的 ipa 安裝包,或者是通過 iTunes 生成的 ipa 安裝包。
通過任何非 Xcode(或 Xcode 的命令行工具)生成的安裝包,都是沒有辦法正確在設備上安裝的(越獄設備除外)。
常見的不正確的打包 ipa 的方式有:通過 iTunes 導出安裝包文件、通過 iTools 導出安裝包文件等等。這種類型的 App 上傳到托管平臺后,會顯示未簽名的標簽提示。
【正確的方法】
使用一個正常的蘋果開發者證書,通過未破解的 Xcode 打包生成 ipa 安裝包。
原因七:設備上已經安裝了這個App,且已經安裝的 App 和要安裝的 App 是用不同證書打包的。
這種情況下,也會造成 App 安裝失敗。解決的方式很簡單,開發者只需將設備上原來已經安裝的 App 刪除,再重新安裝新的 App 即可。
原因八:Info.plist 文件中的LSRequiresIPhoneOS 沒有設置,或者設置了 NO。對于 iOS 的 App 來說,如果Info.plist文件中的LSRequiresIPhoneOS
沒有設置,或者設置了NO,那么由 Xcode 導出的安裝包(.ipa包),就不會包含Payload文件夾,而是被一個叫做Applications的文件夾代替。這樣的安裝包在安裝時,會被 iOS 判定為無效的安裝包,所以無法被正確安裝。
【解決方式】
只需要將Info.plist文件中的LSRequiresIPhoneOS設置為YES,然后重新打包即可。具體操作為:在 Xcode 中打開Info.plist文件,然后檢查LSRequiresIPhoneOS是否已設置,如果沒有設置,就添加一個,然后將LSRequiresIPhoneOS的類型設置為Boolean,值設置為 YES。設置好以后,可以看到Info.plist文件中顯示Application requires iPhone environment的值為YES。
原因九:網絡出現中斷或異常。
遇到這種情況,用戶可檢查自己手機的所連接的網絡是否穩定、速度是否正常等。可以嘗試一下其他網站,或者更換一個 Wi-Fi,或者由 Wi-Fi 換成 3G/4G 等,然后重新安裝。
【托管平臺】: 托管平臺是指將APP發布于第三方平臺上面,供用戶安裝測試。常見的托管平臺有蒲公英以及FIR
【App-Store】: App-Store版,用于發布到蘋果商店
【Ad-hoc】: 內測版,用于內部指定設備使用
【In-house】: 企業版,可在任何設備上安裝,但不能濫用
打包遇到找不到頭文件問題(不常見)
問題描述: 在debug模式下編譯運行沒有問題,打包時在release時,product->Archive時編譯找不到頭文件
項目中報錯找不到.h或者.m文件解決方法(常見問題)
- 在項目中本身就不存在,或者在本地沒有加入項目
- 如果是協作開發,可能小伙伴沒有提交到遠程倉庫,導致你工程沒有,解決就是先更新在添加進入工程
- 在Founder本地,需要手動添加到工程
- 出現這個問題會特別蛋疼,明明存在該文件,但是一直報錯。
- 確認是否存在改文件,文件是否在拖進項目時是否勾選上Copy items if needed
- 在點擊Target,選擇項目,在Build Setting下面的Other Linker Flag 中添加 -all_load,這個是強制加載文件
- 在Build Setting 中找到Search Paths, 添加$(SRCROOT)/項目名稱/存放該文件的文件夾,可以有多級文件目錄,這個$(SRCROOT)是系統環境變量,類似PHP中FILE可以獲得當前文件的文件的路徑。
- 清除Xcode緩存,Xcode有緩存,可能會導致文件加進來的,但是找不文件。除了在通過Clean,還可以下面方方式來操作:找到位于 /User/用名/Library/Developer/Xcode/DerivedData文件夾下面的所有文件情況,然后重啟Xcode,注意不要刪除DerivedData文件哦。
- 在Build Phases下面的Compile Sources里面檢查一下你的文件存不存在,如果不存在就添加。這里需要說明一下,如果你的項目中出現Duplicate 文件.o保存,一般都是你重復引用文件,在Build Phases下面的Compile Sources 里面檢查該文件,是否是重復,如果重復把重復的去掉。
上架一些問題處理
- app 提交后正在審核,這時發現重大bug,可以采取撤回審核。具體怎么解決呢?
- 在binary details里邊 reject按鈕 直接reject即可。重新上傳之后需要新排隊。
- 如果輕微bug 還是先上架在迭代實為上策
下架
- 在itunesconnect詳情里面找到rights and pricing按鈕選擇specific stores然后選擇Deselect all取消所有地區選擇后,詳情里就能看到delete app按鈕了。這是最佳的下架做法
- other 匯總
問題一:
這個問題就是你Xcode上設置的bundleID與證書上的bundleID不一致導致的,把他們修改一樣都好了。
問題二:
這個問題有很多的答案,我只提供一個大多數能解決方法
1.在鑰匙串訪問>鑰匙串修改Apple Worldwide Developer Relations Certification Authority證書:右鍵顯示簡介調整"總是信任" 為 "系統默認"。
2.刪除已過期的Apple Worldwide Developer Relations Certification Authority證書,并下載新的Apple Worldwide Developer Relations Certification Authority證書,雙擊安裝。
3.刪除相關的 provisioning profiles,然后重新添加。(Xcode中的證書配置文件路徑:~/Library/MobileDevice/Provisioning Profiles)
問題三:
Getting ITMS-4238 “Redundant Binary Upload” error no mater what I change the build version or app version tobe higher
這個是已經上傳了同一個版本的APP了,不能再繼續上傳,如果需要重新上傳,就需要改版本號。
問題四:
iPhone App Submitting - Error ITMS-90171 Invalid Bundle Structure Can't Contain Standalone Executables
這個是引入的第三方framework所帶的資源包有問題,有可能是bundle里info.plist使用到的資源在bundle里沒有
問題五:
ERROR ITMS-90474: "Bundle Invalid. iPad Multitasking support requires there orientations: 'UIInterfaceOrientationPortrait,UIIinterfaceOrientationPortraitUpsideDown,UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight'. Found 'UIInterfaceOrientationPortrait' in bundle.
在 TARGETS > iOS > General > Deployment Info 勾選 “Requires full screen”
問題六:
ERROR ITMS-90542: "Invalid CFBundleSupportedPlatforms value. The key 'CFBundleSupportedPlatforms' in the Info.plist file in bundle 'Payload/PgapIos.app/GoogleMaps.bundle' contains an invalid value '( "iPhoneSimulator" )'.
這個是編譯bundle的時候,是用模擬器來編譯的,解決方法是:在編譯bundle的時候選擇真機
ERROR ITMS-90086: Missing 64-bit support. Submission fails with error on submit app on iTunes
在 build settings 中的Valid Architectures, 添加arm64讓APP支持 64位的機器。XCode7不會有這種情況
問題七:
ERROR ITMS-90535 Unexpected CFBundleExecutable
在我這里是因為我的bundle里是生成了一個可執行文件,從新做一個bundle文件,注意bundle項目Build Settings 中的Mach-o Type 要選擇 Static Library。如果是第三方的就把bundle里info.plist的 Executable file字段刪除掉(我自己的bundle如果刪除,上傳的時候會提示bundle是損壞的),然后重新打包。
問題八:
ERROR ITMS-90034: Missing or invalid signature
這個其實還是因為bundle里有個可執行文件,在打包的時候沒能進行簽名導致的。
問題九:
ERROR ITMS-90096:"You binary is not optimized for iPhone 5....".
在工程里的Images.xcassets添加并設置LaunchImage對解決ERROR ITMS-90096根本不會起到任何作用,需要單獨添加針對iPhone 5的載入圖片。關鍵點有三項:1、圖片的名稱必須叫Default-568.png。2、必須把圖片放在工程的根目錄下。3、圖片尺寸必須是320*568。
然后在plist中添加
問題十:
使用Application Loader 上傳ipa出現的錯誤提示“application loader上傳出錯 生成的API分析文件太大”解決方法:解決辦法就是修改Xcode里面的Build
問題十一:
在Archive項目 時,出現了“Your build settings specify a provisioning profile with the UUID “487F3EAC-05FB-4A2A-9EA0-31F1F35760EB”, however, no such provisioning profile was found”的出錯。一直提示指定UUID的provisioning profile找不到,感覺很奇怪。明明自己的provisioning profile是剛下載好的,并且全是新安裝。于是通過谷歌找到了答案。
參考地址:http://stackoverflow.com/questions/1760518/codesign-error-provisioning-profile-cannot-be-found-after-deleting-expired-prof
這里所說的就是要通過修改你的項目的.xcodeproj文件來解決上述的錯誤。
1.找到項目中的*.xcodeproj文件,點擊右鍵,show package contents(打開包內容)。
2.打開后找到project.pbxproj文件,用文本編輯器打開。其實就是右鍵,點擊open就好了。
3.打開這個文件后,按command+F,在這個文件中查找“PROVISIONING_PROFILE",找到和這個“
PROVISIONING_PROFILE="487F3EAC-05FB-4A2A-9EA0-31F1F35760EB";"PROVISIONING_PROFILE[sdk=iphoneos]"="487F3EAC-05FB-4A2A-9EA0-31F1F35760EB";”類似的都刪除。(注意:只刪除雙引號里面的487F3EAC-05FB-4A2A-9EA0-31F1F35760EB就可以了)
問題十二:
在要上傳的包上右鍵[Show in Finder]然后依次展開[xxxx.xcarchive][Products][Applications][xxxx] // xxxx–項目名
然后搜索所有的info.plist
找到是哪個plist含有[CFBundleSupportedPlatforms]屬性,看是那個三方庫包含的這個plist,然后到Xcode里面刪除該屬性。
問題十三:
這個原因也有多種,一個出現比較多的原因就是,你之前安裝的描述文件沒有包含推送證書。重新登錄到開發者中心,查看描述文件。
你會發現Status變成的狀態是黃色的(正常是綠色),如下圖。
點擊Edit,然后選擇Cenerate就行了。最后把描述文件下載,安裝。
版本迭代
Version:是上架的版本號。Build:是本地顯示版本號。
- 版本更新迭代就是更改了上架版本號Version。之前我的是1.0.0,首次修改了部分功能BUG,我修改為1.0.1。
- 進入iTunes提交頁面,添加”版本或平臺“!
- detailFunc
最后,Xcode集成了APPlication Loader 工具,傳說上傳更迅速好用,期待以后用一下