0评论

Unity自动化打包—利用XUPorter插件解决xcode8问题

文章来自https://blog.csdn.net/wonnayov/article/details/78008954 2019-02-19 92浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

在unity开发时自动化打包有一个很好用的插件XUPorter,去做关于XUPorter插件的原理这里就不做解释了,主要介绍下在利用XUPorter插件解决xcode8遇到的问题。其他方法也有,大家可以尝试去寻找下。

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添加文件还不够的。我们还需要将该文件在对应文件夹下拷贝一份才可以。如下图:

关于拷贝文件方法就太多了。就不多说了。只要在工程生成后拷贝到对应文件夹下就可以。