Unity 自動打包 Part1—配置Xcode工程
目錄
0.最近更新
新增微信SDK匯出,修改xcode工程 新增plist scheme。
1.程式碼倉庫
2.程式碼展示
支援:Unity : 5.4.1p1+ / Xcode: 8.1+
PostProcessBuild (在Unity編譯的最後加入了一個指令碼呼叫的命令,會自動搜尋Editor資料夾下的PostprocessBuildPlayer,並進行呼叫)。
-
主函式入口
public override void OnPostprocessBuild (BuildTarget BuildTarget, string path){ if (BuildTarget == BuildTarget.iOS) { string projPath = PBXProject.GetPBXProjectPath (path); PBXProject proj = new PBXProject (); proj.ReadFromString (File.ReadAllText (projPath)); generateProjFile (proj, path);//處理Xcode工程 string plistPath = path + "/Info.plist"; PlistDocument plist = new PlistDocument (); plist.ReadFromString (File.ReadAllText (plistPath)); generatePlistFile (plist.root, path);//處理plist檔案 File.WriteAllText (projPath, proj.WriteToString ()); File.WriteAllText (plistPath, plist.WriteToString ()); this.ParseIcon (); /* this.ParseSplashXLib (new Color (34 / 255f, 44 / 255f, 55 / 255f));//修改背景色 this.Buildipa();//程式碼請見Part2部落格 generateFBSettingsConfig();// FaceBook SDK generateHelpShiftConfig();//Helpshift SDK */ } }
-
處理Xcode工程配置
private void generateProjFile(PBXProject proj,string path){ string target = proj.TargetGuidByName (PBXProject.GetUnityTargetName ()); var codesign = Debug.isDebugBuild ? "iPhone Developer: xxxxxxxxxxx" : "iPhone Distribution: xxxxxxxx"; var provision = Debug.isDebugBuild ? "xxxxx" : "xxxxx"; proj.SetBuildProperty (target, "CODE_SIGN_IDENTITY", codesign); proj.SetBuildProperty (target, "PROVISIONING_PROFILE_SPECIFIER", provision); proj.SetBuildProperty (target, "CODE_SIGN_ENTITLEMENTS", "KeychainAccessGroups.plist"); proj.SetBuildProperty (target, "DEVELOPMENT_TEAM", "xxxxxxxxxx"); proj.SetBuildProperty (target, "ENABLE_BITCODE", "NO"); proj.SetSystemCapabilities (target, "com.apple.Push", "1"); proj.SetSystemCapabilities (target, "com.apple.GameCenter", "1"); proj.SetSystemCapabilities (target, "com.apple.InAppPurchase", "1"); proj.RemoveFilesByProjectPathRecursive ("Libraries/Plugins/Android"); //移除某個目錄,根據開發者需求 proj.AddBuildProperty (target, "HEADER_SEARCH_PATHS", Application.dataPath + "/_PlatformAssets/Platforms/xxxxxxxx");//修改Xcode索引目錄 //keychain proj.AddFile (Application.dataPath + "你的目錄/KeychainAccessGroups.plist", "KeychainAccessGroups.plist"); proj.SetBuildProperty (target, "CODE_SIGN_ENTITLEMENTS", Application.dataPath + "你的目錄/KeychainAccessGroups.plist"); //weixin framework //proj.AddFrameworkToProject (target, "SystemConfiguration.framework", false); //SvUDIDTools是UDID檔案,可以忽略。 //AddFile新增檔案到Xcode目錄,返回檔案GUID // AddFileToBuild功能是將GUID檔案新增到Xcode BuildPhases階段 var fileGUID = ""; fileGUID = proj.AddFile (Application.dataPath + "你的目錄/SvUDIDTools.h", "Libraries/Plugins/IOS/SvUDIDTool/SvUDIDTools.h"); proj.AddFileToBuild (target, fileGUID); fileGUID = proj.AddFile (Application.dataPath + "你的目錄/SvUDIDTools.m", "Libraries/Plugins/IOS/SvUDIDTool/SvUDIDTools.m"); proj.AddFileToBuild (target, fileGUID);//新增到Xcode BuildPhases階段 //localizable 自動新增Xcode語言檔案 var infoDirs = Directory.GetDirectories (Application.dataPath + "你的目錄/lang/infoplist/"); for (var i = 0; i < infoDirs.Length; ++i) { var files = Directory.GetFiles (infoDirs [i], "*.strings"); proj.AddLocalization (files [0], "InfoPlist.strings", "InfoPlist.strings"); } var localdirs = Directory.GetDirectories (Application.dataPath + "你的目錄/lang/localizable/"); for (var i = 0; i < localdirs.Length; ++i) { var files = Directory.GetFiles (localdirs [i], "*.strings"); proj.AddLocalization (files [0], "Localizable.strings", "Localizable.strings"); } fileGUID = proj.AddFile (Application.dataPath + "/Plugins/IOS/notificationsound.caf", "notificationsound.caf"); //新增推送音效 proj.AddFileToBuild (target, fileGUID); }
-
處理plist檔案內容
private void generatePlistFile(PlistElementDict rootDict,string path){ rootDict.SetString ("CFBundleIdentifier", "com.gekko.rok"); rootDict.SetString ("CFBundleDisplayName", "Rage of Kings"); rootDict.SetString ("CFBundleVersion", GetVer ()); rootDict.SetString ("NSPhotoLibraryUsageDescription", "Use Photo"); rootDict.SetString ("NSCameraUsageDescription", "Use Camera"); rootDict.SetString ("CFBundleShortVersionString", GKVersion.GAME_VERSION); rootDict.SetString ("ITSAppUsesNonExemptEncryption", "false"); rootDict.SetString ("LSHasLocalizedDisplayName","true"); //weixin scheme PlistElementArray urlArray = null; if (!rootDict.values.ContainsKey ("CFBundleURLTypes")) { urlArray = rootDict.CreateArray ("CFBundleURLTypes"); } else { urlArray = rootDict.values ["CFBundleURLTypes"].AsArray (); } var urlTypeDict = urlArray.AddDict(); urlTypeDict.SetString("CFBundleURLName", "weixin"); var urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes"); urlScheme.AddString("weixin_id"); if (!rootDict.values.ContainsKey ("LSApplicationQueriesSchemes")) { urlArray = rootDict.CreateArray ("LSApplicationQueriesSchemes"); } else { urlArray = rootDict["LSApplicationQueriesSchemes"].AsArray(); } urlArray.AddString ("weixin"); //Gamecenter if (rootDict.values.ContainsKey ("UIRequiredDeviceCapabilities")) { rootDict.values.Remove ("UIRequiredDeviceCapabilities"); } var arr = rootDict.CreateArray ("UIRequiredDeviceCapabilities"); arr.AddString ("armv7"); arr.AddString ("gamekit"); }
-
處理Icon
protected void ParseIcon(){
string sourcePath = "/_ExportTextures/appIcon/{0}.png";
var icoList = new List<string> () {
"Icon",
"Icon-72",
"Icon-76",
"Icon-120",
"[email protected]",
"Icon-144",
"Icon-152",
"Icon-167",
"Icon-180",
"Icon-Store"//1024*1024 , xcode9+
};
foreach (var ico in icoList) {
File.Copy (Application.dataPath + string.Format (sourcePath, ico), XCodeProjectMod.XcodePath() + string.Format ("/Unity-iPhone/Images.xcassets/AppIcon.appiconset/{0}.png", ico), true);
}
}
-
處理背景色
//using System.Xml;
protected void ParseSplashXLib(Color color){
Action<string> ModifyXML = (xmlPath) => {
XmlDocument xmlDoc = new XmlDocument ();
xmlDoc.Load (xmlPath);
XmlNodeList nodelist = xmlDoc.SelectSingleNode ("document").ChildNodes;
foreach (XmlElement item in nodelist) {
if (item.Name == "objects") {
foreach (XmlElement item1 in item.ChildNodes) {
if (item1.Name == "view") {
foreach (XmlElement item2 in item1.ChildNodes) {
if (item2.Name == "color") {
item2.SetAttribute ("red", color.r.ToString ());
item2.SetAttribute ("green", color.g.ToString ());
item2.SetAttribute ("blue", color.b.ToString ());
item2.SetAttribute ("alpha", color.a.ToString ());
}
}
}
}
}
}
xmlDoc.Save (xmlPath);
};
ModifyXML (XCodeProjectMod.XcodePath () + "/LaunchScreen-iPhone.xib");
ModifyXML (XCodeProjectMod.XcodePath () + "/LaunchScreen-iPad.xib");
}
3.Feature 2017.3.29 設定Xcode Capabilities
SetSystemCapabilities函式實現 //proj.SetSystemCapabilities (target, "com.apple.Push","1")
//PBXProjects.cs檔案
public void SetSystemCapabilities(string target,string key,string value){
project.project.SetSystemCapabilities (target, key, value);
}
//找到Objects.cs => internal class PBXProjectObjectData : PBXObjectData類內新增此函式
public void SetSystemCapabilities(string target,string key,string value){
if (m_Properties.Contains ("attributes")) {
var attributes = m_Properties ["attributes"].AsDict ();
var targetAttributes = attributes ["TargetAttributes"].AsDict ();
if (targetAttributes.Contains (target)) {
var targetDict = targetAttributes [target].AsDict ();
if (!targetDict.Contains ("SystemCapabilities")) {
var dict = targetDict.CreateDict ("SystemCapabilities");
var record = dict.CreateDict (key);
record.SetString ("enabled", value);
} else {
var dict = targetDict ["SystemCapabilities"].AsDict ();
if (!dict.Contains (key)) {
var record = dict.CreateDict (key);
record.SetString ("enabled", value);
} else {
var record = dict [key].AsDict ();
record.SetString ("enabled", value);
}
}
} else {
//error
}
}
}
4.Add Localizations 2017-04-07
程式碼需要自己移植到專案內,語言檔案需要自己首先在Xcode工程裡建立好,然後拷貝到Unity Assets內。
我的Unity檔案目錄:
示例程式碼:
var infoDirs = Directory.GetDirectories (Application.dataPath + "/IOS/lang/infoplist/");
for (var i = 0; i < infoDirs.Length; ++i) {
var files = Directory.GetFiles (infoDirs [i], "*.strings");
proj.AddLocalization (files [0], "InfoPlist.strings", "InfoPlists.strings");
}
var localdirs = Directory.GetDirectories (Application.dataPath + "/IOS/lang/localizable/");
for (var i = 0; i < localdirs.Length; ++i) {
var files = Directory.GetFiles (localdirs [i], "*.strings");
proj.AddLocalization (files [0], "Localizable.strings", "Localizable.strings");
}
最終會在Xcode工程內出現下圖內容:
5.構建API
case Configuration.Debug:
BuildPipeline.BuildPlayer (GetBuildScenes(),XcodePath(),BuildTarget.iOS,BuildOptions.AllowDebugging | BuildOptions.SymlinkLibraries | BuildOptions.Development);
break;
case Configuration.Release:
BuildPipeline.BuildPlayer (GetBuildScenes(),XcodePath(),BuildTarget.iOS,BuildOptions.None);
break;
*上面貼的程式碼是呼叫unity build命令,開始build。
*可以新增Menu Item 功能選單,點選Item按鈕呼叫程式碼,自動打包構建Xcode工程,上傳bugly,發郵件通知(都已實現)
6.XUPorter 不建議使用
之前用的是這款開源工具,現該專案作者已不維護,Unity5.x 之後版本更換方式。
7. 新問題-2017.10.27
新版本的Unity 2017 有一些問題。暫時降級Unity 5.6.4p3
Xcode升級到Xcode9 ,打包會遇到一些問題。
8. 下一步
相關推薦
Unity 自動打包 Part1—配置Xcode工程
目錄 0.最近更新 新增微信SDK匯出,修改xcode工程 新增plist scheme。 1.程式碼倉庫 2.程式碼展示 支援:Unity : 5.4.1p1+ / Xcode: 8.1+ PostProcessBu
Unity自動打包工具
轉載 https://blog.csdn.net/ynnmnm/article/details/36774715 最開始有寫打包工具的想法,是因為看到《啪啪三國》王偉峰分享的一張圖,他們有一個專門的“工具程式設計師”開發各種工具。(ps:說起來這個王偉峰和他的創始團隊成員,以前跟我
Jenkins + GitLab + CocoaPod 的自動打包平臺配置(從build到export success)
目錄1. 安裝JAVA環境2. 安裝Jenkins3. 管理外掛4. 專案新建和設定5. Keychains and Provisioning Profiles Management配置(重點難點)6. 報錯問題彙總7. 參考博文1、安裝JAVA環境 Jenkins
Unity-匯出Xcode工程時的自動配置
1.自動更改證書及描述檔案 //更改證書,設定證書名稱即可,在鑰匙串中可見 project.overwriteBuildSetting ("CODE_SIGN_IDENTITY", "xxxxxxxxxx"); //iphone配置實用工具(高版
maven 配置自動本地/線上不同配置自動打包
新建 配置 log pil org 分享 utf compile resources 工程結構:在resource下新建開發,線上不同文件夾存放不同配置文件 pom.xml配置文件 <!-- maven配置不同環境打包 --> <build>
iOS - 將Unity匯出的Xcode工程匯入到另一個Xcode專案, 及常見報錯的解決方法
demo下載地址 http://pan.baidu.com/s/1pLcpKpl 1.Unity匯出工程時設定bundle id要與專案一致 2.修改bit code為NO 3.刪除Main.storyboard,程式碼設定控制器(方便切
framework工程新增自動打包的Run Script
【1】新增Aggregate 找到File/New/Target/Cross-platform/Aggregate,建立Aggregate。 【2】新增Run Script # Install dir will be the final output to the frame
將Unity匯出的Xcode工程匯入到另一個Xcode專案, 及常見報錯的解決方法
1.Unity匯出工程時設定bundle id要與專案一致 2.修改bit code為NO 3.刪除Main.storyboard,程式碼設定控制器(方便切換window) 4.將Classes,Libraries,MapFileParser.sh拖
細聊 Cocoapods 與 Xcode 工程配置
前言 文章比較長,所以在文章的開頭我打算簡單介紹一下這篇文章將要講述的內容,讀者可以選擇通篇細度,也可以直接找到自己感興趣的部分。 既然是談 Cocoapods,那首先要搞明白它出現的背景。有經驗的開發者都知道 Cocoapods 在實際使用中,經常遇到各種問題,存在一定的使用
docke+jenkins+git自動打包部署(2)--jenkins網頁配置
上篇將jenkins在伺服器上跑起來了,這篇主要是將jenkins的外掛安裝和系統配置設定一下 瀏覽器輸入10.17.191.211:8080(上篇中跑jenkins的伺服器) 一、這裡的pas
jenkins+Xcode+蒲公英實現ipa自動打包釋出全攻略
一.環境說明 搭建機器:一臺Mac Book Pro 開發工具:XCode V7.3.1 開發環境:OS X EI Capitan 版本 10.11.5 jenkins版:V1.647 (特別注意:我用的是V1.647,如果使用其他版本可能導致一些未知的BUG) 比如我之前用了最新的2.10版本,就導致了一
【Xcode】Shell指令碼自動打包ipa加企業版簽名
支援原創,更多內容請訪問部落格: 提交給測試同時 ipa 的時候,打包的過程都是重複性的工作,而且人工操作容易造成錯誤,提交測試之後才能發現,導致返工。如果公司有 Mac 伺服器的話,可以搭建 Jenkins 持續整合環境,如果沒有條件,也可以自行寫指令碼一鍵打包。下面
iOS利用(Shell指令碼)自動打包專案工程生成ipa
剛剛進入一家遊戲公司,今天在研究iOS利用指令碼打包專案工程。用xcode打包速度慢而且繁瑣,所以選擇指令碼來做,在這裡分享一下。 打包方法 一.通過Xcode 其實當我們Xcode點選了build或者執行comand+R之後,Xcode自己執行的
cocos2dx 命令建立各平臺工程,並自動打包Android apk的方法
轉自:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_create_a_multi-platform_project_in_one_command_line How to create a multi-pla
Android Studio設定自動打包環境-Gradle buildTypes配置
引用 記錄成為更好的自己。—有道雲筆記 在網上搜索一般都是直接操作build.gradle檔案來配置打包環境,一次解決Studio報錯在stackoverflow上看到另外一種配置方式,感覺比較直觀統一,作此記錄。 https:
React-native Android 在Jenkins上配置自動打包方案
使用jenkins來實現自動化構建,可以簡化開發測試的流程,原來debug包都不會做混淆,現在用了jenkins會自動的打混淆包,除了環境不一樣,其他配置debug和release包都一樣,這樣就可以避免程式碼混淆帶來的問題,早日發現早日治療。推薦大家在廢棄的
Xcode自動打包(傻瓜式教程)
logo.jpg目錄常用打包方式自動打包流程過程圖解xcodebuild使用指令碼檔案解讀一個普通的專案,從打包到上傳(或匯出ipa),耗時基本在10-30分鐘或者更長時間,且中間得有人工看守(其實就是Next step),如果通過指令碼執行自動打包,方便不方便的先放一邊,逼格是不是一下子就提上來了,下面這篇
Android Studio Gradle 多渠道自動打包,動態修改HostUrl,簽名apk,混淆配置詳解
文/ skay 最近遇到專案從Eclispe遷移到Android studio,以前的Ant自動打包指令碼已經相容不好了,所以用了Gradle實現打渠道包,切換環境等, Ant打包指令碼 <target name="-release-sign"
Mac中Jenkins自動打包上傳fir的配置流程(從零開始)二
二.配置Jenkins 1.初始化 安裝完成後,開啟瀏覽器,輸入 http://localhost:8080 會出現下圖的重設初始密碼的介面 找到/Users/Shared/Jenkins/Home/資料夾,更改裡面secrets資料夾及其中init
iOS整合Unity專案,將Unity匯出的Xcode工程匯入到另一個Xcode專案,及常見報錯的解決方法
1.Unity匯出工程時設定bundle id要與專案一致 2.修改bit code為NO 3.刪除Main.storyboard,程式碼設定控制器(方便切換window)