Unity Xcode方式接入sdk

news2024/9/27 15:28:28

入口

创建 GameAppController 类 继承 UnityAppController
并且在类的实现之前 需要 加 IMPL_APP_CONTROLLER_SUBCLASS(GameAppController),表明这个是程序的入口。UnityAppController 实现了 UIApplicationDelegate。 可以简单看下 UIApplicationDelegate 的生命周期。

例:

@interface GameAppController : UnityAppController

+ (instancetype)shareAppController;

- (UIWindow*)appWindow;
@end

实现

IMPL_APP_CONTROLLER_SUBCLASS(GameAppController)

@implementation GameAppController {

@end

Unity 与 Objective-C 交互

Unity 调用 Objective-C

#define UNITY_CS_API extern "C"

/**
  微信登陆
 */
UNITY_CS_API void OCWXLogin(){
     //objective-c 代码
}

Objective-C 调用 Unity 代码

void    UnitySendMessage(const char* obj, const char* method, const char* msg);

obj 参数 表示GameObject Name
method 参数 表示要回调的方法名
msg 参数 表示回调的方法参数

Objective-C 与 Unity 的交互要注意的是
字符串使用的是 const char* 类型,而Objective-C 中使用的是NSString* 所以需要转换
字符串作为返回值返回 需要使用 strup 函数。否则程序将闪退
返回值 不能返回null 和 nil 否则闪退。所以返回值每次增加判断,如果null和nil 就用空字符串替换

例子

// const char* 转 NSString*
static inline NSString * str_c2ns(const char*s){
    if (s) {
        return [NSString stringWithUTF8String:s];
    }else{
        return [NSString stringWithUTF8String:""];
    }
}

//NSString* 转 const char*
+ (const char *) str_ns2c:(NSString *) content{
    return [content UTF8String];
}

//返回值使用 strdup 处理, 并做检查
UNITY_CS_API const char* OCReadClipBoard(){
    NSString *contentStr = [CoreManager.sharedInstance readClipBoard];
    if (contentStr == NULL || contentStr == nil) {
        contentStr = @"";
    }
    return strdup([UnityUtility str_ns2c:contentStr]);
}

Objective-C 与 Unity 交互 有时会使用到Json 进行数据传输,Unity 中 Null 在 Objectiv-C 中解析将会报错,使用NullSafe 库解决. github地址

接入微信SDK

遇到报错
Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: '+[WXApi genExtraUrlByReq:withAppData:]: unrecognized selector sent to class

微信官方文档的解释是需要在 Other Linker Flags 中添加 -ObjC -all_load 进行处理。我加入-all_load 会导致编译报错,这个方法行不通。
首先sdk 的配置都是添加在 UnityFramework 而不是 Unity-iPhone 上。如果是老的Unity 应该只有 Unity-iPhone,那就是添加到Unity-iPhone上。

然后由于-all_load 行不通,所以用-force_load 代替。-force_load 后面需要加入libWeChatSDK.a 所在到路径作为参数
比如:
在这里插入图片描述

关于微信登录,或者分享失效,没有回调的情况,应该是漏写了调用
在这里插入图片描述

接入友盟 和 阿里支付

遇到UTDID 库冲突。这里阿里官方有解释,下载去除 UTDID 的库。 下载的地方有说明
阿里的文档让人最舒服,没遇上什么问题。

Universal Links

这个如果没有配置好,微信登录将会照成2次弹窗确认。(那种给别人加企业签的就一定会有二次弹窗,因为没有teamid)
这个比较简单,随便找一个模板,替换teamid后,上传至服务器。然后在xcode中Signing & Capabilities 中的Associated Domains 配置 applinks: 域名

打包

如果使用Unity直接到处会覆盖xcode中我们写好的代码。所以把我们接入sdk的xcode代码放入Unity项目的Plugins 文件夹的iOS文件夹中。项目没有就自己创建。并把所有的第三方库也放入其中。这样打包的时候会自动导出至xCode项目。
此外xcode项目中还有一些自定义的配置。这个需要在打包流程完成后的回调中使用代码修改。
例如

string pbxProjectPath = PBXProject.GetPBXProjectPath(locationPath);
            
            //修改 Associated Domains 设置
            ProjectCapabilityManager capabilityManager =
                new ProjectCapabilityManager(pbxProjectPath, "Unity-iPhone.entitlements", "Unity-iPhone");
            capabilityManager.AddAssociatedDomains(new string[]{"applinks:cs1.jxhappy.top"});
            
            //wifi 信息
            capabilityManager.AddAccessWiFiInformation();
            
            // 百度持续定位
            capabilityManager.AddBackgroundModes(BackgroundModesOptions.LocationUpdates);
            
            capabilityManager.WriteToFile();
            
            PBXProject pbxProject = new PBXProject();
            pbxProject.ReadFromFile(pbxProjectPath);
            
            // string xCodeFrameworkPath = "./XCodeFramework";
            //
            // DirectoryInfo directoryInfo = new DirectoryInfo(xCodeFrameworkPath);
            //
            // foreach (var directory in directoryInfo.GetDirectories())
            // {
            //     ECKAddResourceGroupToiOSProject(locationPath, pbxProject, pbxProject.GetUnityFrameworkTargetGuid(),
            //         directory.Name);
            // }
            
            // 为类使用 @try @catch NULLSafe 中使用到了;
            pbxProject.SetBuildProperty(pbxProject.ProjectGuid(),"GCC_ENABLE_OBJC_EXCEPTIONS","YES"); 
            
            //Main
            string target = pbxProject.GetUnityMainTargetGuid();
            
            pbxProject.SetBuildProperty(target,"ENABLE_BITCODE", "NO");
            pbxProject.SetBuildProperty(target,"CONFIGURATION","Release");
            pbxProject.SetBuildProperty(target,"CONFIGURATION_BUILD_DIR","$(BUILD_DIR)/$(CONFIGURATION)");
            
            //微信相关的设置 都应该设置在 pbxProject.GetUnityFrameworkTargetGuid;

            pbxProject.AddFrameworkToProject(target,"CoreGraphics.framework",false);
            pbxProject.AddFrameworkToProject(target,"QuartzCore.framework",false);
            pbxProject.AddFrameworkToProject(target,"Foundation.framework",false);
            pbxProject.AddFrameworkToProject(target,"UIKit.framework",false);
            
            string targetUnityTarget = pbxProject.GetUnityFrameworkTargetGuid();
            
            //添加framework
            
            //微信sdk
            pbxProject.AddFrameworkToProject(targetUnityTarget,"Security.framework",false);
            pbxProject.AddFrameworkToProject(targetUnityTarget,"CoreGraphics.framework",false);
            pbxProject.AddFrameworkToProject(targetUnityTarget,"WebKit.framework",false);
            
            //支付宝sdk
            pbxProject.AddFrameworkToProject(targetUnityTarget,"libc++.tbd",false);
            pbxProject.AddFrameworkToProject(targetUnityTarget,"libz.tbd",false);
            pbxProject.AddFrameworkToProject(targetUnityTarget,"SystemConfiguration.framework",false);
            pbxProject.AddFrameworkToProject(targetUnityTarget,"CoreTelephony.framework",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"QuartzCore.framework",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"CoreText.framework",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget, "CoreGraphics.framework", false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"UIKit.framework",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"Foundation.framework",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"CFNetwork.framework",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"CoreMotion.framework",false);
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"AlipaySDK.framework",false);
            
            //百度地图sdk
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"BMKLocationKit.framework",false);
            pbxProject.AddFrameworkToProject(targetUnityTarget,"CoreLocation.framework",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"SystemConfiguration.framework",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"Security.framework",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"libsqlit3.0.tbd",false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget, "CoreTelephony.framework", false);
            //pbxProject.AddFrameworkToProject(targetUnityTarget,"libz.tbd",false);
            pbxProject.AddFrameworkToProject(targetUnityTarget,"AdSupport.framework",false);
            
            //UMengsdk
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"UMCommon.xcframework",false);
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"UMCommonLog.framework",false);
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"UMDevice.xcframework",false);
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"UMRemoteConfig.framework",false);
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"UTDID.framework",false);
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"UYuMao.framework",false);
            //
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"UMAPM.xcframework",false);
            // pbxProject.AddFrameworkToProject(targetUnityTarget,"UMLink.framework",false);
            
            //[WXApi genExtraUrlByReq:withAppData:]
            //报错 原因缺少 Wxapi genExtraUrlByReq 函数, 
            //-all_load 加载 所有的 静态链接库, 但是这个存在动态链接库的函数重复的问题,编译会报错
            //-force_load 强制 指定加载 静态链接库。
            pbxProject.AddBuildProperty(targetUnityTarget,"OTHER_LDFLAGS","-ObjC -force_load $SRCROOT/Libraries/Plugins/SDK/iOS/WechatSDK/libWeChatSDK.a");
            //pbxProject.AddFrameworkToProject(target,"WechatOpenSDK-XCFramework.xcframework",false);
            
            //Unity Tests
            string targetGuid = pbxProject.TargetGuidByName(PBXProject.GetUnityTestTargetName());
            pbxProject.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");
 
            //Unity Framework
            pbxProject.SetBuildProperty(targetUnityTarget, "ENABLE_BITCODE", "NO");
            pbxProject.SetBuildProperty(targetUnityTarget, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES");
            
            pbxProject.WriteToFile(pbxProjectPath);
            
            //修改 Info.plist 文件
            var plistPath = locationPath + "/Info.plist";
            var plist = new PlistDocument();
            plist.ReadFromFile(plistPath);

            PlistElementDict rootDict = plist.root;
            
            //设置LSApplicationQueriesSchemes(数组)
            PlistElementArray loginChannelsArr;
            loginChannelsArr = rootDict.CreateArray("LSApplicationQueriesSchemes");
            loginChannelsArr.AddString("weixin");
            loginChannelsArr.AddString("weixinULAPI");
            loginChannelsArr.AddString("weixinURLParamsAPI");
            
            //百度地图权限
            rootDict.SetString("NSLocationWhenInUseUsageDescription","前台定位");
            rootDict.SetString("NSLocationAlwaysUsageDescription", "永久定位");
            rootDict.SetString("NSLocationAlwaysAndWhenInUseUsageDescription","永久定位");
            
            //添加 url scheme
            PlistElementArray urlTypes = rootDict.CreateArray("CFBundleURLTypes");
            PlistElementDict wxUrl = urlTypes.AddDict();
            wxUrl.SetString("CFBundleTypeRole","Editor");
            wxUrl.SetString("CFBundleURLName","weixin");
            PlistElementArray wxUrlScheme = wxUrl.CreateArray("CFBundleURLSchemes");
            wxUrlScheme.AddString("wx528f8481cec8a716");

            PlistElementDict aliPay = urlTypes.AddDict();
            aliPay.SetString("CFBundleTypeRole","Editor");
            aliPay.SetString("CFBundleURLName","alipay");
            PlistElementArray aliUrlScheme = aliPay.CreateArray("CFBundleURLSchemes");
            aliUrlScheme.AddString("hjhaGameAliPay");
            
            plist.WriteToFile(plistPath);

接 苹果SDK 做上架准备

不得不吐槽一下,苹果文档真垃圾,真垃圾,真垃圾

  1. 沙盒模式的测试账号创建,提示This email address is not available for use as an Apple ID. You may already have an Apple ID associated with this address. Please try again or sign in using your existing Apple ID.

这个账号不是指你当前有的账号,也就是不能输入当前存在的账号,可以随便输入,但不能跟现有的账号重复。它只是测试的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据集][目标检测]智慧牧场猪只检测数据集VOC+YOLO格式16245张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):16245 标注数量(xml文件个数):16245 标注数量(txt文件个数):16245 标…

