using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Runtime.InteropServices; using System; using AOT; public class WeChatLoginHelper { public static string CurrentAppID { get; private set; } public static bool IsWechatInstalled() { #if UNITY_ANDROID using (var sdk = new AndroidJavaClass("com.xmjssvr.BowArrow.mi.WeChatSDK")) { bool bInstalled = sdk.CallStatic("IsWXAppInstalled"); //Debug.Log("安裝微信:"+ bInstalled); return bInstalled; } #endif #if UNITY_IPHONE && !UNITY_EDITOR return IsWechatInstalled_iOS(); #endif #if UNITY_STANDALONE_WIN || UNITY_EDITOR return false; #endif } //如果是iphone 动态处理 public static void InitWeChat(string appId, string universalLink) { CurrentAppID = appId; #if UNITY_IPHONE && !UNITY_EDITOR _RegisterWeChat(appId, universalLink); #endif } public static void Login() { #if UNITY_ANDROID using (var sdk = new AndroidJavaClass("com.xmjssvr.BowArrow.mi.WeChatSDK")) sdk.CallStatic("WeChatLogin"); #endif #if UNITY_IPHONE if (!IsWechatInstalled_iOS()) { Debug.Log("微信未安装"); return; } WXResultHandler handler = new WXResultHandler(resultHandler); IntPtr fp = Marshal.GetFunctionPointerForDelegate(handler); _WechatLogin(fp); #endif } public static void OnLoginResp(string code) { LoginView.ins?.OnWxLoginResp(code); } #if UNITY_IPHONE //这个方法就是引用在 xcode 中编写的方法,与 iOS 连接的桥梁 [DllImport("__Internal")] private static extern void _RegisterWeChat(string appid, string universalLink); [DllImport("__Internal")] private static extern void _WechatLogin(IntPtr resultHandler); [DllImport("__Internal")] private static extern bool IsWechatInstalled_iOS(); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void WXResultHandler(string resultString); [MonoPInvokeCallback(typeof(WXResultHandler))] static void resultHandler(string content) { string[] args = content.Split(';'); switch (args[0]) { case "0": //WXLoginState.OK //Debug.Log("token:" + args[1]); LoginView.ins?.OnWxLoginResp(args[1]); break; case "-2": //WXLoginState.Denied Debug.Log(args[1]); break; case "-4": //WXLoginState.Cancel Debug.Log(args[1]); break; default: //WXLoginState.Other Debug.Log(args[1]); break; } } public enum WXLoginState { OK, Denied = -2, Cancel = -4, Other = -1 } #endif }