首页 >Unity3D频道 >【Unity杂文】 > Unity3D研究院之5.x自带API打包xcode添加framework、plist
2016
04-26

Unity3D研究院之5.x自带API打包xcode添加framework、plist

之前项目一直在用XUPorter 。今天无意间发现其实Unity已经帮我们实现了一套。如果你用的unity4.x开发,可以把它的代码放到你的工程里用。https://bitbucket.org/Unity-Technologies/xcodeapi 如果你用的是unity5.x开发,那么unity已经将这个API内置了http://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html

Snip20160426_2

本来想自己写个例子试试, 谷歌了一下发现已经有了。 http://cflat-inc.hatenablog.com/entry/2015/01/05/074442

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());
        }
    }
}

 

欢迎大家试试哈~

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之5.x自带API打包xcode添加framework、plist》有 31 条评论

  1. NOW说:

    读到这儿的开发者,可以看看 这篇文章 http://www.newhappy.com.cn/?p=352 。XUPorter已经是过去Unity 4.x 的做法了, 5.x Unity提供了一些内置API来修改XCode工程, 这篇文章里就介绍了一个利用这些内置API写的一个可配置导出工具,使用比XUPorter更方便简单。

  2. momo 老大,,PBXProject 貌似没有办法将动态库 添加到 Embedded Binaries 里面呢?请问下,这个怎么处理呢?

  3. 赵辉说:

    请问这上面代码是怎么用的,也想打包ipa,不知道流程哈

  4. 王有斌说:

    下载https://bitbucket.org/Unity-Technologies/xcodeapi 的源代码,把所有的cs文件放到 Editor/xcode下(AssemblyInfo.cs 除外)。然后你会看到找不到 Utils 的错误,那是因为与UnityEditor.Utils命名空间冲突,替换为 UnityEditor.iOS.Xcode.PBX.Utils 就可以了。

  5. 王有斌说:

    下载https://bitbucket.org/Unity-Technologies/xcodeapi 的源代码,把所有的cs文件放到 Editor/xcode下(AssemblyInfo.cs 除外)。然后你会看到很多的错误找不到 Utils, 那是因为河UnityEditor.Utils命名空间冲突,替换为 UnityEditor.iOS.Xcode.PBX.Utils 就可以了。

  6. 安亚晨说:

    雨松大大 想问您一下 4.x导入了这个报错 是我漏导了什么东西吗

  7. 杨循说:

    我比较想知道怎么加.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里就行了

  8. S丶nipeR说:

    momo请教一个问题,用5.3.5导出的IOS文件很大,libiPhone-lib.a文件占了1个G多。。。有没有解决办法啊 Unity3D研究院之5.x自带API打包xcode添加framework、plist - 雨松MOMO程序研究院 - 1

  9. mono~~ 请教一个问题,AddFileToBuild每次都在项目中添加一个源文件进去(蓝色文件夹),我想在项目中添加一个group到工程中(黄色文件夹)。。该怎么做呢,卡了好久。。。

    • = =说:

      我也发现这个问题,AddFileToBuild只有在加入带有framework的文件夹时,才会以GROUP方式加的,其他的都是folder references …晕死了

  10. 方津津说:

    momo:请教一个www超时的问题。 在手机上要等很久才会返回连接超时的error,有什么方法能缩短超时的时间

  11. 这个API只能做简单的设定像我之前想用这个API来做App name的Localization我只能将动态建立的InfoPlist.strings当成一般的档案加到XCode的专案里面没有办法将多个InfoPlist.strings合成一个档案挺麻烦的 最后还是手动将档案拖到专案中才可以

  12. 222说:

    proj.SetBuildProperty 改配置居然改不了project里的

  13. KFCNot说:

    你好,我是5.3.1f1。为什么using UnityEditor.iOS.Xcode 错误?我输入UnityEditor. 后自动补全里也找不到 iOS啊?

留下一个回复

你的email不会被公开。 必填项已用 * 标注。