【问题标题】:Enable capabilities for Unity3D xCode Project in postprocess在后期处理中启用 Unity3D xCode 项目的功能
【发布时间】:2017-11-02 19:48:24
【问题描述】:

我有一个 Unity3D iOS 项目,我在其中使用游戏中心和应用内购买(通过第三方插件),但是当我将 Unity3D 项目构建到 xCode 中时,在功能部分游戏中心和应用内购买被禁用.我需要在 PostProcessBuild 方法中启用它们。我尝试通过此代码使用 xCodeApi:

   string projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
   PBXProject proj = new PBXProject();

   proj.ReadFromString(File.ReadAllText(projPath));
   string target = proj.TargetGuidByName("Unity-iPhone");

   proj.AddCapability (target, PBXCapabilityType.GameCenter);
   proj.AddCapability (target, PBXCapabilityType.InAppPurchase);

   File.WriteAllText(projPath, proj.ToString());

但是在此之后 xCode 无法打开创建的项目(它只是立即崩溃)。如何在不手动设置 xCode 的情况下添加这两个功能?

【问题讨论】:

    标签: ios xcode unity3d post-processing


    【解决方案1】:

    这是实现这一目标的一种新方法:

    using UnityEditor;
    using UnityEditor.Build;
    using UnityEditor.Build.Reporting;
    using UnityEditor.iOS.Xcode;
    
    public class CapabilityPostprocessBuild : IPostprocessBuildWithReport
    {
        public int callbackOrder => 999;
    
        public void OnPostprocessBuild(BuildReport report)
        {
            OnPostprocessBuild(report.summary.platform, report.summary.outputPath);
        }
    
        public void OnPostprocessBuild(BuildTarget buildTarget, string path)
        {
            if (buildTarget == BuildTarget.iOS)
            {
                string projPath = PBXProject.GetPBXProjectPath(path);
    
                PBXProject proj = new PBXProject();
                proj.ReadFromFile(projPath);
    
                ProjectCapabilityManager manager = new ProjectCapabilityManager(
                    projPath,
                    "Entitlements.entitlements",
                    targetGuid: proj.GetUnityMainTargetGuid()
                );
    
                manager.AddiCloud(true, false, null);
    
                manager.WriteToFile();
            }
        }
    }
    

    【讨论】:

    • 这对我有用。添加后,我可以清楚地看到在我的xcode项目中添加了iCloud,并且在实际设备上进行了测试,效果很好。谢谢。
    • 当我添加你的代码时,我得到:命名空间“UnityEditor”中不存在类型或命名空间名称“Build”(您是否缺少程序集引用?)如何修复它?跨度>
    • @Noob 尝试将脚本放在名为“Editor”的文件夹中。
    【解决方案2】:

    所以问题在于无效的 projPath 并且我没有启用 iCloud。此代码有效:

    [PostProcessBuild(999)]
    public static void AddCapabilities(BuildTarget buildTarget, string pathToBuiltProject)
     {
      if (buildTarget == BuildTarget.iOS) {
       string projPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
    
       PBXProject proj = new PBXProject ();
       proj.ReadFromString (File.ReadAllText (projPath));
    
       string target = proj.TargetGuidByName ("Unity-iPhone");
    
       proj.AddCapability (target, PBXCapabilityType.iCloud);
       proj.AddCapability (target, PBXCapabilityType.GameCenter);
       proj.AddCapability (target, PBXCapabilityType.InAppPurchase);
    
       File.WriteAllText (projPath, proj.WriteToString ());
    
      }
    }
    

    现在我只有将 iCloud 标志键值存储和 CloudKit 设置为 true 时遇到问题。据我所知,它需要一些权利文件,我不知道在哪里可以找到。如果您知道如何提供帮助,我将不胜感激。

    【讨论】:

      【解决方案3】:

      您可以使用ProjectCapabilityManager 来添加带有key-value 存储标志的iCloud 功能

      using XcodeUnityCapability = UnityEditor.iOS.XcodeUnity.ProjectCapabilityManager;
      public class IosPostProcessBuild : MonoBehaviour
      {
          [PostProcessBuild]
          private static void PostBuildActions(BuildTarget buildTarget, string path)
          {
              if (buildTarget == BuildTarget.iOS)
              {
                  string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";
                  XcodeUnityCapability projCapability = new XcodeUnityCapability(projPath, "Unity-iPhone/mmk.entitlements", "Unity-iPhone");
      
                  projCapability.AddGameCenter();
                  string[] empty = null;
                  projCapability.AddiCloud(true, false, empty);
                  projCapability.WriteToFile();
              }
          }
      }
      

      XcodeUnity被重命名空间,你可以从https://bitbucket.org/Unity-Technologies/xcodeapi/src这里获取xcode api

      【讨论】:

      • 谢谢! proj.AddCapability 出于某种原因对我不起作用,但您的建议有效!仅供参考:在现代 Unity 版本中,xcode api 已包含在标准安装中。
      猜你喜欢
      • 2018-01-16
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多