当前位置:   article > 正文

Unity和iOS 原生专题二 Unity和iOS原生交互相互传值的两个方案

Unity和iOS 原生专题二 Unity和iOS原生交互相互传值的两个方案

一 、方案一 通过指针传值和使用 MonoPInvokeCallback 从C#层向C层注册回调函数

1.1 iOS调用Unity函数Unity 给iOS传值

第一步C#端 定义 C#调用 ios 原生函数标识 固定写法

  1. /// <summary>
  2. /// 定义 C#调用 ios 原生函数标识 固定写法
  3. /// </summary>
  4. private const string DLLName = "__Internal";
  5. [UsedImplicitly, DllImport(DLLName)]
  6. private static extern void MobileNumberAuthiOS_Initialize(string secret, AliMobileAuthLogCallback logCallback,
  7. NumberAuthInitCallback initCallback);

第二步C#端 定义c# 传递到原生的的委托代理

  1. /// <summary>
  2. /// 定义c# 传递到原生的的委托代理,接收ios原生回传的值
  3. /// </summary>
  4. private delegate void AliMobileAuthLogCallback(string log);
  5. private delegate void NumberAuthInitCallback(int success, string msg);

第三步C# 端 定义C#端的代理函数,接收ios 传递过来的值

  1. /// <summary>
  2. /// 定义C#端的代理函数,用于接收ios 传递过来的值
  3. /// </summary>
  4. /// <param name="log"></param>
  5. [MonoPInvokeCallback(typeof(AliMobileAuthLogCallback))]
  6. private static void HandleOnAliMobileAuthLogCallback(string log)
  7. {
  8. InfoLog(log);
  9. }
  10. [MonoPInvokeCallback(typeof(NumberAuthInitCallback))]
  11. private static void HandleOnSmsAuthInitCallback(int success, string msg)
  12. {
  13. InfoLog($"开始初始化回调,success:{success} msg: {msg}");
  14. _initializeCallback?.Invoke(success, msg);
  15. }

第四步 C#端 调用上面定的调用ios 的函数

  1. /// C# 调用上面定的调用ios 的函数 ,secret 参数,HandleOnAliMobileAuthLogCallback,HandleOnSmsAuthInitCallback 要传递过去的代理函数
  2. MobileNumberAuthiOS_Initialize(secret, HandleOnAliMobileAuthLogCallback, HandleOnSmsAuthInitCallback);

第五步 ios 端 ios 定义c#调用的ios 方法  固定写法

  1. ///ios 定义c#调用的ios 方法 固定写法
  2. #if defined(__cplusplus)
  3. extern "C" {
  4. #endif
  5. void MobileNumberAuthiOS_Initialize(const char* secret ,void(*aliMobileAuthLogCallback)(const char* log), void(*initSDKCallback)(int, const char * )){
  6. ///将c#的代理指针赋值给ios的块指针
  7. AliMobileAuthLogCallback = aliMobileAuthLogCallback;
  8. InitSDKCallback = initSDKCallback;
  9. ///调用ios的方法
  10. [[AliMobileNumberAuth sharedManager] Initialize:secret];
  11. }
  12. #if defined(__cplusplus)
  13. }
  14. #endif

第六步ios 端  定义接收c#要传递过来的代理指针

  1. ///定义接收c#要传递过来的代理指针
  2. static void (*AliMobileAuthLogCallback)(const char* log);
  3. static void(*InitSDKCallback)(int,const char *);

第七步ios 端 在ios函数中 回调c#的代码函数,将ios这边的值传递到c#

  1. -(void)Initialize:(const char*)key {
  2. ///接收c#传递过来的值
  3. NSString * dataString = [NSString stringWithFormat:@"%s",key];
  4. ///ios 回调c#的代码函数,将ios这边的值传递到c#
  5. if (InitSDKCallback) {
  6. NSString * dataString = @"回传值";
  7. int code = 1;
  8. InitSDKCallback(code,[dataString UTF8String]);
  9. }
  10. }

以上就是unity和ios 原生交互 通过指针传值和代理(delegate)回传值 定义和接收值的完整实现过程

第八步 C# 和ios 完整代码部分

8.1 ios 代码
  1. //ios 代码
  2. #import "AliMobileNumberAuth.h"
  3. ///定义接收c#要传递过来的代理指针
  4. static void (*AliMobileAuthLogCallback)(const char* log);
  5. static void(*InitSDKCallback)(int,const char *);
  6. static bool EnableLog;
  7. @interface AliMobileNumberAuth()
  8. @end
  9. @implementation AliMobileNumberAuth
  10. ///ios 定义c#调用的ios 方法 固定写法
  11. #if defined(__cplusplus)
  12. extern "C" {
  13. #endif
  14. void MobileNumberAuthiOS_Initialize(const char* secret ,void(*aliMobileAuthLogCallback)(const char* log), void(*initSDKCallback)(int, const char * )){
  15. ///将c#的代理指针赋值给ios的块指针
  16. AliMobileAuthLogCallback = aliMobileAuthLogCallback;
  17. InitSDKCallback = initSDKCallback;
  18. ///调用ios的方法
  19. [[AliMobileNumberAuth sharedManager] Initialize:secret];
  20. }
  21. #if defined(__cplusplus)
  22. }
  23. #endif
  24. -(void)Initialize:(const char*)key {
  25. ///接收c#传递过来的值
  26. NSString * dataString = [NSString stringWithFormat:@"%s",key];
  27. ///ios 回调c#的代码函数,将ios这边的值传递到c#
  28. if (InitSDKCallback) {
  29. NSString * dataString = @"回传值";
  30. int code = 1;
  31. InitSDKCallback(code,[dataString UTF8String]);
  32. }
  33. }
  34. #pragma mark - LifeCycle
  35. +(instancetype)sharedManager {
  36. static dispatch_once_t onceToken;
  37. static AliMobileNumberAuth *instance;
  38. dispatch_once(&onceToken, ^{
  39. instance = [[AliMobileNumberAuth alloc] init];
  40. });
  41. return instance;
  42. }
  43. }
8.2 c# 代码
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using AOT;
  4. using Bao.Debug;
  5. using JetBrains.Annotations;
  6. namespace Bao.Account.SDK
  7. {
  8. public class MobileNumberAuthiOS
  9. {
  10. #region 初始化
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/502963
    推荐阅读
    相关标签