您的位置:首页 > 移动开发 > Unity3D

自动修改 Unity3d 导出的 Xcode 项目

2017-03-31 14:55 375 查看
在 Unity3d 导出 iOS 项目后,常常需要定制一些选项,例如指定额外的 framework,修改 Info.plist 等。

Unity3d 在导出工程的时候提供两个选项:替换整个项目「replace」和追加变动「append」。一旦使用了 replace 选项,之前所有手工设置的变更都会丢失,需要重新设置。

那么有没有一种方法可以在导出项目的时候对 Xcode 项目进行自动化配置呢?正好 Unity3d 官方提供了一个叫 xcodeapi 的项目,提供了一套简单易用的接口满足一些常见的定制需求。

从 bitbucket 上下载 xcodeapi 的源码,放到 Unity 项目的 Assets 目录下任意位置,例如 /path/to/project/Assets/Editor/xcodeapi 然后创建一个 MonoBehaviour 的子类,并在其中实现带有 [PostProcessBuild] 属性的 public static void OnPostprocessBuild (BuildTarget BuildTarget, string path); 方法:

如果有多个 PostProcessBuild 属性,可以使用 [PostProcessBuildAttribute(1)] 来指明运行的顺序,详情见此文档。

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.Collections;
using System.IO;

public class XCodeProjectMod : MonoBehaviour {

[PostProcessBuild]
public  static  void OnPostprocessBuild (BuildTarget BuildTarget, string path) {

if (BuildTarget == BuildTarget.iPhone) {

// 添加额外的 AssetsLibrary.framework
// 用于检测相册权限等功能

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

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

// add extra framework(s)
proj.AddFrameworkToProject (target, "AssetsLibrary.framework", false);

// set code sign identity & provisioning profile
proj.SetBuildProperty (target, "CODE_SIGN_IDENTITY", "iPhone Distribution: _______________");
proj.SetBuildProperty (target, "PROVISIONING_PROFILE", "********-****-****-****-************");

// rewrite to file
File.WriteAllText (projPath, proj.WriteToString ());

// 由于我的开发机是英文系统,但游戏需要设置为中文;
// 需要在修改 Info.plist 中的 CFBundleDevelopmentRegion 字段为 zh_CN

// Get plist
string plistPath = path + "/Info.plist";
PlistDocument plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(plistPath));

// Get root
PlistElementDict rootDict = plist.root;

// Change value of CFBundleDevelopmentRegion in Xcode plist
rootDict.SetString("CFBundleDevelopmentRegion", "zh_CN");

PlistElementArray urlTypes = rootDict.CreateArray("CFBundleURLTypes");

// add weixin url scheme
PlistElementDict wxUrl = urlTypes.AddDict();
wxUrl.SetString("CFBundleTypeRole", "Editor");
wxUrl.SetString("CFBundleURLName", "weixin");
PlistElementArray wxUrlScheme = wxUrl.CreateArray("CFBundleURLSchemes");
wxUrlScheme.AddString("____________");

// Write to file
File.WriteAllText(plistPath, plist.WriteToString());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息