Unity和iOS原生专题四 Unity和iOS原生交互传值内存空间分配问题

一  调用方法一

1.1 Unity代码-Unity调方法传参,有返回值

[DllImport("__Internal")]
// 给iOS传string参数,有返回值,返回值通过iOS的return方法返回给Unity
private static extern string getIPv6(string mHost, string mPort)

1.2 iOS代码-iOS通过return方法,将值返回给Unity

/**获取IPv6的值,并返回给Unity@param mHost 主机名@param mPort 端口号@return IPv6值
*/
extern "C" const char * getIPv6(const char *mHost, const char *mPort)
{return mHost;
}

1.3 注意空间分配(上面的写法会报如下错误)

skins(2509,0x1a8e5cb40) malloc: *** error for object 0x16fdc9114: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

1.4 修改错误后正确代码

/**获取IPv6的值,并返回给Unity@param mHost 主机名@param mPort 端口号@return IPv6值
*/
extern "C" const char * getIPv6(const char *mHost, const char *mPort)
{// strdup(const char *__s1) 复制mHost字符串,通过Malloc()进行空间分配 return strdup(mHost);
}

1.5 如果Unity传参为int类型,可以使用return mHost方法

unity代码
[DllImport("__Internal")]
// 给iOS传int参数,无返回值,返回值通过iOS的return方法返回给Unity
private static extern int setMyInt(int date);
ios代码
// 返回int值
extern "C" int setMyInt(int date)
{return date;
}

1.5 总结

1:如果Unity传参为string类型,不执行strdup()方法而使用return mHost方法,导致mHost没有分配内存空间而报错

2:Unity方法中参数的变量名为date,在iOS中的extern “C” int setMyInt(int date)方法中设置的参数变量名可以与Unity的相同,设置为date,也可以是a、b、c等自定义参数变量,但是为了代码规范,尽量和Unity参数保持一致.

3:调用DllImport(“”)方法,需要引入命名空间:
using System.Runtime.InteropServices;

4:extern “C”修饰的变量和函数是按照C语言方式编译和连接的

二 Unity调方法传参,无返回值

2.1 unity代码
// 传数据给iOS
[DllImport("__Internal")]
// 给iOS传string参数,无返回值,返回值通过iOS的UnitySendMessage方法返回给Unity
private static extern void setDate(string date);// 接收iOS的数据
public void GetDate(string date)
{
}
2.2 ios代码
/**返回Unity日期@param date 日期@return 无返回值*/
extern "C" void setDate(const char *date)
{/**发送数据给Unity@param obj 模型名@param method Unity接收iOS数据的方法名@param msg 传给Unity的数据UnitySendMessage(const char* obj, const char* method, const char* msg);*/UnitySendMessage("PublicGameObject", "GetDate", date);
}

2.3 

iOS通过UnitySendMessage方法返回数据给Unity时,需要传正确的date值,如果UnitySendMessage方法中的第三个参数不是将date作为参数,而是自定义的NSString类,需要做类型转换(Unity中的字符串为string,OC中的字符串为NSString)如下代码

extern "C" void setDate(const char *date)
{NSString *dateStr = @"Hello Word";UnitySendMessage("PublicGameObject", "GetDate", [dateStr UTF8String]);
}

三 完整代码

3.1 ios 代码

//
//  UserAgent.m
//  UnityFramework
//
//  Created by lxj on 2024/3/25.
//#import "UserAgent.h"
#import <WebKit/WebKit.h>
#import "SensorsAnalyticsSDK.h"
#pragma mark - Unity 回调函数
//初始化回调
static void(*GetUserAgentCallback)(const char *);@implementation UserAgent#pragma mark - 供Unity调用的函数接口
#if defined(__cplusplus)
extern "C"{
#endifvoid getUA(void(*getUserAgentCallback)(const char *)){GetUserAgentCallback = getUserAgentCallback;[[UserAgent GetInstance] GetUserUIWebViewAgent];}const char *  getAnonymousId(){const char * anonymousId = [[[SensorsAnalyticsSDK sharedInstance] anonymousId] UTF8String];return strdup(anonymousId);}const char *  getDistinctId(){const char * distinctId = [[[SensorsAnalyticsSDK sharedInstance] distinctId] UTF8String];return strdup(distinctId);}#if defined(__cplusplus)
}
#endif-(void)GetUserUIWebViewAgent{WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero];NSString * result =  [webView valueForKey:@"userAgent"];if(GetUserAgentCallback){GetUserAgentCallback([result UTF8String]);NSLog(@"iOS 获取到的当前设备的userAgent为 ===%@",result);GetUserAgentCallback = nil;}
}UserAgent* instanceUA = nil;+(UserAgent*)GetInstance
{NSLog(@"DoInit");if(instanceUA == nil){instanceUA = [[UserAgent alloc] init];}return instanceUA;
}@end

3.2 unity代码