如何在算家云搭建ComfyUI(AI绘画)

一、ComfyUI简介 ComfyUI 是一个强大的、模块化的 Stable Diffusion 界面与后端项目。该用户界面将允许用户使用基于图形/节点/流程图的界面设计和执行高级稳定的扩散管道。该项目部分其它特点如下: 全面支持 SD1.x,SD2.x,SDXL,…

Java 入门指南:Java 并发编程 —— 并发容器 ArrayBlockingQueue

BlockingQueue BlockingQueue 是Java并发包(java.util.concurrent)中提供的一个阻塞队列接口,它继承自 Queue 接口。 BlockingQueue 中的元素采用 FIFO 的原则,支持多线程环境并发访问,提供了阻塞读取和写入的操作&a…

思维导图在线制作怎么制作?5个软件教你快速进行思维导图制作

思维导图在线制作怎么制作?5个软件教你快速进行思维导图制作 思维导图是一种用于组织信息、梳理思路和激发创意的可视化工具。在线制作思维导图可以帮助你随时随地进行创作和分享,以下是五款在线思维导图工具,可以帮助你快速进行思维导图的制…

props与defineProps

在 Vue3 中&#xff0c;script 脚本存在两种情况。一种是 setup 函数&#xff0c;一种是 <script setup>。而针对这两种不同情况&#xff0c;Vue 也存在 props 和 defineProps 两种接收父组件传递数据的形式。 首先&#xff0c;默认已掌握 Vue2 的父子组件 props 传参&a…

