Unity iOS 自动修改Xcode配置

来源:互联网 发布:包拼车软件怎么样 编辑:程序博客网 时间:2024/06/05 03:08

1.打包代码


下载地址 https://bitbucket.org/Unity-Technologies/xcodeapi

2.代码目录


代码下载完毕后,我放在 Assets/Editor 目录下,由于我的项目有global::Utils ,所以与此项目的Utils命名冲突,如果有遇到和我一样的情况,可以把此项目所有用到Utils的代码处,全部修改为namespace.Utils ,2017.04.07 新版本已经没有此问题。


3.代码示例

Unity ver : 5.4.1p1   /   Xcode ver: 8.1
首先创建一个文件,例如XCodeProjectMod.cs , 代码如下:

PostProcessBuild 不清楚的可以自查用法。

简单来说就是unity提供一套api去修改xcode项目工程配置以及修改plist文件内容(当unity build结束后, 会自动回调OnPostProcessBuild).

[PostProcessBuild(999)]public  static  void OnPostprocessBuild (BuildTarget BuildTarget, string path){if (BuildTarget == BuildTarget.iOS) {Debug.Log (path);string projPath = PBXProject.GetPBXProjectPath (path);PBXProject proj = new PBXProject ();proj.ReadFromString (File.ReadAllText (projPath));string target = proj.TargetGuidByName (PBXProject.GetUnityTargetName ());//Handle xcodeprojFile.Copy(Application.dataPath + "/Editor/xcodeapi/Res/KeychainAccessGroups.plist",path+"/KeychainAccessGroups.plist",true);proj.AddFile ("KeychainAccessGroups.plist", "KeychainAccessGroups.plist");var codesign = Debug.isDebugBuild ? CODE_SIGN_DEVELOPER : CODE_SIGN_DISTRIBUTION;var provision = Debug.isDebugBuild ? PROVISIONING_DEVELOPER : PROVISIONING_DISTRIBUTION;proj.SetBuildProperty (target, "CODE_SIGN_IDENTITY", codesign);proj.SetBuildProperty (target, "PROVISIONING_PROFILE", provision);proj.SetBuildProperty(target,"CODE_SIGN_ENTITLEMENTS","KeychainAccessGroups.plist");proj.SetBuildProperty (target, "ENABLE_BITCODE", "NO");proj.SetGeneralTeam (target, "xxxxx");//fix source codeFile.WriteAllText (projPath, proj.WriteToString ());//Handle pliststring plistPath = path + "/Info.plist";PlistDocument plist = new PlistDocument();plist.ReadFromString(File.ReadAllText(plistPath));PlistElementDict rootDict = plist.root;rootDict.SetString ("CFBundleVersion", GetVer ());//GetVer() 返回自定义自增值File.WriteAllText(plistPath, plist.WriteToString());}}}

4.HotFix 2016-11.15

[PostProcessBuild(999)]public  static  void OnPostprocessBuild (BuildTarget BuildTarget, string path){if (BuildTarget == BuildTarget.iOS) {string projPath = PBXProject.GetPBXProjectPath (path);PBXProject proj = new PBXProject ();proj.ReadFromString (File.ReadAllText (projPath));string target = proj.TargetGuidByName (PBXProject.GetUnityTargetName ());//Handle xcodeprojFile.Copy(Application.dataPath + "/Editor/xcodeapi/Res/KeychainAccessGroups.plist",path+"/KeychainAccessGroups.plist",true);proj.AddFile ("KeychainAccessGroups.plist", "KeychainAccessGroups.plist");var codesign = Debug.isDebugBuild ? CODE_SIGN_DEVELOPER : CODE_SIGN_DISTRIBUTION;var provision = Debug.isDebugBuild ? PROVISIONING_DEVELOPER : PROVISIONING_DISTRIBUTION;proj.SetBuildProperty (target, "CODE_SIGN_IDENTITY", codesign);proj.SetBuildProperty (target, "PROVISIONING_PROFILE_SPECIFIER", provision);proj.SetBuildProperty (target, "CODE_SIGN_ENTITLEMENTS", "KeychainAccessGroups.plist");proj.SetBuildProperty (target, "ENABLE_BITCODE", "NO");proj.SetBuildProperty (target, "DEVELOPMENT_TEAM", "your sign");//proj.SetSystemCapabilities (target, "com.apple.Push","1");//移除指定目录proj.RemoveFilesByProjectPathRecursive ("Libraries/Plugins/Android");File.WriteAllText (projPath, proj.WriteToString ());//Handle pliststring plistPath = path + "/Info.plist";PlistDocument plist = new PlistDocument();plist.ReadFromString(File.ReadAllText(plistPath));PlistElementDict rootDict = plist.root;rootDict.SetString ("CFBundleVersion", GetVer ());rootDict.SetString ("NSPhotoLibraryUsageDescription", "Use Photo");rootDict.SetString ("NSCameraUsageDescription", "Use Camera");File.WriteAllText(plistPath, plist.WriteToString());}}



5.XUPorter

之前用的是这款开源工具,由于该项目作者已不维护,在unity5.x版本才换成unity提供API

6.Feature 2017.3.29

SetSystemCapabilities函数实现//proj.SetSystemCapabilities (target, "com.apple.Push","1")//PBXProjects.cspublic void SetSystemCapabilities(string target,string key,string value){project.project.SetSystemCapabilities (target, key, value);}//Objects.cspublic void SetSystemCapabilities(string target,string key,string value){if (m_Properties.Contains ("attributes")) {var attributes = m_Properties ["attributes"].AsDict ();var targetAttributes = attributes ["TargetAttributes"].AsDict ();if (targetAttributes.Contains (target)) {var targetDict = targetAttributes [target].AsDict ();if (!targetDict.Contains ("SystemCapabilities")) {var dict = targetDict.CreateDict ("SystemCapabilities");var record = dict.CreateDict (key);record.SetString ("enabled", value);} else {var dict = targetDict ["SystemCapabilities"].AsDict ();if (!dict.Contains (key)) {var record = dict.CreateDict (key);record.SetString ("enabled", value);} else {var record = dict [key].AsDict ();record.SetString ("enabled", value);}}} else {//error}}}

7.Add Localizations 2017-04-07

添加本地化文件此功能没有进入到stable分支,而是在pull requests内  。https://bitbucket.org/Unity-Technologies/xcodeapi/pull-requests/13/creation-of-variantgroup-and/diff

代码需要自己移植到项目内。简单说一下功能。我的文件目录是放在unity内,如下图:

贴部分代码:

var infoDirs = Directory.GetDirectories (Application.dataPath + "/IOS/lang/infoplist/");        for (var i = 0; i < infoDirs.Length; ++i) {            var files = Directory.GetFiles (infoDirs [i], "*.strings");            proj.AddLocalization (files [0], "InfoPlist.strings", "InfoPlist.strings");        }var localdirs = Directory.GetDirectories (Application.dataPath + "/IOS/lang/localizable/");        for (var i = 0; i < localdirs.Length; ++i) {            var files = Directory.GetFiles (localdirs [i], "*.strings");            proj.AddLocalization (files [0], "Localizable.strings", "Localizable.strings");        }

最终会在xcode工程内出现下图内容:


8.记录

proj.AddBuildProperty (target, "OTHER_LDFLAGS", "-ObjC");
proj.AddBuildProperty (target, "FRAMEWORK_SEARCH_PATHS","xxxxxxx");
proj.AddBuildProperty (target, "HEADER_SEARCH_PATHS","xxxxxxxx");

默认提供的添加framework方法,默认回去system/library/framework查找。
想用自己的framework
var fileGUID
 = proj.AddFile (srcpath,targetpath);
proj.AddFileToBuild (target, fileGUID);

等等.. 基本完全可以实现自动化
3 0
原创粉丝点击