Unity3d For IOS Build 自动添加依赖库 和 .tbd和 内购 和 PushNotifications 等等

在unity3D 发布IOS的时候,我们经常会依赖一些 IOS 原生的架构 或者是集成 其他SDK 插件。

这个是好我们每次 build Xcode 项目都需要往里面添加 依赖结构 时分的不方便,其实Unity3d 已经为我们提供 很好的解决方案。

[PostProcessBuildAttribute(88)]

这个标签是在 Unity3D Build xcode 工程完成之后 调用的。目的就是 修改Xcode工程的 项目配置文件,可谓很强大

    static  string targetPath;
    //[PostProcessBuild]
    [PostProcessBuildAttribute(88)]
    public static void onPostProcessBuild(BuildTarget target, string targetPath)
    {
        string unityEditorAssetPath = Application.dataPath;
        
        if (target != BuildTarget.iOS)
        {
            Debug.LogWarning("Target is not iPhone. XCodePostProcess will not run");
            return;
        }

        XCProject project = new XCProject(targetPath);
 

        string projPath = Path.GetFullPath(targetPath);
        EditInfoPlist(projPath);

        //Add Frameworks
        EditorFrameworks(project);

		//Add Lib
		EditorLib(project);

        //editorCode
        EditorCode(projPath);

        //Finally save the xcode project
        //project.Save();
    }

在这里我们介绍第一种 添加  Frameworks


    private static void EditorFrameworks(XCProject project)
    {


        string projPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(targetPath);
        UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject();


        //proj.ReadFromString(File.ReadAllText(projPath));
		proj.ReadFromFile(projPath);

        string target = proj.TargetGuidByName("Unity-iPhone");


		proj.SetBuildProperty(target, "ENABLE_BITCODE", "NO");//bitcode  NO


		proj.AddFrameworkToProject(target,"Messages.framework", true);
		proj.AddFrameworkToProject(target,"AdSupport.framework", true);
		proj.AddFrameworkToProject(target,"CoreTelephony.framework", true);
		proj.AddFrameworkToProject(target,"CoreMotion.framework", true);
		proj.AddFrameworkToProject(target,"Security.framework", true);
		proj.AddFrameworkToProject(target,"SystemConfiguration.framework", true);


		proj.WriteToFile (projPath);


    }

注意添加完成之后我回写到 配置文件中


第二种是添加 .tbd 的依赖文件(或许需要 Unity2017的支持 )

	private static void EditorLib(XCProject project)
	{

		string projPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(targetPath);
		//Debug.Log (projPath);
		UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject();


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

		proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libstdc++.6.0.9.tbd", "libstdc++.6.0.9.tbd", PBXSourceTree.Sdk));
		proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libsqlite3.tbd", "libsqlite3.tbd", PBXSourceTree.Sdk));


		proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libc++.tbd", "libc++.tbd", PBXSourceTree.Sdk));
		proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libz.tbd", "libz.tbd", PBXSourceTree.Sdk));

		proj.WriteToFile (projPath);


	}


第三种 就是比较强悍的 替换代 把你整理好的代码。放在unity特定 目录中 每次 Build 成功之后 你把它替换掉 xcode 工程里面的文件就好。

    private static void EditorCode(string projPath)
    { 
        string UnityAppControllerH      = Application.dataPath+  "/Editor/CPPCource/UnityAppController.h";
        string UnityAppControllerMM     = Application.dataPath + "/Editor/CPPCource/UnityAppController.mm";

        string tagUnityAppControllerH   = targetPath + "/Classes/UnityAppController.h";
        string tagUnityAppControllerMM  = targetPath + "/Classes/UnityAppController.mm";

        if (File.Exists(tagUnityAppControllerH))
        {
            File.Delete(tagUnityAppControllerH);
        }
        if (File.Exists(tagUnityAppControllerMM))
        {
            File.Delete(tagUnityAppControllerMM);
        }

        File.Copy(UnityAppControllerH,  tagUnityAppControllerH);
        File.Copy(UnityAppControllerMM, tagUnityAppControllerMM);

    }


以下添加 方式或许 需要 Unity2017的支持, 应为笔者 在unity5.6.3f1 中有编译错误的提示,需要新版本的API支持

第四中 添加 是以 添加 InAppPurchasePushNotifications GameCenter 等等

	/// <summary>
	/// 包的自动签名
	/// </summary>ÅÅÅ
	/// <param name="project">Project.</param>
	public static void AutoIdentity(XCProject project)
	{
		string projPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(targetPath);
		UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject();

		proj.ReadFromString(File.ReadAllText(projPath));

		string target = proj.TargetGuidByName("Unity-iPhone");
		proj.SetBuildProperty(target, "ENABLE_BITCODE", "NO");//bitcode  NO

		proj.SetTeamId (target, "93L6D5N68L"); //自动签名 自动选择证书 TeamID 可以在 appledeveloper 中查看
		proj.WriteToFile (projPath);

	}


	/// <summary>
	/// 添加
	/// </summary>
	/// <param name="project">Project.</param>
	public static void AutoSign(XCProject project)
	{
		string projPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(targetPath);
		UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject();

		proj.ReadFromFile(projPath);

		string target = proj.TargetGuidByName("Unity-iPhone");


                 proj.AddCapability (target, PBXCapabilityType.InAppPurchase);//内购

                 //添加推送和其他的有点不一样,需要添加一个文件。这个文件只能考进去。或者事先准备好了Base.entitlements 文件,文件类容 就是你手动添加进去的内容,你手动添加完成后生成的那个文件
                string entitlement = Application.dataPath+ "/Editor/Entitlement/Base.entitlements";
                File.Copy(entitlement, targetPath+"/Unity-iPhone/Base.entitlements");
                proj.AddCapability (target, PBXCapabilityType.PushNotifications,targetPath+"/Unity-iPhone/Base.entitlements",true);
                proj.WriteToFile (projPath);
        }

以上我笔者 遇见的 添加依赖文件的种类,后续还有遇见的话 回继续修改


猜你喜欢

转载自blog.csdn.net/nicepainkiller/article/details/79636482