#if UNITY_IOS
using System;
using System.Runtime.InteropServices;
using AOT;
using Bao.Debug;
using Bao.Stage;
using UnityEngine;namespace Code.SDK.DeviceId.iOS {public class IOSDeviceIdClient: IDeviceIdClient {protected static Action<string> GetUAResultCallback; private const string INTERNAME_NAME = "__Internal";[DllImport(INTERNAME_NAME, CallingConvention = CallingConvention.Cdecl)]private static extern void getUA(GetUACallbackDelegate callback);[DllImport(INTERNAME_NAME, CallingConvention = CallingConvention.Cdecl)]private static extern string getAnonymousId();[DllImport(INTERNAME_NAME, CallingConvention = CallingConvention.Cdecl)]private static extern string getDistinctId();public void GetOAID(Action<string> callback) {callback?.Invoke(null);}public void GetUA(Action<string> callback){var ua = PlayerPrefs.GetString(DeviceIdConstants.KEY_ATTRIBUTE_UA);LogFile.get.Log("ios本地存储UA值为 == " + ua);if (string.IsNullOrEmpty(ua)){GetUAResultCallback = callback;getUA(GetUACallback);}else{callback?.Invoke(ua);}}/// <summary>/// getUA/// </summary>private delegate void GetUACallbackDelegate(string ua);/// <summary>/// getUA回调/// </summary>/// <param name="ua"></param>[MonoPInvokeCallback(typeof(GetUACallbackDelegate))]private static void GetUACallback(string ua){LogFile.get.Log("ios从原生获取UA值为 == " + ua);PlayerPrefs.SetString(DeviceIdConstants.KEY_ATTRIBUTE_UA, ua);PlayerPrefs.Save();if (GetUAResultCallback != null){GetUAResultCallback(ua);GetUAResultCallback = null;}}public string GetAndroidId() {return null;}public string GetAnonymousId() {string anonymousId = getAnonymousId();LogFile.get.Log("ios神策设备id == " + anonymousId);return anonymousId;}public string GetDistinctId(){string distinctId = getDistinctId();LogFile.get.Log("ios神神策id == " + distinctId);return distinctId;}}
}
#endif

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

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

相关文章

Selenium进行Web自动化测试

Selenium进行Web自动化测试 SeleniumPython实现Web自动化测试一、环境配置 SeleniumPython实现Web自动化测试 一、环境配置 环境基于win10&#xff08;X64&#xff09; 安装Python&#xff1b;安装PyCham安装chomedriver chomedriver下载地址 可以查看本地chrome软件版本下载…

css中的一些符号代表什么选择器

**css中的一些符号代表什么选择器 空格&#xff08;派生选择器&#xff09; &#xff08;相邻/下一个选择器&#xff09; ~&#xff08;兄弟选择器 &#xff09; 大于号&#xff08;直接选择器&#xff09; *&#xff08;所有后代选择器&#xff09; 空格&#xff08;后代…

项目-博客驿站测试报告

测试用例设计 功能测试 该部分主要围绕对于博客系统的增删改查, 文章通过性审核, 关注功能等进行测试, 还进行了其它一些探索性的测试. 以上是作者设计的全部用例. BUG发现: 问题1: 当多端同时操作同一篇文章BUG 环境: Windows11, Edge和Chrome浏览器 复现步骤: 1.先使用Edg…

基于协方差信息的Massive MIMO信道估计算法性能研究

1. 引言 随着移动互联网不断发展&#xff0c;人们对通信的速率和可靠性的要求越来越高[1]。目前第四代移动通信系统已经逐渐商用&#xff0c;研究人员开始着手研究下一代移动通信系统相关技术[2][3]。在下一代移动通信系统中要求下行速率达到10Gbps&#xff0c;这就要求我们使…

BFS:解决多源最短路问题

文章目录 什么是多源最短路问题&#xff1f;1.矩阵2.飞地的数量3.地图的最高点4.地图分析总结 什么是多源最短路问题&#xff1f; 多源最短路问题&#xff08;Multi-Source Shortest Path Problem&#xff0c;MSSP&#xff09;是图论中的一个经典问题&#xff0c;它的目标是在…

支付系统的渠道路由架构设计

图解支付系统的渠道路由设计 渠道路由是引导流量路径的关键&#xff0c;其设计至关重要。本文详解渠道路由概念、必要性及形态&#xff0c;并分享一个高效实用的基于规则的渠道路由设计方案。 注&#xff1a;有些公司称渠道为通道&#xff0c;都是一个意思&#xff0c;为方便起…

【React】ref

概述 使用 ref 引用值 – React 中文文档 希望组件“记住”某些信息&#xff0c;但又不想让这些信息更新时 触发新的渲染 时&#xff0c;可以使用 ref 。 也就是说 ref 对象 包裹的值 React 追踪不到的&#xff0c;他像是用来存储组件信息的秘密“口袋”。 与 state 相同的是…

基于uni-app和图鸟UI开发上门服务小程序

一、技术栈选择 uni-app&#xff1a;我们选择了uni-app作为开发框架&#xff0c;因为它基于Vue.js&#xff0c;允许我们编写一次代码&#xff0c;发布到多个平台&#xff0c;包括iOS、Android、Web以及各种小程序。uni-app的丰富组件库、高效的状态管理以及便捷的预览调试功能&…

【PL理论深化】(3) MI 归纳法:归纳假设 (IH) | 结构归纳法 | 归纳假设的证明

&#x1f4ac; 写在前面&#xff1a;所有编程语言都是通过归纳法定义的。因此&#xff0c;虽然编程语言本身是有限的&#xff0c;但用该语言编写的程序数量是没有限制的&#xff0c;本章将学习编程语言研究中最基本的归纳法。本章我们继续讲解归纳法&#xff0c;介绍归纳假设和…

软件设计师笔记-操作系统知识

操作系统的作用 操作系统(Operating System, OS)在计算机系统中扮演着至关重要的角色。通过资源管理提高计算机系统的效率;改善人机界面,向用户提供友好的工作环境。 通过资源管理提高计算机系统的效率: 处理器管理:操作系统负责管理和调度计算机的中央处理器(CPU)资源…

【论文阅读】场景生成及编辑3D定位论文阅读

<div id"content_views" class"htmledit_views" style"user-select: auto;"><div class"kdocs-document"> 前置知识 归纳偏置 关于归纳偏置的理解&#xff1a;首先推荐一篇解释归纳偏置非常好的博客&#xff1a;浅谈归纳…

BASH脚本

先打开一个子bash&#xff0c;然后执行脚本&#xff0c;再退出子bsah { 1.指定解释器的方式 bash ***&#xff08;脚本名或脚本的绝对路径&#xff09; sh ***&#xff08;脚本名或脚本的绝对路径&#xff09; 3.路径方式引用脚本&#xff08;标准的执行命令&#xff0c;需要执…

CEM客户体验管理

客户体验管理&#xff08;Customer Experience Management, CEM&#xff09;智能系统是一种集成 的解决方案&#xff0c;可帮助企业跟踪、分析和管理客户与公司的所有交互&#xff0c;从而提高客户体验和满意度。 系统功能应用 该系统的主要功能有会话质检、客户培训、商品体…

从入门到精通:网络基础(一)

前言 计算机网络是现代信息社会的基石&#xff0c;几乎所有的数字通信和数据交换都依赖于网络。理解网络的基本概念和技术&#xff0c;对于每一个IT从业者来说都是必不可少的。在这篇文章中&#xff0c;我们将从网络的起源和发展开始&#xff0c;逐步深入探讨局域网&#xff0…

Selenium WebDriver - 浏览器交互

本文翻译整理自&#xff1a;https://www.selenium.dev/documentation/webdriver/interactions/ 文章目录 一、获取浏览器信息1、获取头衔2、获取当前URL 二、浏览器导航1、导航到2、后退3、往前4、刷新 三、JavaScript警报、提示和确认1、警报2、确认3、提示 四、使用cookie1、…

STM32学习 修改系统主频

前面时钟树的学习说明单片机的主频是可以修改的&#xff0c;那么怎么更改系统的主频&#xff0c;这里做一个简单的介绍。首先要明白&#xff0c;单片机的程序是如何运行&#xff0c;这里简单说明一下。 对应的代码在startup_stm32....文件里面&#xff0c;这里是复位程序的汇编…

多分类情绪识别模型训练及基于ChatGLM4-9B的评论机器人拓展

你的下一个微博罗伯特何必是罗伯特 这是一篇我在使用开源数据集(Twitter Emotion Dataset (kaggle.com))进行情绪识别的分类模型训练及将模型文件介入对话模型进行应用的过程记录。当通过训练得到了可以输入新样本预测的模型文件后&#xff0c;想到了或许可以使用模型文件对新样…

JavaScript的学习之旅之初始JS

目录 一、认识三个常见的js代码 二、js写入的第二种方式 三、js里内外部文件 一、认识三个常见的js代码 <script>//写入js位置的第一个地方// 控制浏览器弹出一个警告框alert("这是一个警告");// 在计算机页面输入一个内容&#xff08;写入body中&#xff…

【计算机网络仿真实验-实验3.1、3.2】交换路由综合实验

实验3.1 交换路由综合实验——作业1 一、实验目的 运用实验二&#xff08;可前往博主首页计算机网络专栏下查看&#xff09;中学到的知识&#xff0c;将这个图中的PC机连接起来组网并分析&#xff0c;本篇涉及代码以截图展示&#xff0c;过于简单的代码及操作不再详细介绍&…

JAVA特点

Java 的特点如下&#xff1a; 简单性&#xff1a;Java 设计时考虑到了易用性&#xff0c;它的语法相对简洁&#xff0c;并且去掉了一些容易出错的编程元素&#xff0c;比如指针。面向对象&#xff1a;Java 是一种面向对象的编程语言&#xff0c;这意味着它使用类和对象来设计程…