Unity自动化Xcode配置及接入SDK踩坑记录

PBXProject能做什么

  • 添加依赖库
  • 修改BuildSettings
  • 修改Plist文件
  • 添加包文件Bundle文件
  • 添加库文件,头文件Search Path
  • 添加自己的OC代码

例如以下要求:
在这里插入图片描述

代码示例

using System;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

namespace EB.Editor
{
    public static class PostProcess
    {

        [PostProcessBuild(100)]
        public static void IOSProcess(BuildTarget target, string path)
        {
            EB.Debug.Log("IOSProcess111111111111111111");
            UnityEngine.Debug.LogFormat("结束打包时间:{0}",DateTime.Now.ToString());
            if (target != BuildTarget.iOS)
            {
                return;
            }
            UnityEngine.Debug.LogFormat("PostProcess {0}, {1}", target, path);

            PBXProject proj = new PBXProject();
            string project_file_name = PBXProject.GetPBXProjectPath(path);
            proj.ReadFromFile(project_file_name);

            string guid = proj.GetUnityFrameworkTargetGuid();

#region 自动添加framework
            proj.AddFrameworkToProject(guid, "StoreKit.framework", false);
            proj.AddFrameworkToProject(guid, "CoreTelephony.framework", false);
            proj.AddFrameworkToProject(guid, "libz.tbd", false);
            proj.AddFrameworkToProject(guid, "libc++.tbd", false);
            proj.AddFrameworkToProject(guid, "libsqlite3.0.tbd", false);
            proj.AddFrameworkToProject(guid, "libsqlite3.tbd", false);
            #endregion

            #region UseSymbols
            proj.SetBuildProperty(guid, "DEBUG_INFORMATION_FORMAT", "dwarf-with-dsym");
            proj.SetBuildProperty(guid, "GCC_GENERATE_DEBUGGING_SYMBOLS", "YES");
            proj.SetBuildProperty(guid, "COPY_PHASE_STRIP", "NO");
            proj.SetBuildProperty(guid, "GCC_ENABLE_OBJC_EXCEPTIONS", "YES");
            proj.SetBuildProperty(guid, "GCC_ENABLE_CPP_EXCEPTIONS", "YES");
            proj.SetBuildProperty(guid, "ENABLE_BITCODE", "NO");
            proj.AddBuildProperty(guid, "OTHER_LDFLAGS", "-ObjC -lz");
            proj.SetBuildProperty(guid, "SWIFT_VERSION", "5.0");
            
            //XCFramework 
            proj.SetBuildProperty(guid,"VALIDATE_WORKSPACE","YES");
            #endregion

            proj.WriteToFile(project_file_name);
            UnityEngine.Debug.LogFormat("PostProcess {0}, {1} finished", target, path);
        }
    }
}

Unity更新后Xcode的项目结构:

Xcode项目结构

从 Unity 2019.3 开始,已弃用 PBXProject.GetUnityTargetName 和 pbxProject->TargetGuidByName(“Unity-iPhone”)。接下来可以改用 pbxProject->GetUnityFrameworkTargetGuid() 或 pbxProject->GetUnityMainTargetGuid():

// 已弃用
string targetGuid = proj.TargetGuidByName("Unity-iPhone");
string targetGuid = proj.TargetGuidByName(PBXProject.GetUnityTargetName());

// 改为以下调用之一
string targetGuid = proj.GetUnityFrameworkTargetGuid(); 
string targetGuid = proj.GetUnityMainTargetGuid();

其他错误

  1. 缺少对应的库
    在这里插入图片描述

  2. Unity端定义了IOS端的外部方法,而在IOS这边找不到,删掉Unity的外部方法或者在IOS端补充对应的方法。

  • 缺少包文件Bundle (资源文件包)
    检查导入的SDK中所有的bundle文件是否勾选iOS选项,如果没有勾选,在Unity编译出Xcode工程后会缺失。

    如果还找不到的话,将Bundle文件手动拖入,会自动导入

  • XCode 动态库未签名问题的解决

code signature in (*.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed

需要将KSAdSDK.framework的Embed修改为Embed&Sign,同时注意到添加到主工程

  • 上传appstore失败

Invalid Bundle. The bundle at ‘ProductName.app/Frameworks/UnityFramework.framework’ containsdisallowed file ‘Frameworks’:. With error code STATE_ERROR.VALIDATION_ERROR.90206 for id

在这里插入图片描述
主工程设置build settings》Always Embed Swift Standard Libraries: YES extension 》 Always Embed Swift Standard Libraries: NO

  • 缺少合规证明
   PlistDocument plist = new PlistDocument();
   string info_plist_file_name = Path.Combine(path, "Info.plist");
   plist.ReadFromFile(info_plist_file_name);
   // plist.root["LSHasLocalizedDisplayName"] = new PlistElementString("Yes");
   plist.root.SetBoolean("ITSAppUsesNonExemptEncryption", false);
   plist.WriteToFile(info_plist_file_name);
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity接入SDK是指在Unity项目中集成第三方SDK的过程。具体的接入流程包括以下几个步骤: 1. 准备工作:首先,你需要从SDK提供商处获取SDK的相关文件,包括jar文件、iOS的.framework文件等。 2. 导入SDK文件:将SDK的相关文件导入到Unity项目中。对于Android平台,可以将jar文件放置在Unity项目的Plugins文件夹下;对于iOS平台,可以将.framework文件拖入Unity项目中。 3. 配置SDK参数:在Unity中,你需要根据SDK的要求配置相应的参数。这些参数可能包括App ID、App Key、回调URL等。你可以在Unity中创建一个脚本,用来存储和管理这些参数。 4. 调用SDK接口:根据SDK的文档和示例代码,调用SDK提供的接口完成相应的功能。你可以在Unity中编写脚本,通过调用SDK接口实现登录、支付、分享等功能。 以上是Unity接入SDK的一般流程。具体的接入方法和代码示例可以参考SDK提供商的文档和示例代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [unity接入SDK流程(android)](https://download.csdn.net/download/lb18520182905/44974594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [[Unity]Unity接平台SDK(3种方式)](https://blog.csdn.net/zp288105109a/article/details/80244617)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【Unity游戏开发】SDK接入与集成——小白入门篇](https://blog.csdn.net/weixin_34195142/article/details/85919506)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KindSuper_liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值