1. 程式人生 > >【unity】unity自動化打包——利用XUPorter解決xcode8問題

【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.這篇文章時間跨度太長了。當時還碰到過一些問題想不起來了。我只是把我當時記錄下來的總結起來。
以後再補充。
若有不對的地方,歡迎指正。