之前项目一直在用XUPorter 。今天无意间发现其实Unity已经帮我们实现了一套。如果你用的unity4.x开发,可以把它的代码放到你的工程里用。https://bitbucket.org/Unity-Technologies/xcodeapi 如果你用的是unity5.x开发,那么unity已经将这个API内置了http://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html
本来想自己写个例子试试, 谷歌了一下发现已经有了。 http://cflat-inc.hatenablog.com/entry/2015/01/05/074442
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
using UnityEngine; using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; // ←さっきいれたXcodeAPI using System.Collections; using System.IO; public class XcodeProjectMod : MonoBehaviour { // ちょっとしたユーティリティ関数(http://goo.gl/fzYig8を参考) internal static void CopyAndReplaceDirectory(string srcPath, string dstPath) { if (Directory.Exists(dstPath)) Directory.Delete(dstPath); if (File.Exists(dstPath)) File.Delete(dstPath); Directory.CreateDirectory(dstPath); foreach (var file in Directory.GetFiles(srcPath)) File.Copy(file, Path.Combine(dstPath, Path.GetFileName(file))); foreach (var dir in Directory.GetDirectories(srcPath)) CopyAndReplaceDirectory(dir, Path.Combine(dstPath, Path.GetFileName(dir))); } [PostProcessBuild] public static void OnPostprocessBuild(BuildTarget buildTarget, string path) { if (buildTarget == BuildTarget.iPhone) { string projPath = PBXProject.GetPBXProjectPath(path); PBXProject proj = new PBXProject(); proj.ReadFromString(File.ReadAllText(projPath)); string target = proj.TargetGuidByName("Unity-iPhone"); // システムのフレームワークを追加 proj.AddFrameworkToProject(target, "AssetsLibrary.framework", false); // 自前のフレームワークを追加 CopyAndReplaceDirectory("Assets/Lib/mylib.framework", Path.Combine(path, "Frameworks/mylib.framework")); proj.AddFileToBuild(target, proj.AddFile("Frameworks/mylib.framework", "Frameworks/mylib.framework", PBXSourceTree.Source)); // ファイルを追加 var fileName = "my_file.xml"; var filePath = Path.Combine("Assets/Lib", fileName); File.Copy(filePath, Path.Combine(path, fileName)); proj.AddFileToBuild(target, proj.AddFile(fileName, fileName, PBXSourceTree.Source)); // Yosemiteでipaが書き出せないエラーに対応するための設定 proj.SetBuildProperty(target, "CODE_SIGN_RESOURCE_RULES_PATH", "$(SDKROOT)/ResourceRules.plist"); // フレームワークの検索パスを設定・追加 proj.SetBuildProperty(target, "FRAMEWORK_SEARCH_PATHS", "$(inherited)"); proj.AddBuildProperty(target, "FRAMEWORK_SEARCH_PATHS", "$(PROJECT_DIR)/Frameworks"); // 書き出し File.WriteAllText(projPath, proj.WriteToString()); } } } |
欢迎大家试试哈~
- 本文固定链接: https://www.xuanyusong.com/archives/4026
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
读到这儿的开发者,可以看看 这篇文章 http://www.newhappy.com.cn/?p=352 。XUPorter已经是过去Unity 4.x 的做法了, 5.x Unity提供了一些内置API来修改XCode工程, 这篇文章里就介绍了一个利用这些内置API写的一个可配置导出工具,使用比XUPorter更方便简单。
一导入进去,各种找不到命名空间
这个放到editor里怎么使用呢?
momo 老大,,PBXProject 貌似没有办法将动态库 添加到 Embedded Binaries 里面呢?请问下,这个怎么处理呢?
同样碰到这个问题。这里找到了解决方案
忘了放链接了。我也正在折腾这个坑。https://answers.unity.com/questions/1074471/is-it-possible-to-use-the-xcode-manipulation-api-t.html
请问这上面代码是怎么用的,也想打包ipa,不知道流程哈
下载https://bitbucket.org/Unity-Technologies/xcodeapi 的源代码,把所有的cs文件放到 Editor/xcode下(AssemblyInfo.cs 除外)。然后你会看到找不到 Utils 的错误,那是因为与UnityEditor.Utils命名空间冲突,替换为 UnityEditor.iOS.Xcode.PBX.Utils 就可以了。
下载https://bitbucket.org/Unity-Technologies/xcodeapi 的源代码,把所有的cs文件放到 Editor/xcode下(AssemblyInfo.cs 除外)。然后你会看到很多的错误找不到 Utils, 那是因为河UnityEditor.Utils命名空间冲突,替换为 UnityEditor.iOS.Xcode.PBX.Utils 就可以了。
雨松大大 想问您一下 4.x导入了这个报错 是我漏导了什么东西吗
我比较想知道怎么加.tbd文件呢,找了找没看到有api
自己试出来了:private static void AddLibToProject(PBXProject inst,string targetGuid, string lib) { string fileGuid = inst.AddFile(“usr/lib/” + lib, “Frameworks/” + lib, PBXSourceTree.Sdk); inst.AddFileToBuild(targetGuid, fileGuid);}调用和API中的加framework差不多,如下://libAddLibToProject(proj, target, “libc++.tbd”);另外我用5.1.2,说引用dll失败,把momo上面链接里的源文件改下命名空间放进工程Editor里就行了
自己试出来了:private static void AddLibToProject(PBXProject inst,string targetGuid, string lib) { string fileGuid = inst.AddFile(“usr/lib/” lib, “Frameworks/” lib, PBXSourceTree.Sdk); inst.AddFileToBuild(targetGuid, fileGuid);}调用和API中的加framework差不多,如下://libAddLibToProject(proj, target, “libc .tbd”);另外我用5.1.2,说引用dll失败,把momo上面链接里的源文件改下命名空间放进工程Editor里就行了
momo请教一个问题,用5.3.5导出的IOS文件很大,libiPhone-lib.a文件占了1个G多。。。有没有解决办法啊
不会吧。。 你打的是不是debug啊?
不是啊。。。都是默认的设置,导出后别的都不大,就那个文件要1G多。。。
mono~~ 请教一个问题,AddFileToBuild每次都在项目中添加一个源文件进去(蓝色文件夹),我想在项目中添加一个group到工程中(黄色文件夹)。。该怎么做呢,卡了好久。。。
我也发现这个问题,AddFileToBuild只有在加入带有framework的文件夹时,才会以GROUP方式加的,其他的都是folder references …晕死了
momo:请教一个www超时的问题。 在手机上要等很久才会返回连接超时的error,有什么方法能缩短超时的时间
你可以自己定义一个超时时间, 比如10秒。 但是有可能超过10秒以后 www得到了返回。。 这时候就不要处理它就行了。。
多个资源服务器,如果假设10秒超时,10秒内没收到返回,就要去链接其他的资源服务器了。 即使再返回结果就要丢弃了,这是已经去链接另一个资源服务器了。多个资源服务器只有一个是正常的。
啊? 10秒如果没能得到返回就重其一个www重新链接啊。。
这个API只能做简单的设定像我之前想用这个API来做App name的Localization我只能将动态建立的InfoPlist.strings当成一般的档案加到XCode的专案里面没有办法将多个InfoPlist.strings合成一个档案挺麻烦的 最后还是手动将档案拖到专案中才可以
proj.SetBuildProperty 改配置居然改不了project里的
你好,我是5.3.1f1。为什么using UnityEditor.iOS.Xcode 错误?我输入UnityEditor. 后自动补全里也找不到 iOS啊?
我5.3.3上就有, 你可以选择升级 unity或者 把它的代码拿到工程里
你的程式码放到Editor目录下了吗?
应该是版本问题,我用5.4的就可以了。
你是没有下载ios的那部分,buildsetting下面ios那个你应该没有
金角大王