五轴数控走心机指的是哪五轴

五轴数控走心机&#xff0c;作为现代机械加工领域中的高精度设备&#xff0c;其核心在于其独特的五轴联动系统。这五个轴分别是X1轴、Y1轴、Z1轴、Z2轴和X2轴&#xff0c;它们各自承担着不同的运动和控制功能&#xff0c;共同实现了对工件的复杂加工。 X1轴&#xff1a;作为向下…

北芯生命持续亏损:产能利用率不理想仍扩产能,销售费用越来越高

《港湾商业观察》黄懿 6月29日&#xff0c;深圳北芯生命科技股份有限公司&#xff08;下称“北芯生命”&#xff09;提交首轮问询回复&#xff0c;更新2023年年报财务数据&#xff0c;保荐机构为中国国际金融股份有限公司。 据悉&#xff0c;北芯生命曾向港交所递交上市申请&…

[C++]AVL树插入和删除操作的实现

AVL树又称为高度平衡的二叉搜索树,是1962年由两位俄罗斯数学家G.M.Adel’son-Vel’skii和E.M.Landis提出的。ALV树提高了二叉搜索树树的搜索效率。为此,就必须每向二叉搜索树插人一个新结点时调整树的结构,使得二叉搜索树保持平衡,从而尽可能降低树的高度,减少树的平均搜索长度…

