赞
踩
unity xcode打包自动化,在unity打完xcode包以后,unity自己回调带有【PostProcessBuild】的方法或者脚本,从而读取到xcode配置。
特别注意:此脚本不用挂 monobehaviour ,只需要把脚本放入Assets/Editor/下即可!!!
把你的写的.mm 和.h 文件放入 Plugin/ios下面,这个是和oc交互需要用到的,他需要在ios模式下交互
具体的api不解释了,去查unity官网文档即可。
就根据unity2020接入ios sdk来说
xcode编译基于Unity-iPhone和UnityFramework(Unity2019以后出现),所以在接入iossdk的是时候,我们只需要配置 UnityFramework的大部分环境和Unity-IPhone 里的少量环境。
咱们先说步骤,具体操作我会在后面贴图。
我们需要配置一下几步
1.配置相关证书,双击给到你的p12文件,输入密码,把他安装到mac本地,因为这个文件有你的teamid等相关信息,如果本地以前有过安装文件的话,点开你的应用程序,点击秘钥,把以前的.p12删除,如果找不到秘钥,点击你的.p12文件这样自己会弹出秘钥,安装完.p12文件以后,接下来我们就可以配置证书,证书会有两种格式 dev/dis,这个和你发布的时候有关,看你想要用那种方式去发布。
2.添加frameworks和静态库到buildphase里(这些静态库ios提供的和你自己要导入的sdk相关的framework和.a文件),除了内置的ios库以及framework以外,sdk自己的库和framework文件你需要添加到工程里,点击左侧工程,进入你的目录,点击你的要添加的文件夹通过AddFIles添加,需要勾选if needs(或者直接手动拖到你的左侧列表里,他会给你提供选择),这些库和文件只需要添加到unityframework里编译,unity-iphone不用添加(如果两份添加的话可能会重复,编译xcode的时候会报错),你把sdk相关文件拖进去以后,他会把文件都自动添加上,如果没有添加上的话记得把你的framework和.a文件手动拖进入(sdk相关文件)。
3.
1.配置buildSetting 搜索bitcode ---> NO ,如果编译过程中报错的话,那就把unity-iphone和unityframework里的设置一下。
2.在otherlink里边去添加 -ObjC,这是支持oc代码的,其他应该还需要添加,这个按照SDK文档来就行了,添加在UnityFramework就行
3.就这些应该也不用设置什么了,如果有需要的话查看你的sdk文档
4. 配置相关资源,在unityframework里把你的sdk里边的资源都拖进来,比如.bundle.cfg.dat等资源类型的文件都添加complie sources里,这个添加unityframework里就好,这个需要你自己手动添加,如果不添加资源的话在编译的时候会报错,因为你在把SDK文件的相关目录拖进入的时候,他已经在UnityiPhone --- buildphase里添加了,所以不用再次添加,只需要在unityframework里把资源放入就好。
配置好以上资源以后,就可以编译了。
一些常用报错的解决方案
1.obj_class_xx 这个是找不到类,这个时候就需要具体问题具体分析,看看是哪个文件里边找不到相关的类,一般情况下就是sdk文件缺少引入framework和缺少添加ios内置framework和静态库
2.device_left_space 这种报错就是没有空间了,清理一下mac空间就好,或者找到archive目录,直接清理一下,他在xcode里边是很占内存的,能省出一大部分空间
3.与bitcode相关的报错就是 把bitcode设置为no就好
4.不要去替换unityframeworks的目录,因为他是unity自己生成的,如果复制粘贴的话可能会重复或者找不到plist,不要去替换plist
5.library not found xxx,这个就是没有在library search path里添加相关文件的目录,给他们添加一下就好。
6.xxx.h not found 这种就是.h文件没有找到 ,这就情况就是需要在header search path 里把这个文件的根目录添加上就行,如果还找不到那就在添加一层
7.xxxframework not found,这个是库没有找到,那就在framework search path里把库的路径添加上就好
8.search path 在buildSetting里,搜索search path就好
9.如果连接上手机安装到手机上的话,报错那就是手机没有允许权限,重新插入一下允许权限就好
5.在sdk初始化和需要调用一些接口的时候会在unityAppController.mm 文件里,这个时候根据文档直接调用就行,如果崩溃的话及时联系第三方或者相关技术人员
6.配置plist 这个里边就是配置一些权限,拍照,录音啥的,手机定位,以及屏幕旋转,微信,支付宝各种支付,具体的话按照文档来吧。
最后一步直接出包就行,如果还有其他报错或者说没有配置的地方,导致没有编译过去,及时联系sdk相关技术人员。
在这里设置包名,teamid,证书
,最后提供一个范例,仅供参考。
#if UNITY_IOS || UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using UnityEditor;
using System.IO;
/// <summary>
/// 此脚本作为范例,不做具体配置,仅提供参考!!!
/// </summary>
[PostProcessBuild]
public class OnBuildPostprocess
{
public static void BuildPostProcess(BuildTarget target, string path)
{
if (!File.Exists(path))
{
Debug.LogError("不存在此目录文件,Unity打包失败");
return;
}
if (target == BuildTarget.iOS)
{
InitData(path);
}
}
internal static void InitData(string path)
{
// 读取到unity打包后生成的xcode文件
PBXProject pro = new PBXProject();
string file = File.ReadAllText(path);
pro.ReadFromFile(file);
// 1.获取到unityframework配置 2.获取到unity-iphone 配置
string unityframework = pro.GetUnityFrameworkTargetGuid();
string main = pro.GetUnityMainTargetGuid();
}
/// <summary>
/// 添加 frameworks以及静态库
/// </summary>
/// <param name="proj"></param>
/// <param name="path"></param>
internal static void AddFrameworks(PBXProject proj, string path,string main,string unityframework)
{
if (proj == null) return;
if (!File.Exists(path)) return;
string str = ".Framework";
string libStr = ".tdb";
List<string> frameworks = new List<string>
{
"AssetLibrary",
"StoreKit",
"UIKit",
"GameKit",
"CoreMotion",
"Photos",
};
List<string> libs = new List<string>
{
"libc++",
"libSqlite3",
"libz"
};
for (int i = 0; i < frameworks.Count; i++)
{
proj.AddFrameworkToProject(unityframework,frameworks[i] + str, false);
}
for (int i = 0; i < libs.Count; i++)
{
proj.AddFrameworkToProject(unityframework, libs[i] + libStr, false);
}
proj.AddFrameworksBuildPhase(unityframework);
}
/// <summary>
/// 配置 info.plist
/// </summary>
/// <param name="proj"></param>
/// <param name="path"></param>
internal static void AddPlist(PBXProject proj, string path)
{
if (proj == null) return;
if (!File.Exists(path)) return;
PlistDocument plist = new PlistDocument();
plist.root.SetString("xx","xx");
plist.root.SetBoolean("xx", false) ;
plist.root.SetInteger("xx", 1);
plist.root.SetDate("xx", System.DateTime.MaxValue);
plist.WriteToFile(path);
}
/// <summary>
/// 添加BuildSetting
/// </summary>
/// <param name="proj"></param>
/// <param name="path"></param>
internal static void AddBuildSetting(PBXProject proj, string path,string unityframework)
{
if (proj == null) return;
if (!File.Exists(path)) return;
proj.SetBuildProperty(unityframework,"xx","xx");
}
/// <summary>
/// 添加BuildPhase
/// </summary>
/// <param name="proj"></param>
/// <param name="path"></param>
internal static void AddBuildPhase(PBXProject proj, string path)
{
if (proj == null) return;
if (!File.Exists(path)) return;
}
}
#endif
以上亲测可用,如果有不明白或者不了解的地方,可以和大佬们交流交流哈。
希望路过的各位大佬多多指正,小弟拜谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。