【unity】unity自動化打包——利用XUPorter解決xcode8問題
unity自動化打包有一個很好用的外掛,XUPorter。
本文所有問題都是利用XUPorter解決。當然還有其他方法,但是我懶。
XUPoter的原理就不多說了。直接進正題。
1.關於Automatically manage signing
此為Xcode8新增的特性,可由蘋果自動為我們進行管理及配置檔案,在General中。
當勾選該選項時,下圖ProvisioningStyle的值為Automatic,否則為Manual。但是xcode在處於預設值的時候,你是找不到ProvisioningStyle的。所以我們需要構建入下圖的結構,才能使設定生效。
在XUPorter外掛中XCodePostProcess新增方法:
public static void SetAttr(XCProject project)
{
var pbxproj = project.project;
var attrs = pbxproj.attributes;
var targetAttrs = (PBXDictionary)attrs["TargetAttributes"];
PBXDictionary targetSetting = new PBXDictionary();
targetSetting["ProvisioningStyle" ] = "Manual";
foreach (var t in targets)
{
var targetID = (string)t;
if (targetAttrs.ContainsKey(targetID))
{
var TargetAttr = (PBXDictionary)targetAttrs[targetID];
TargetAttr.Append(targetSetting);
}
else
{
targetAttrs[targetID] = targetSetting;
}
}
}
因專案實際需求,我設定成了手動。手動同時需要程式碼指定證書。
public static void WriteXCProject(ref XCProject project)
{
project.overwriteBuildSetting("CODE_SIGN_IDENTITY", "your certificate name", "Release");
project.overwriteBuildSetting("CODE_SIGN_IDENTITY", "your certificate name", "Debug");
project.overwriteBuildSetting("DEVELOPMENT_TEAM", “certificate user id", "Release");
project.overwriteBuildSetting("DEVELOPMENT_TEAM", “certificate user id", "Debug");
project.overwriteBuildSetting("PROVISIONING_PROFILE_SPECIFIER", “your provisioning profile name”, "Release");
project.overwriteBuildSetting("PROVISIONING_PROFILE_SPECIFIER", “your provisioning profile name”, "Debug");
}
CODE_SIGN_IDENTITY:簽名證書名稱。例如”iPhone Distribution : blablablabla”
DEVELOPMENT_TEAM : 簽名證書Userid。例如ADKLH1235A。
這兩項到keychain就能看到。
PROVISIONING_PROFILE_SPECIFIER: Provisioning profile名稱。
2.Capabilities下的開關控制
開關預設全是關閉的。預設狀態下該SystemCapabilities是不存在的。只要任意開啟其中一個開關。xcode配置檔案就會寫入如圖部分的結構。對上述SetAttr介面進行擴充套件(拿push開關和background開關為例):
public static void SetTargetAttr(XCProject project)
{
var pbxproj = project.project;
var attrs = pbxproj.attributes;
var targetAttrs = (PBXDictionary)attrs["TargetAttributes"];
PBXDictionary targetSetting = new PBXDictionary();
targetSetting["ProvisioningStyle"] = "Manual";
PBXDictionary innerSetting = new PBXDictionary();
innerSetting["com.apple.BackgroundModes"] = Enabled("1");
innerSetting["com.apple.Push"] = Enabled("1");
targetSetting["SystemCapabilities"] = innerSetting;
var targets = pbxproj.targets;
foreach (var t in targets)
{
var targetID = (string)t;
if (targetAttrs.ContainsKey(targetID))
{
var TargetAttr = (PBXDictionary)targetAttrs[targetID];
TargetAttr.Append(targetSetting);
}
else
{
targetAttrs[targetID] = targetSetting;
}
}
}
public static PBXDictionary Enabled(string value)
{
PBXDictionary dic = new PBXDictionary();
dic["enabled"] = value;
return dic;
}
3.關於push notification推送
該開關開啟後,還需要新增一個對應entitlement檔案。該檔名跟bundle id相關。可利用XUPorter的配置projmods檔案解決。針對entitlements單獨配置一份。
projmods檔案內容:
{
"group": "",
"libs": [],
"frameworks": [],
"headerpaths": [],
"files": [
"123.entitlements"
],
"folders": [],
"excludes": ["^.*.meta$", "^.*.mdown$", "^.*.pdf$"],
"linker_flags": []
}
ios正式釋出的時候,entitlements裡面的配置項不能是development,要設定為production。所以可能需要配置兩份entitlements檔案。
到此為止我們把entitlements檔案新增到了工程,但是Push開啟開關時候會在工程目錄下同名資料夾下生成一份entitlements檔案,只利用xuporter新增檔案還不夠的。我們還需要將該檔案在對應資料夾下拷貝一份才可以。如下圖:
關於拷貝檔案方法就太多了。就不多說了。只要在工程生成後拷貝到對應資料夾下就可以。
ps.這篇文章時間跨度太長了。當時還碰到過一些問題想不起來了。我只是把我當時記錄下來的總結起來。
以後再補充。
若有不對的地方,歡迎指正。