JS简介 JS特点

JS简介 Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的 客户端脚本语言 &#xff0c;主要目的是为了解决服务器端语言&#xff0c;遗留的速度问题&#xff0c;为客户提供更流畅的浏览效果。 JS特点 JS是一种运行于浏览器…

注册中心 Eureka Nacos

文章目录 目录 文章目录 1. 什么是注册中心? 2.常见的注册中心 3 . Eureka 4 . Nacos 5 . Nacos与Eureka的区别 总结 1. 什么是注册中心? 在最初的架构体系中, 集群的概念还不那么流行, 且机器数量也比较少, 此时直接使用DNSNginx就可以满足几乎所有服务的发现. 相…

ABAP正则表达式 特殊字符处理

REPLACE ALL OCCURRENCES OF REGEX [[:space:]] IN <fs_purhdinfo>-cell_value WITH ."可去掉空格或回车键 REPLACE ALL OCCURRENCES OF &#xff1a; IN <fs_purhdinfo>-cell_value WITH ."可去掉空格或回车键 REPLACE ALL OCCURRENCES OF R…

如何构建高效办公管理系统——Java SpringBoot实战教程,2025年最新设计理念

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

413力扣周赛

3274. 检查棋盘方格颜色是否相同 - 给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。以下是棋盘的参考图。 如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。分析问题&#xff1a; 由图知&…

在安卓和Windows下使用Vizario H264 RTSP

Unity2021.3.35f1&#xff0c;运行模式为ENGINE_SERVER 1.环境设置 Windows设置 安卓设置 2.代码修改 ConnectionProperties中的server必须与真实IP一样&#xff0c;所以需要新增一个获取IP的函数 public string GetLocalIPAddress(){IPHostEntry host;string localIP &quo…

缓解webclient频繁报‘Connection prematurely closed BEFORE response’的问题

现象&#xff1a; 我在Java代码中使用org.springframework.web.reactive.function.client.WebClient进行网络请求&#xff0c;一开始会有比较多的偶发报错&#xff1a;Connection prematurely closed BEFORE response&#xff0c;网络连接莫名其妙就断了。 处理&#xff1a; …

JDBC以及事务

内容概要&#xff1a; 了解JDBC是什么&#xff0c;以及定义&#xff0c;它有什么好处掌握使用JDBC访问数据库掌握使用JDBC进行增删改查掌握数据库注入问题&#xff0c;以及怎么解决数据库注入问题掌握事务的使用&#xff0c;以及为什么需要事务。理解事务的四大特性&#xff1…

InternLM模型部署教程

一、模型介绍 interlm是一系列多语言基础模型和聊天模型。 InternLM2.5 系列&#xff0c;具有以下特点&#xff1a; 出色的推理能力 &#xff1a;数学推理性能达到世界先进水平&#xff0c;超越 Llama3、Gemma2-9B 等模型。1M 上下文窗口 &#xff1a;在 1M 长上下文中几乎完…

【Qt】Qt 网络 | HTTP

文章目录 HTTP Client核心APIQNetworkAccessManagerQNetworkRequestQNetworkReply 代码示例 本文不涉及 HTTP 的相关前置知识&#xff0c;前置知识可参看 URL概念及组成 HTTP请求 HTTP响应及Cookie原理 HTTP Client 进行 Qt 开发时&#xff0c;和服务器之间的通信很多时候也会…

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界!

随着编程语言的不断演进&#xff0c;Python已经成为开发者们心目中的“瑞士军刀”。它的简洁易用、强大的库支持、广泛的应用领域&#xff0c;让它在人工智能、数据分析、网络爬虫、自动化办公等领域展现了无与伦比的优势。那么&#xff0c;如何深入掌握Python这门语言并用它解…

Stable Diffusion【提示词】【居家设计】:AI绘画给你的客厅带来前所未有的视觉盛宴!

前言 参数设置大模型&#xff1a;RealVisXL V4.0 Lightning采样器&#xff1a;DPM SDE Karras采样迭代步数&#xff1a;5CFG&#xff1a;2图片宽高&#xff1a;1024*1024反向提示词&#xff1a;(octane render, render, drawing, anime, bad photo, bad photography:1.3),(wor…