Unity Xcode方式接入sdk

入口

创建 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.

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

  1. 接入Apple Pay 一直提示 付费应用程序协议有新版本。但是又没有给同意条款的入口。
    这个情况应该是还有别的事务还没有处理,或者别的事务还在审核,要等审核通过,才能进行同意条款

  2. 接错了SDK, TMD Apple Pay 和 游戏内购不是一个东西。我说怎么好像不对劲, 接好变这样。

在这里插入图片描述
我去找内购文档了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拍卖新纪元:Spring Boot赋能在线拍卖解决方案

需求分析 1.1技术可行性:技术背景 在线拍卖系统是在Windows操作系统中进行开发运用的,而且目前PC机的各项性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的,也是当下广泛应用的技术之一。 系统的开发环境和配置…

docker实战基础一 (Docker基础命令)

一、docker安装 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新并安装 Doc…

Spring Boot:医疗排班系统开发的技术革新

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

windows安装php7.4

windows安装php7.4 1.通过官网下载所需的php版本 首先从PHP官网(https://www.php.net/downloads.php)或者Windows下的PHP官网(http://windows.php.net/download/)下载Windows版本的PHP安装包。下载后解压到一个路径下。 2.配…

从PDF到CAD:四大必备转换工具推荐!

无论是建筑设计师还是机械工程师,都面临着将旧图纸或扫描件转换成可编辑CAD文件的任务。这不仅是为了提高工作效率,更是为了适应数字化转型的大趋势。今天,我们就来探索几款高效且用户友好的解决方案! 福昕PDF转换大师&#xff0…

深入理解GAN网络

Generative Adversarial Networks创造性地提出了对抗训练来代替人工指定的loss。之前的文章初步理解了一下,感觉还是不到位,在这里再稍微深入一点。 交叉熵cross entropy 鉴别器是GAN中重要的一部分,鉴别器和生成器交替训练的过程就是adver…

PCL 移动立方体三维重建——RBF算法【2024最新版】

目录 一、算法原理1、算法概述2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接,首发于:2024年9月1日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、算法概述 该算法实现的是Reconstruction a…

微信小程序服务器费用一年多少?微信小程序开发

在互联网时代,微信小程序已成为众多企业和个人拓展业务、提升服务品质的有力工具。然而对于许多准备涉足小程序领域的朋友来说【开发一个小程序大概需要多少钱】以及【微信小程序服务器费用一年需要多少】是首要关注的问题,今天飞飞将和你们分享小程序服…

OPenCV结构分析与形状描述符(3)计算一个点集的最小外接矩形的函数boundingRect()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算一个点集的最小右上边界矩形或灰度图像中的非零像素。 该函数计算并返回指定点集或灰度图像中非零像素的最小右上边界矩形。 在OpenCV中&am…

ardupilot开发 --- MQTT 篇

原图:ardupilot-onboardComputer-4Glink-console.drawio 白嫖党请点赞、收藏、关注 你说在一起要算命 前言参考文献 前言 为什么在ardupilot开发过程中要用到MQTT ? 客户要求向他们的指挥中心平台推送视频流和飞控数据,即要将图数传数据推送给…

LTM4622双路电源芯片的相关测试

最近需要使用LTM4622电源芯片,所以做了demo板进行测试: 1.原理图如下: 2.用AD画的电路板如下: 3.芯片相关知识: 芯片的封装: 典型应用: 管脚定义 VIN:电源的输入管脚。 RUN:相当于输出使能脚…

C语言 | Leetcode C语言题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int firstUniqChar(char* s) {struct hashTable* position NULL;int que[26][2], left 0, right 0;int n strlen(s);for (int i 0; i < n; i) {int ikey s[i];struct has…

UnityShaderGraph 卡通水面效果

效果预览&#xff1a; 原理&#xff1a; 使用三张噪声贴图&#xff0c;结合UV偏移制作水面波纹混合的假象效果 噪声图1&#xff1a; 噪声图2&#xff1a; 噪声图3&#xff1a; 三次采样都是同样的方法&#xff0c;使用step函数来二分噪声 三张噪声采样结果相乘得到最终的波纹…

JVM系列(五) -内存相关的调优参数

一、摘要 在上篇文章中,我们详细介绍了 JVM 的内存布局。 今天这篇文章,并结合之前的介绍知识,一起了解一下 JVM 内存相关的调优参数。 二、内存设置相关的命令 所有内存溢出的问题,除了代码可能存在问题以外,更直观的问题是内存空间不足,如何通过参数来控制各区域的…

网络层 III(划分子网和构造超网)【★★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、网络层转发分组的过程 分组转发都是基于目的主机所在网络的&#xff0c;这是因为互联网上的网络数远小于主机数&#xff0c;这样可以极大地压缩转发表的大小。…

三诺动态血糖管理在医院中的应用

一、引言 随着糖尿病患病率的逐年上升&#xff0c;糖尿病管理已成为医疗体系中的重要挑战。特别是在医院环境中&#xff0c;针对重症及需要精细化治疗的患者&#xff0c;动态血糖管理显得尤为重要。传统血糖监测手段的局限性日益凸显&#xff0c;而三诺生物传感股份有限公司&am…

微服务CI/CD实践(四)Jenkins部署及环境配置

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;服务器先决准备 微服务CI/CD实践&#xff08;三&#xff09;gitlab部署及nexus3部署 微服务CI/CD实践&#xff08;四&#xff09…

英伟达AI超级计算机SuperPod:H100→GH200→GB200

英伟达的 DGX SuperPOD 是一台完整的数据中心级 AI 超级计算机&#xff0c;采用模块化的设计&#xff0c;支持不同规模大小的设计。每台超级计算机都在出厂前完成了搭建、布线和测试&#xff0c;从而大大加快了在用户数据中心的部署速度 。 NVIDIA DGX SuperPOD是下一代数据中心…

DML、DQL、DCL的基础介绍

1.DML、DQL、DCL 1.1DML-介绍 DML英文全称Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中表的数据记录进行增删改操作 添加数据&#xff08;INSERT&#xff09;修改数据&#xff08;UPDATE&#xff09;删除数据&#xff08;DEL…

echarts环形图

let dataValue[{value: 30,name: 桥梁,percent: 0.25,color: rgba(248,95,94,1),radius: [75%, 80%],center: [22%, 50%],},{value: 15,name: 隧道,percent: 0.25,color: rgba(243,185,71,1),radius: [65%, 70%],center: [22%, 50%],},{value: 18,name: 路基,percent: 0.25,col…