Unity打IOS版本遇到的問題
目錄
1.命令列編譯xcode工程,PROVISIONING_PROFILE和CODE_SIGN_IDENTITY怎麼找
5)連結錯誤linker command failed with exit code 1
6)解鎖鑰匙串codesign failed with exit code 1
Unity生成Xcode工程以及ipa中遇到的問題。
1.命令列編譯xcode工程,PROVISIONING_PROFILE和CODE_SIGN_IDENTITY怎麼找
命令列編譯
def build_xcode_project(current_project_path): # 編譯XCODE工程 global plistConfig try: cmd = "xcodebuild -project '" + current_project_path + "/Unity-iPhone.xcodeproj' "+\ "-configuration 'Release' -target 'Unity-iPhone' "\ "PROVISIONING_PROFILE=" +'''"'''+ dic_channel_config["iOSProvisionCode"] +'''"'''+ \ " CODE_SIGN_IDENTITY=" +'''"'''+ dic_channel_config["iOSCodeSign"] +'''"''' return execute_cmd(cmd) except Exception, e: print '\nSome error/exception occurred.' + e return False return True
其中
1.PROVISIONING_PROFILE:mobileprovision 檔案的 identifier。mobileprovision檔案 到 ~/Library/MobileDevice/Provisioning Profiles 下找。xxxxxx.mobileprovision,前面的那一長串數字xxxxx就是PROVISIONING_PROFILE的值,也就是證書的uuid。
ps:這個檔案和證書檔案是一樣的,右鍵顯示簡介可以看到所有的加入該裝置ID,如果右鍵顯示簡介顯示不出來就用命令列 security cms -D -i xxxx.mobileprovision 通過這個這個命令還能看到證書的uuid。
2.CODE_SIGN_IDENTITY: 1.在上面這個mobileprovison檔案中的右鍵簡介中看到,CERTIFICATES中的Name即是。2.或者應用程式-》實用工具-》鑰匙串,找到對應的證書,右鍵顯示簡介中的“常用名稱”。
如果證書添加了新的裝置,在mac機上雙擊證書以後, 在~/Library/MobileDevice/Provisioning Profiles 下生成新的mobileprovision檔案,因此 PROVISIONING_PROFILE 的值也要做相應的修改。否則安裝應用到新裝置的時候會提示“驗證失敗”,或者“缺少描述檔案”。
2.裝置的UDID哪裡找
1.把裝置連上Mac,開啟iTunes
點選UDID可以切換看其他資訊,需要複製,右鍵即可。
2.連上itools 顯示更多。
3.連上xcode看 。
3.Xcode的UUID值哪裡找
在終端輸入“defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID”
(手動在應用程式-Xcode-右鍵顯示包內容-info.plist裡找到DVTPlugInCompatibilityUUID 對應的value)
4. 錯誤提示為如下怎麼辦
1)Unity4XC.xcplugin
Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Unity4XC.xcplugin' not present in DVTPlugInCompatibilityUUIDs
解決辦法:找到 /Applications/Unity/PlaybackEngines/iOSSupport/Tools/OSX/Unity4XC.xcplugin ,右鍵顯示包內容-info.plist 在DVTPlugInCompatibilityUUIDs 中加入xcode的UUID。
2)PackageApplication
xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH
解決辦法:在其他xcode版本中找到 “PackageApplication”,並且copy到如下路徑:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
並且執行命令:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication
3)硬碟檔案系統格式
使用unity自動打包工具在mac上執行: Fatal Error The Project is on case sensitive file system........
工程所在的硬碟,格式化的時候設定的系統為大小寫敏感了,需要改為大小寫不敏感的檔案系統。
4)路徑名帶空格
如果說找不到目錄,看看是不是路徑中資料夾的名字有帶空格的,有的可能找不到
[Unity] Couldn't set project path to: /Volumes/TOSHIBA
原來是設定的硬碟名字帶空格 TOSHIBA XXX,所以修改一下硬碟名字。
5)連結錯誤linker command failed with exit code 1
呼叫第三方靜態庫.a庫中的中的函式,出現如下錯誤:
ld: symbol(s) not found for architecture arm64
可能的原因1:生成的.a庫的xcode選擇的架構指令集不對。
解決辦法:xcode工程,BuildSetting 下的 Architectures:
architectures:standard
validarchitecture:armv7 armv7s armv64
build的device選:Generic IOS Device
6)解鎖鑰匙串codesign failed with exit code 1
使用jenkins打版本的時候,出現如下錯誤:
XX.app: errSecInternalComponent
Command /usr/bin/codesign failed with exit code 1
可能原因1:檢視是否設定瞭解鎖鑰匙串的登陸密碼,如果沒有,在進行xcode的編譯前加上:
os.system("security unlock-keychain -p 123456") #jenkins呼叫指令碼時需要先解鎖鑰匙串,123456為版本機鑰匙串密碼
可能原因2:是否對xcode進行了開發者賬戶的一些操作,以及鑰匙串證書的一些操作,如果是,重啟mac。
5.IOS開發-證書相關概念
1. 開發者賬號:
個人類(Individual 99刀一年)
組織類(Company公司 99刀一年;Enterprise企業 299刀一年)
1)個人開發者賬號: 在上架App Store後,開發者直接顯示申請人姓名。
協作人數1人,個人使用。
每一種Apple產品,均有各類裝置各100臺測試許可權。
適合簡單的釋出一個應用,適合個人使用者。
2)公司開發者賬號: 在上架App Store後,App開發者顯示公司。
多人協作。可以進行賬號管理,可邀請多個Apple ID分不同的管理級別的許可權:
(1)Agent是團隊代理人,只能有一個,Agent賬號具有所有許可權。
(2)Admin:是管理員。具有管理Members的許可權和上傳發布app等許可權。
(3)Member:是普通開發者。只有建立測試證書(dev)的許可權,沒有建立釋出證書(dis)的許可權。
每一種Apple產品,均有各類裝置各100臺測試許可權。
希望以公司品牌來發布應用,適合公司使用者。
3)企業賬號: 不能用來上傳app store。
用這種證書打出來的包能在任何iOS裝置上執行,不需要蘋果的驗證、簽名。
希望不稽核,直接掃碼下載應用。使用企業證書釋出app有效期為12個月,假如過了有效期app則無法執行。
2. 用開發者賬號可以申請ios開發證書,和相關配置的授權。
https://developer.apple.com/account/ios/certificate/distribution
證書分類:證書是對電腦開發資格的認證,在要開發應用的電腦上必須安裝相應的證書。
開發證書(Development) :
用於開發階段真機除錯等
不僅在配置該電腦的證書可以使用,還可以生成副本安裝到多臺電腦上。(通過KeyChain)
釋出證書(Production):
用於提交到App store,或者是ad-hoc distribution):
只有配置該證書的電腦才可以使用。匯出副本也沒用。
無論是什麼開發者賬號型別,都有這兩種證書型別。
證書申請流程:https://www.jianshu.com/p/01224fc523d4
1.建立證書申請檔案(csr):鑰匙串-證書助理-從證書頒發機構請求證書。
2.上傳csr:登陸開發者網站,申請證書,選擇csr上傳。
3.完成,下載證書到本機使用。此mac機也就是配置該證書的電腦。
開發證書副本製作:https://blog.csdn.net/tieshuxianrezhang/article/details/72835963
從通過配置該證書的電腦匯出.p12檔案到別的電腦上,雙擊安裝即可。
具體證書圖示:
個人開發者賬號:組織名就是開發者的名字
Development證書
Production證書:使用者ID和組織編號一致
公司開發者賬號:組織名字是公司的名字,組織單位編號特定的編號。
Development證書:
Production證書:使用者ID和組織編號一致
3. 證書內容:公開金鑰(相當於公章)+證書名稱+數字簽名,證書具有時效性。
實用工具--鑰匙串。
證書由誰頒佈:由CA 以及 受CA信任的機構,一級機構,二級機構……
根證書:受信任的根證書的頒發機構,說明對這個ca認證中心的信任。
(windows:internet選項--內容--證書)
4. 有了相關證書,就相當於有了簽名認證,就可以
在ios真機上,開發除錯app(Development證書)了,
以及
釋出到app store (Production(Distribution)證書)上。
(只有經過簽名認證的app才能安裝到真機和釋出到appstore上)
Xcode工程設定證書路徑:XcodeTarget | BuildSetting| CodeSigning
5. AppID:一般用反域名格式,用來標識一個(explicit AppID)或一組(wildcardAppID)app。
AppID可以有多個, 在蘋果開發者賬號上申請,一般一個應用對應一個AppID。每個AppID還可以選擇對應的App服務。
在Xcode工程,需要設定BundleIdentifier為某一個設定過的AppID:XcodeTarget | Info | BundleIdentifier
(證書描述檔案 需要匹配對應的AppID)
6.證書描述檔案 provisoning profile=AppID+Devices+DevelopmenCertificate
在網站上手動建立一個 描述檔案Provisioning Profile 時,需要依次指定:
App ID(單選)、
證書(Certificates,可多選)、
裝置(Devices,可多選)
當加入新的裝置進行除錯的時候,需要在登陸蘋果開發者網站,在網頁上加入了新的DevicesID(即裝置的UDID)的時候,需要重新下載證書描述檔案,安裝到使用的機器上。
當在Xcode上,加入了開發者賬戶以後,連入一個新的裝置可以自動點選註冊該裝置,會自動更新本機的證書描述檔案了。
當Xcode啟用了Automatically manage signing,選擇了一個開發者賬號以後,會自動建立一個開發證書(會同步到網上),以及只在本機自動建立兩個描述檔案,一個是 iOS Team Provisioning Profile:* ,一個是iOS Team Provisioning Profile: 已有的appID(appID分別是*和已有的appID,證書都是該開發者賬號的所有development證書,裝置ID都是所有的設定ID)
https://www.jianshu.com/p/035ae1f1e563
描述檔案安裝位置: ~/Library/MobileDevice/Provisioning Profiles 的.mobileprovision檔案
證書型別 | 開發證書 | 釋出證書 | ||
描述檔案型別 | dev: 1.不能釋出上appstore。 2.需要新增裝置的udid到證書上。 3.可以安裝到真機上進行除錯。 |
ad-hoc: 1.需要新增裝置的udid到證書上。 2.一般用於產品上線前一週測試,用來模擬從蘋果下載的。 |
dis: 1.用於釋出到appstore上用的。 2.釋出到store上之前,不用越獄的手機裝不了。 3.不能除錯。 |
in-house: 1.不能釋出到appstore上。 2.可以安裝到任何蘋果的裝置。 |
99刀/year | 有 | 有 | 有 | 無 |
299刀/year | 有 | 無 | 有 |
描述檔案中的一些配置:
get-task-allow:能否除錯,dev描述檔案為true,其他型別為false。
aps-environment:建立證書描述檔案的時候的設定。跟後臺推送有關。
6.app和ipa:
1. app 右鍵顯示包內容,即bundle with excutable and resources
excutable:Mach-0 是ios的可執行檔案
resources:Resources資料夾
2.app和ipa
.app
Mac 下的軟體大部分都只有一個 .app 目錄,裡面包含了程式全部資源和可執行檔案。簡單來說,Mac 下的軟體就像是 Windows 下的綠色軟體一樣,解壓後即可使用,不需要安裝
.ipa
ipa 格式可以視為這種 .app 軟體的衍生物。安裝到手機上的
3.xcode生成ipa
點選Product->Archive
然後再export,export。
7.IOS打包流程
1.讀取配置檔案
比如現在打什麼渠道版本等等
2.打ab包
選出更新檔案。呼叫unity的編輯器下的靜態函式。
3.編譯UNITY工程,生成XCode工程
1.“Switch Platform”
EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.IOS) //切換平臺函式 編輯器模式下執行
EditorUserBuildSettings.activeBuildTarget //當前平臺變數
ps:This method is not available when running the Editor in batch mode. 在使用命令列呼叫執行到這個SwitchActiveBuildTarget
(BuildTarget.Android)的時候會有問題,導致 UNITY_ANDROID 巨集不生效。https://docs.unity3d.com/ScriptReference/EditorUserBuildSettings.SwitchActiveBuildTarget.html
2.“Copy PDB files” PC Mac Linux
// 匯出pdb檔案函式
EditorUserBuildSettings.SetPlatformSettings("Standalone", "CopyPDBFiles", "true");
// 不匯出pdb檔案函式
EditorUserBuildSettings.SetPlatformSettings("Standalone", "CopyPDBFiles", "false");
3.“PlayerSettings”
1)巨集定義
PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroup); //所有巨集定義 ; 分割
PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, sz); //寫入全部巨集,相當於改配置
2)app版本相關
PlayerSettings.iOS.buildNumber string型別---》playersetting介面中的"Build"
PlayerSettings.Android.bundleVersionCode int型別---》playersetting介面中的 "Bundle Version Code"
一般都用buildcount來賦值,構建次數,每進行一次build都加1,其值存在於打包的機器上,PlayerPrefs.GetInt(key名字) ,Windows機器放在登錄檔裡,Softwarre-》公司名-》產品名,Mac機器放在 ~/library/preferences/com.[公司名].[產品名].plist
安卓版本同一個app的bundleVersionCode,一定要每個釋出的版本其值要一直增大,不管是不是已經更新了版本。
ios版本同一個app的buildNumber,在版本號version不變的情況下需要一直增大build號,否則就沒有要求。
4.“Development Build” “Autoconnect Profiler”
if (EditorUserBuildSettings.development)
{
_opt |= BuildOptions.Development;
if (EditorUserBuildSettings.connectProfiler)
_opt |= BuildOptions.ConnectWithProfiler;
}
EditorUserBuildSettings.development 是否是開發版本
EditorUserBuildSettings.connectProfiler 是否連線分析器
5.“Build”
// levels The scenes to be included in the build. If empty, the currently open scene will be built. Paths are relative to the project folder (Assets/MyLevels/MyScene.unity).
// para1-locationPathName The path where the application will be built.
// para2-target The BuildTarget to build.
// para3-options Additional BuildOptions, like whether to run the built player.
BuildPipeline.BuildPlayer(EditorBuildSettings.scenes, para1, para2, para3);
4. 編譯Xcode工程,生成IPA
1.設定 MapFileParser 許可權。
MapFileParser:The MapFileParser is a utility that parser the linker map file for a few different compilers and generates a binary output file with the information that the IL2CPP runtime needs to generate correct managed stack traces.It is part of the generated Xcode project because it must run after the linker completes. You should see it run as part of a post build script in the Xcode project.
2.拷貝一些資源
icon 圖片 ==》 Unity-iPhone/Images.xcassets/LaunchImage_xx.LaunchImage
launchimage 圖片 ==》 Unity-iPhone/Images.xcassets/AppIcon.appiconset
3.載入Xcode工程修改怕配置
1)修改BuildFlag
from mod_pbxproj import XcodeProject
proj = XcodeProject.Load(current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj')
"""
<key>BuildFlags</key>
<dict>
<key>ENABLE_BITCODE</key>
<string>NO</string>
<key>ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME</key>
<string>LaunchImage_xx</string>
</dict>
"""
proj.change_setting_flag(build_flags,dic_channel_config[current_config][build_flags])
2)增加依賴庫和框架
xcode的usr/lib路徑下的庫檔案 (tbd檔案 text-based stub libraries,減少Xcode中SDK的體積)
xcode的System/Library/Frameworks/路徑下framework
以及外面目錄下的檔案
from mod_pbxproj import XcodeProject
proj = XcodeProject.Load(current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj')
"""
<key>dylibs</key>
<array>
<string>libz</string>
<string>libstdc++.6.0.9</string>
<string>libsqlite3.0</string>
</array>
<key>Frameworks</key>
<array>
<string>Security</string>
<string>SystemConfiguration</string>
<string>JavaScriptCore</string>
<string>MobileCoreServices</string>
<string>CoreTelephony</string>
<string>CoreAudio</string>
<string>WebKit</string>
</array>
<key>OtherFrameworkFiles</key>
<array>
<string>/XXPlatform/test/XXPlatform.json</string>
</array>
"""
proj.add_file('usr/lib/' + lib_need_add + '.tbd', parent='Frameworks', tree='SDKROOT')
proj.add_file('System/Library/Frameworks/' + framwork_need_add + '.framework', parent='Frameworks', tree='SDKROOT')
proj.add_file(cur_path + '/' + other_framwork_need_add, parent='Frameworks', tree='SDKROOT')
3)增加LDFlag
from mod_pbxproj import XcodeProject
proj = XcodeProject.Load(current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj')
"""
<key>OtherLDFlags</key>
<array>
<string>-ObjC</string>
<string>-lc++.1</string>
<string>-liconv</string>
<string>-lz</string>
</array>
"""
proj.add_other_ldflags(other_flags)
4)修改C++ standard Library
"""
# 將unity5預設生成的C++ standard Library由libc++改為libstdc++
cmd = sed
-i s/CLANG_CXX_LIBRARY =libc++;
/CLANG_CXX_LIBRARY =libstdc++;
/g current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj'
"""
cmd = "sed -i '' 's/CLANG_CXX_LIBRARY = "'"libc++"'";/CLANG_CXX_LIBRARY = "'"libstdc++"'";/g' " + current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj'
if not execute_cmd(cmd):
print "manual sign fail"
return False
4.Build Xcode
def build_xcode_project(current_project_path):
# 編譯XCODE工程
global plistConfig
try:
cmd = "xcodebuild -project '" + current_project_path + "/Unity-iPhone.xcodeproj' -configuration 'Release' -target 'Unity-iPhone' PROVISIONING_PROFILE=" +'''"'''+ dic_channel_config["iOSProvisionCode"] +'''"'''+ " CODE_SIGN_IDENTITY=" +'''"'''+ dic_channel_config["iOSCodeSign"] +'''"'''
return execute_cmd(cmd)
except Exception, e:
print '\nSome error/exception occurred.' + e
return False
return True
5.生成IPA https://bugly.qq.com/docs/
def generate_ipa(current_project_path, timestamp, ipaFolder, final_path):
# 生成IPA
appname = plistConfig["AppOutputName"] + ".app"
cmd = "/usr/bin/xcrun -sdk iphoneos PackageApplication -v '" + current_project_path+ "/build/Release-iphoneos/" + appname + "' -o '" + final_path + "mldj-" + current_channel_name +"-" + timestamp + ".ipa" + "'"
return execute_cmd(cmd)
6.生成符號表檔案,上傳bugly https://bugly.qq.com/docs/
cmd = "java -jar " + jar_path + " -i " + dsym_path + " -u -o " + symbols_zip_file+ " -package:" + bundle_id +" -version " + bugly_version_info
execute_command(cmd)
java -jar + buglySymboliOS.jar bugly庫
-i xx.dSYM xcode生成的除錯資訊檔案,用來生成符號表檔案
-u 上傳開關,上傳生成的符號表檔案
-o Symbols.zip 輸出的 生成的符號表檔案
-package:com.xx.xx BundleIndentifier
-version 1.10.5_867 version號_build號
找不同版本的unitymanual
https://docs.unity3d.com/Manual/index.html 當前版本
https://docs.unity3d.com/550/Documentation/Manual/index.html 5.5版本 對應修改數字即可