当前位置:   article > 正文

Unity XCode自动化打包以及 Unity2020 接入 iossdk相关配置_unity 2020 sdk

unity 2020 sdk

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

以上亲测可用,如果有不明白或者不了解的地方,可以和大佬们交流交流哈。

希望路过的各位大佬多多指正,小弟拜谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/341536
推荐阅读
相关标签
  

闽ICP备14008679号