Ios 在后处理中启用Unity3D xCode项目的功能
我有一个Unity3D iOS项目,在那里我使用游戏中心和应用内购买(通过第三方插件),但是当我将Unity3D项目构建到xCode中时,在功能部分,游戏中心和应用内购买被禁用。我需要在后处理构建方法中启用它们。我尝试通过以下代码使用xCodeApi:Ios 在后处理中启用Unity3D xCode项目的功能,ios,xcode,unity3d,post-processing,Ios,Xcode,Unity3d,Post Processing,我有一个Unity3D iOS项目,在那里我使用游戏中心和应用内购买(通过第三方插件),但是当我将Unity3D项目构建到xCode中时,在功能部分,游戏中心和应用内购买被禁用。我需要在后处理构建方法中启用它们。我尝试通过以下代码使用xCodeApi: string projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject); PBXProject proj = new PBXProject(); proj.Read
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中手动设置的情况下添加这两个功能?因此问题在于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 flags键值存储和CloudKit设置为true时遇到问题。据我所知,它需要一些权利文件,我不知道在哪里可以找到。如果您知道如何提供帮助,我将非常感谢您的评论。因此问题在于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 flags键值存储和CloudKit设置为true时遇到问题。据我所知,它需要一些权利文件,我不知道在哪里可以找到。如果您知道如何提供帮助,我将不胜感激。您可以使用
ProjectCapabilityManager
添加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
被重命名为命名空间,您可以从这里获取xcode api您可以使用ProjectCapabilityManager
添加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
被重命名为命名空间,您可以从这里获取xcode api这里有一种新的实现方法:
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();
}
}
}
这里有一种新的实现方法:
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();
}
}
}
谢谢
proj.AddCapability
由于某种原因对我不起作用,但你的建议奏效了!仅供参考:在现代Unity版本中,xcode api已经包含在标准安装中。谢谢proj.AddCapability
由于某种原因对我不起作用,但你的建议奏效了!仅供参考:在现代的Unity版本中,xcode api已经包含在标准安装中。这对我很有用。添加了这个之后,我可以清楚地看到iCloud被添加到我的xcode项目中,并在实际设备上进行了测试。谢谢,这对我很有用。添加了这个之后,我可以清楚地看到iCloud被添加到我的xcode项目中,并在实际设备上进行了测试。非常感谢。