开发
通过C代码及函数指针回调方式:
iOS代码,在SDK中创建.mm文件:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "TWUnityBridgeSDK.h"
#if defined(__cplusplus)
extern "C"
{
#endif
///Unity调用iOS通用方法
extern void unityToiOS(const char* jsonStr);
///定义函数指针
typedef void(*CALLBACK_TOUnity)(const char*);
///iOS调用Unity通用函数指针对象
static CALLBACK_TOUnity callback_to_unity = nil;
///Unity注册回调方法
void iosCallBacktoUnity(CALLBACK_TOUnity callback);
#if defined(__cplusplus)
}
#endif
#ifdef DEBUG
#define NSLog(format, ...) printf("[%s] %s [第%d行] %s\n", __TIME__, __FUNCTION__, __LINE__, [[NSString stringWithFormat:format, ## __VA_ARGS__] UTF8String]);
#endif
///Unity调用iOS通用方法
void unityToiOS(const char* jsonStr)
{
// 创建NSString从C字符串
NSString* str = [NSString stringWithUTF8String:jsonStr];
[TWUnityBridgeSDK unityToiOSWithJson:str callBackHandler:^(NSString *data, NSError *error) {
if(callback_to_unity != nil) {
NSLog(@"iOSToUnity=======---%@", data);
char* commandchar = (char*) [data UTF8String];
callback_to_unity(commandchar); //字符串发给C#
} else {
NSLog(@"callback_to_unity为空=======444---%@", data);
}
}];
}
///Unity注册回调方法
void iosCallBacktoUnity(CALLBACK_TOUnity callback)
{
callback_to_unity = callback;
if (callback == nil) {
NSLog(@"Unity注册回调失败=======");
}
}
Unity代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
using AOT;
public class SDKIOS : MonoBehaviour
{
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void callbackN0Delegate(IntPtr data);
[DllImport("__Internal")]
public static extern void iosCallBacktoUnity(IntPtr callback);
[DllImport("__Internal")]
private static extern void unityToiOS(string str);
// Start is called before the first frame update
public void Start()
{
RegisterCallback();
// 调用外部方法,传递字符串参数到iOS
unityToiOS("{\"type\": 1, \"data\": {\"msg\": \"调用iOSSDK初始化\",\"appName\": \"兔玩\"}}");
}
public void testBtnClick()
{ //测试跳转原生H5
// unityToiOS("{\"type\": 3, \"data\": {\"url\": \"https://y-test.tuwan.com/activity/483Cea4771?v=1717391952164#/\", \"isPopView\":0}}");
//测试调用原生支付
unityToiOS("{\"type\":3,\"data\":\"{\\\"json\\\":\\\"{\\\\\\\"goodsId\\\\\\\":\\\\\\\"1000020\\\\\\\",\\\\\\\"orderNo\\\\\\\":\\\\\\\"51df30b7c41b4b02adb309a687ef1356\\\\\\\",\\\\\\\"orderToken\\\\\\\":\\\\\\\"67b36e731657f3627ade429e53cd42ab\\\\\\\",\\\\\\\"data\\\\\\\":{\\\\\\\"price\\\\\\\":18,\\\\\\\"bewrite\\\\\\\":\\\\\\\"126钻石\\\\\\\"},\\\\\\\"platform\\\\\\\":0,\\\\\\\"typeId\\\\\\\":2129}\\\",\\\"payPoint\\\":\\\"d_diandian2\\\"}\"}");
//测试调用隐私协议弹窗
}
private void RegisterCallback()
{
callbackN0Delegate callbackN0_delegate = SendDataToGame;
//将Delegate转换为非托管的函数指针
IntPtr intptrN0_delegate = Marshal.GetFunctionPointerForDelegate(callbackN0_delegate);
//调用非托管函数
iosCallBacktoUnity(intptrN0_delegate);
}
//原生层发送数据到游戏层
[MonoPInvokeCallback(typeof(callbackN0Delegate))]
static void SendDataToGame(IntPtr data)
{
var dataStr = Marshal.PtrToStringAnsi(data);
Debug.Log(dataStr);
}
}