WeChatLoginHelper.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System.Runtime.InteropServices;
  5. using System;
  6. using AOT;
  7. public class WeChatLoginHelper
  8. {
  9. public static bool IsWechatInstalled() {
  10. #if UNITY_ANDROID
  11. using (var sdk = new AndroidJavaClass("com.xmjssvr.BowArrow.mi.WeChatSDK"))
  12. {
  13. bool bInstalled = sdk.CallStatic<bool>("IsWXAppInstalled");
  14. //Debug.Log("安裝微信:"+ bInstalled);
  15. return bInstalled;
  16. }
  17. #endif
  18. #if UNITY_IPHONE
  19. return IsWechatInstalled_iOS();
  20. #endif
  21. }
  22. public static void Login()
  23. {
  24. #if UNITY_ANDROID
  25. using (var sdk = new AndroidJavaClass("com.xmjssvr.BowArrow.mi.WeChatSDK")) sdk.CallStatic("WeChatLogin");
  26. #endif
  27. #if UNITY_IPHONE
  28. if (!IsWechatInstalled_iOS())
  29. {
  30. Debug.Log("微信未安装");
  31. return;
  32. }
  33. WXResultHandler handler = new WXResultHandler(resultHandler);
  34. IntPtr fp = Marshal.GetFunctionPointerForDelegate(handler);
  35. _WechatLogin(fp);
  36. #endif
  37. }
  38. public static void OnLoginResp(string code)
  39. {
  40. LoginView.ins?.OnWxLoginResp(code);
  41. }
  42. #if UNITY_IPHONE
  43. //这个方法就是引用在 xcode 中编写的方法,与 iOS 连接的桥梁
  44. [DllImport("__Internal")]
  45. private static extern void _WechatLogin(IntPtr resultHandler);
  46. [DllImport("__Internal")]
  47. private static extern bool IsWechatInstalled_iOS();
  48. [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  49. public delegate void WXResultHandler(string resultString);
  50. [MonoPInvokeCallback(typeof(WXResultHandler))]
  51. static void resultHandler(string content)
  52. {
  53. string[] args = content.Split(';');
  54. switch (args[0])
  55. {
  56. case "0":
  57. //WXLoginState.OK
  58. //Debug.Log("token:" + args[1]);
  59. LoginView.ins?.OnWxLoginResp(args[1]);
  60. break;
  61. case "-2":
  62. //WXLoginState.Denied
  63. Debug.Log(args[1]);
  64. break;
  65. case "-4":
  66. //WXLoginState.Cancel
  67. Debug.Log(args[1]);
  68. break;
  69. default:
  70. //WXLoginState.Other
  71. Debug.Log(args[1]);
  72. break;
  73. }
  74. }
  75. public enum WXLoginState
  76. {
  77. OK,
  78. Denied = -2,
  79. Cancel = -4,
  80. Other = -1
  81. }
  82. #endif
  83. }