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"); //Mainstring 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//微信sdkpbxProject.AddFrameworkToProject(targetUnityTarget,"Security.framework",false);pbxProject.AddFrameworkToProject(targetUnityTarget,"CoreGraphics.framework",false);pbxProject.AddFrameworkToProject(targetUnityTarget,"WebKit.framework",false);//支付宝sdkpbxProject.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 Testsstring targetGuid = pbxProject.TargetGuidByName(PBXProject.GetUnityTestTargetName());pbxProject.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");//Unity FrameworkpbxProject.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 schemePlistElementArray 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 和 游戏内购不是一个东西。我说怎么好像不对劲, 接好变这样。

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【时间盒子】-【5.绘制闹钟】动态绘制钟表和数字时间

Tips: Preview装饰器,支持组件可预览; Component装饰器,自定义组件; Canvas组件的使用; 使用RenderingContext在Canvas组件上绘制图形,请参考官方文档:https://developer.huawei.com/consume…

Unity(2022.3.41LTS) - UI详细介绍-Scroll View(滚动视图)

目录 零.简介 一、基本功能与用途 二、主要组件 Rect Transform(矩形变换): Scroll Rect(滚动矩形)组件: Scrollbar(滚动条)组件: Mask(遮罩&#xff…

【GD32】RT-Thread实时操作系统移植(GD32F470ZGT6)

1. 简介 最近几年可以发现国产的实时操作系统越来越受欢迎了,本篇要移植的就是当中的翘楚——RT-Thread。 RT-Thread诞生于2006年,是国内以开源中立、社区化发展起来的一款高可靠实时操作系统 ,由睿赛德科技负责开发维护和运营 。并且在上一年…

超详细步骤——Keil MDK-ARM 如何修改工程名字

背景: 注意:本项目是基于 STM32 单片机的裸机程序,使用 STM32CubeMX 工具生成的 Keil MDK-ARM 工程。 目标: 在 Keil MDK-ARM 开发环境中,将名为version0805 的工程重命名为 version0910,并确保所有新编译…

文本怎么在线做成二维码?文字信息生成活码的制作方法

文本怎么做成二维码来展示呢?现在通过二维码分享信息的方式越来越常见,可以将文本二维码应用于许多的用途,比如人员信息、物品信息、通知内容、企业介绍等内容都可以生成二维码来展示。那么文本生成二维码该怎么生成呢?下面教大家…

达梦数据库的系统视图v$sysstat

达梦数据库的系统视图v$sysstat 在达梦数据库(DM Database)中,V$SYSSTAT 视图提供了关于数据库系统性能和状态的一系列统计信息。这个视图是数据库管理员(DBA)用来监控和管理数据库性能的重要工具之一。它包含许多统计…

CUDA统一内存:简化GPU编程的内存管理

CUDA统一内存:简化GPU编程的内存管理 在现代GPU编程中,内存管理一直是开发者面临的一个重要挑战。特别是在使用NVIDIA CUDA进行高性能计算时,如何在CPU和GPU之间高效地传输数据、以及如何管理这些数据的生命周期,都是影响程序性能…

postman注入csrf

示例脚本 参数配置位置 必要参数 django项目仅需要设置domain即可,比如www.baidu.com,baidu.com尽量域名精确避免修改到其他域的参数 必须把这个domain添加到 cookies->Manage cookies ->Domains Allowlist 中,否则cookie的注入失败 代码 // 必…

图像白平衡

目录 效果 背景 什么是白平衡? 实现原理 将指定图色调调整为参考图色调主要流程 示例代码 效果 将图一效果转换为图二效果色调: 调整后,可实现色调对换 背景 现有两张图像,色调不一致,对于模型重建会有影响。因…

Java体系中的继承

前言 #继承(Inheritance) 是面向对象编程(OOP)中的一个重要概念,它允许一个类(称为子类或派生类)可以从另一个类(称为父类、基类或超类)继承属性(数据&#…

Unexpected token d in JSON at position 5, check bodyParser config错误解决

错误原因:json格式不对 { desc"设备1", iotProjectId11 } 解决:通过json在线校验格式校验json格式,找出错误原因,修改 在线JSON校验格式化工具(Be JSON) 修改: {"desc": &…

『功能项目』AssetBundle上传加载u3d模型【23】

本章开始做游戏的登陆界面,运用热更新的AssetBundle上传加载u3d模型 首先在22骑乘坐骑项目基础上重新创建一个场景 重命名为RegistrationUI 在资源商店下载一个场景 选择一个免费资源场景导入 进入新导入的场景 完全解压缩后重命名为ResUIScene 将颜色调成为蓝色调…

强制性国标!上海控安参编《汽车整车信息安全技术要求》正式发布

8月23日,上海控安参编的《GB 44495-2024 汽车整车信息安全技术要求》正式发布,标准将于2026年1月1日正式实施。 汽车整车信息安全技术要求 《汽车整车信息安全技术要求》由工业和信息化部归口,委托全国汽车标准化技术委员会智能网联汽车分会…

13、Django Admin创建两个独立的管理站点

admin文件 from .models import Epic, Event, EventHero, EventVillain from django.contrib.admin import AdminSiteclass EventAdminSite(AdminSite):site_header "Events管理"site_title "欢迎您!"index_title "管理员"even…

学习之MySQL函数(字符串,数值,日期,流程)

字符串函数 函数是指一段可以直接被另一段程序或代码 案例: – 1、由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0、比如:1号员工的工号应该为00001. update emp set worknolpad(workno, 5, 0) 运…

2024 年全国大学生数学建模竞赛(国赛)浅析

需要完整资料,请关注WX:“小何数模”! (需要完整B、C和E题资料请关注WX:“小何数模”,获取资料链接!) 本次万众瞩目的全国大学生数学建模赛题已正式出炉,无论是赛题难度…

2024 数学建模高教社杯 国赛(A题)| “板凳龙”舞龙队 | 建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,运用等距螺线,多目标规划等强大工具,构建了这一题的详细解答哦! 为大家量身打造创新解决方案。小秘籍团队,始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

Android 下的 XML 文件(概念理解、存储位置理解)

一、XML 1、XML 概述 XML(Extensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言 类似于 HTML,但旨在传输和存储数据,而不是显示数据,且基本语法都是标签 2、XML 的特点 &am…

记录ssl epoll的tcp socket服务端在客户端断开时崩溃的问题

文章目录 当客户端关闭后,Epoll 的 TCP socket 服务端会收到两次断开事件可能有以下原因及解决方法:原因分析解决方法 问题ssl socket服务端代码出错现象第一次尝试修改正确改法附上客户端代码 记录ssl epoll的tcp socket服务端在客户端断开时接收到多次…

进程的那些事——了解进程(虚拟地址空间)

目录 前言 一、程序地址空间(虚拟地址空间) 二、虚拟地址寻找物理内存 1.页表 总结 前言 提示:这里可以添加本文要记录的大概内容: 程序和进程之间的区别: 进程:对用户而言,进程是运行中的…