日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【游戏开发教程】Unity iOS平台接入微信SDK,实现微信登录等功能(教程 | 流程讲解)

發(fā)布時(shí)間:2023/12/10 编程问答 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【游戏开发教程】Unity iOS平台接入微信SDK,实现微信登录等功能(教程 | 流程讲解) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

      • 一、前言
      • 二、流程
        • 1、申請(qǐng)開(kāi)發(fā)者賬號(hào)
        • 2、創(chuàng)建應(yīng)用
        • 3、下載SDK
        • 4、導(dǎo)入到Unity中
        • 5、編寫(xiě)Objective-C代碼
          • 5.1、CustomAppController.mm
          • 5.2、WXApiManager.h
          • 5.3、WXApiManager.mm
          • 5.4、注冊(cè)回調(diào)對(duì)象
          • 5.5、封裝初始化接口
          • 5.6、封裝登錄接口
          • 5.7、其他接口封裝
        • 6、XCodeAPI
        • 7、關(guān)于Universal Link
        • 8、關(guān)于iOS劉海屏適配
      • 三、完畢

一、前言

嗨,大家好,我是新發(fā)。
有小伙伴私信問(wèn)我Unity怎么接入微信登錄,

答案就是接入微信SDK,不過(guò),微信開(kāi)放平臺(tái)的文檔寫(xiě)的不是很友好,這里我講講流程,希望可以幫助到有疑問(wèn)的同學(xué)。(注:我手頭上沒(méi)有mac電腦,不方便測(cè)試,本文主要是講解流程)
注:本文以iOS平臺(tái)為例。

二、流程

1、申請(qǐng)開(kāi)發(fā)者賬號(hào)

首先在微信開(kāi)放平臺(tái)得先有一個(gè)企業(yè)開(kāi)發(fā)者賬號(hào),微信開(kāi)放平臺(tái)地址:https://open.weixin.qq.com/,

注冊(cè)流程很簡(jiǎn)單,不贅述,

2、創(chuàng)建應(yīng)用

上面申請(qǐng)好開(kāi)發(fā)者賬號(hào)后就可以登錄了,登錄開(kāi)發(fā)者賬號(hào)后,進(jìn)入管理中心,選擇移動(dòng)應(yīng)用,然后點(diǎn)擊創(chuàng)建移動(dòng)應(yīng)用,

填寫(xiě)相關(guān)信息,提交后等審核,

審核通過(guò)后,即可得到應(yīng)用的AppID和AppSecret,后面調(diào)用SDK接口的時(shí)候需要用到這兩個(gè)值。

3、下載SDK

首先可以看一下微信開(kāi)放平臺(tái)的文檔,這個(gè)是 iOS接入指南文檔:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html
里面講了兩種方式來(lái)引入SDK:
1、通過(guò)CocoaPods集成;(有點(diǎn)類(lèi)似于Android Gradle配置依賴,自動(dòng)下載依賴文件)
2、手動(dòng)集成。(手動(dòng)下載SDK庫(kù)文件,導(dǎo)入工程中)

一般我們是在內(nèi)網(wǎng)開(kāi)發(fā),所以這里我講一下手動(dòng)集成的方式。
iOS平臺(tái)SDK庫(kù)文件下載頁(yè):https://developers.weixin.qq.com/doc/oplatform/Downloads/iOS_Resource.html
點(diǎn)擊iOS開(kāi)發(fā)工具包即可下載SDK庫(kù)文件,如果想看下Demo范例,可以點(diǎn)擊范例代碼,如下

4、導(dǎo)入到Unity中

iOS開(kāi)發(fā)工具包下載下來(lái)后解壓,里面的文件如下,一個(gè).a庫(kù)文件和三個(gè).h頭文件,

我們將它們拷貝到Unity工程的Assets/Plugins/iOS/WeChatSDK目錄中,如下,

5、編寫(xiě)Objective-C代碼

想要在C#中調(diào)用SDK接口,我們需要寫(xiě)一層中間層(使用Objective-C寫(xiě)),

5.1、CustomAppController.mm

在iOS平臺(tái)接SDK的時(shí)候,需要實(shí)現(xiàn)自己的AppController來(lái)維護(hù)SDK的生命周期,默認(rèn)是UnityAppController,我們可以繼承它并重寫(xiě)邏輯。
在Assets/Plugins/iOS/目錄中創(chuàng)建一個(gè)CustomAppController.mm文件,如下,
(注:文件名必須是 xxxxAppController.mm,xxxx前綴可自定義,但不能省略,比如我這里叫CustomAppController.mm?)

內(nèi)容如下:

// CustomAppController.mm#import "UnityAppController.h" @interface CustomAppController : UnityAppController @endIMPL_APP_CONTROLLER_SUBCLASS (CustomAppController)@implementation CustomAppController- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {[super application:application didFinishLaunchingWithOptions:launchOptions];// TODO return YES; } @end

注:上面的代碼中有一個(gè)宏IMPL_APP_CONTROLLER_SUBCLASS,Unity就是通過(guò) IMPL_APP_CONTROLLER_SUBCLASS知道要使用我們定制的 CustomAppController而不是使用默認(rèn)的UnityAppController。

好了,繼續(xù)往下走流程。

5.2、WXApiManager.h

在Assets/Plugins/iOS/目錄中創(chuàng)建WeChatUnity文件夾,并創(chuàng)建WXApiManager.h頭文件,如下,

內(nèi)容如下,很簡(jiǎn)單,引入WXApi.h頭文件,繼承WXApiDelegate,然后定義一個(gè)單例對(duì)象sharedManager,

// WXApiManager.h#import <Foundation/Foundation.h> #import "WXApi.h"@interface WXApiManager : NSObject<WXApiDelegate>+ (instancetype)sharedManager;@end
5.3、WXApiManager.mm

在WXApiManager.h同級(jí)目錄中創(chuàng)建WXApiManager.mm文件,去實(shí)現(xiàn)具體的邏輯。

內(nèi)容如下,

#import "WXApiManager.h"@implementation WXApiManager// 單例 +(instancetype)sharedManager {static dispatch_once_t onceToken;static WXApiManager *instance;dispatch_once(&onceToken, ^{instance = [[WXApiManager alloc] init];});return instance; }- (void)onResp:(BaseResp *)resp {// TODO 微信回調(diào),調(diào)用微信SDK的sendReq,會(huì)回調(diào)此方法,登錄、分享等都是回調(diào)到這里 }- (void)onReq:(BaseReq *)req {// TODO 微信回調(diào),從微信端主動(dòng)發(fā)送過(guò)來(lái)的請(qǐng)求 }@end

TODO的內(nèi)容我們先留著,繼續(xù)往下走流程。

5.4、注冊(cè)回調(diào)對(duì)象

我們要讓微信回調(diào)到WXApiManager對(duì)象的onResp方法,就需要先告訴微信,不然它是不知道回調(diào)到哪里的。
我們回到CustomAppController.mm文件,先引入頭文件:

#import "WXApiManager.h"

添加如下的調(diào)用,

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; }- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; }- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {return [WXApi handleOpenUniversalLink:userActivity delegate:[WXApiManager sharedManager]]; }
5.5、封裝初始化接口

微信SDK的初始化調(diào)用是

[WXApi registerApp:@"你的APPID" universalLink:@"你的UniversalLink"];

你可以把它放在CustomAppController.mm的didFinishLaunchingWithOptions方法中,如下:

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {[super application:application didFinishLaunchingWithOptions:launchOptions];[WXApi registerApp:@"你的APPID" universalLink:@"你的UniversalLink"];return YES; }

它是程序啟動(dòng)時(shí)最先執(zhí)行的地方,如果你不想在這么前的位置執(zhí)行,想推遲到在C#層去執(zhí)行,則可以封裝一個(gè)接口出來(lái),然后由C#層來(lái)調(diào)用。
我們?cè)贏ssets/Plugns/iOS/WeChatUnity文件夾中創(chuàng)建WeChatUnity.mm文件,如下,

內(nèi)容如下,

// WeChatUnity.mm#import <Foundation/Foundation.h> #import "WXApiManager.h"#define UNITY_CS_API extern "C"static NSString *mWXAppid = nil;// 將c字符串const char* 轉(zhuǎn)為 oc字符串NSString static inline NSString * str_c2ns(const char*s) {if (s)return [NSString stringWithUTF8String: s];elsereturn [NSString stringWithUTF8String: ""]; }// 初始化 UNITY_CS_API void UnityWeChatInit(const char* appId, const char* universalLink) {mWXAppid = str_c2ns(appId);[WXApi registerApp:mWXAppid universalLink:str_c2ns(universalLink)]; }

接著,我們就可以在C#層聲明這個(gè)接口并調(diào)用了,我們新建一個(gè)C#腳本,名叫WeChatSDK.cs,如下

內(nèi)容如下,

// WeChatSDK.csusing UnityEngine;public class WeChatSDK {public static void Init(){ #if UNITY_IOSUnityWeChatInit("你的APPID", "你的UniversalLink"); #elif UNITY_ANDROID// TODO Android的調(diào)用 #endif}#if UNITY_IOS[DllImport("__Internal")]static extern void UnityWeChatInit(string appId, string universalLink); #endif }

然后你就可以在你的C#入口腳本那里調(diào)用WeChatSDK.Init()了。

5.6、封裝登錄接口

同理,我們繼續(xù)在WeChatUnity.mm中封裝登錄接口,

// WeChatUnity.mmUNITY_CS_API void UnityWeChatLogin(const char* state) {NSLog(@"UnityWeChatLogin");SendAuthReq* req = [[SendAuthReq alloc] init];req.scope = @"snsapi_userinfo";;req.state = str_c2ns(state);[WXApi sendReq:req completion:nil];// 此時(shí)會(huì)拉起微信,授權(quán)后會(huì)回調(diào)WXApiManager的onResp方法 }

回到WeChatSDK.cs腳本,添加Login接口,如下,

// WeChatSDK.cspublic static void Login() { #if UNITY_IOS// "app_wechat"后期改為隨機(jī)數(shù)加session來(lái)校驗(yàn)UnityWeChatLogin("app_wechat"); #elif UNITY_ANDROID// TODO Android的調(diào)用 #endif }#if UNITY_IOS[DllImport("__Internal")]static extern void UnityWeChatLogin(string state); #endif

當(dāng)你在游戲中點(diǎn)擊微信登錄按鈕時(shí),即可調(diào)用WeChatSDK.Login啦。
接著,我們?nèi)XApiManager.mm的onResp添加回調(diào)的響應(yīng)邏輯,如下,

// WXApiManager.mm- (void)onResp:(BaseResp *)resp {if ([resp isKindOfClass:[SendAuthResp class]]) {NSLog(@"微信授權(quán)回調(diào)");if (resp.errCode == 0) {// 通過(guò)code去交換token,此步需要用到APPSecret,這個(gè)字段非常敏感// 實(shí)際項(xiàng)目此步是放在服務(wù)端執(zhí)行,這里僅作為客戶端演示[self requestWxToken:((SendAuthResp *)resp).code];}else{// 失敗,回調(diào)給UnityUnitySendMessage("SDKCallBack", "WeChatLoginCallback", "");}} }// 通過(guò)code換取token,此步實(shí)際項(xiàng)目是放在服務(wù)端執(zhí)行 -(void)requestWxToken:(NSString*)code {NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code", mWXAppid, "你的APPSecret", code]];NSURLRequest *request = [NSURLRequest requestWithURL:url];NSURLSession *session = [NSURLSession sharedSession];NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (error == nil) {NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];[self requestWxUserInfo:[dict valueForKey:@"access_token"]];}}];[dataTask resume]; }// 通過(guò)token查詢用戶信息,此步實(shí)際項(xiàng)目是放在服務(wù)端執(zhí)行 -(void)requestWxUserInfo:(NSString*)token{NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",token, mWXAppid]];NSURLRequest *request = [NSURLRequest requestWithURL:url];NSURLSession *session = [NSURLSession sharedSession];NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (error == nil) {NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];NSString *jsonStr = [self DataTOjsonString:dict];// 回調(diào)給UnityUnitySendMessage("SDKCallBack", "WeChatLoginCallback",[jsonStr UTF8String]);}}];[dataTask resume]; }

上面的結(jié)果我們是通過(guò)UnitySendMessage接口給Unity發(fā)送消息的,會(huì)查找名字為SDKCallBack的物體上的腳本,調(diào)用腳本中的WeChatLoginCallback方法。
我們?cè)趫?chǎng)景中創(chuàng)建一個(gè)空物體,重命名為SDKCallBack,

然后創(chuàng)建一個(gè)SDKCallBack.cs腳本,并將其掛到SDKCallBack物體上,

我們?cè)赟DKCallBack腳本中實(shí)現(xiàn)WechatLoginCallback方法,如下,

// SDKCallBack.csusing UnityEngine;public class SDKCallBack : MonoBehaviour {/// <summary>/// 登錄回調(diào)/// </summary>/// <param name="callBackInfo"></param>public void WechatLoginCallback(string callBackInfo){// openid 普通用戶的標(biāo)識(shí),對(duì)當(dāng)前開(kāi)發(fā)者帳號(hào)唯一// nickname 普通用戶昵稱// sex 普通用戶性別,1為男性,2為女性// province 普通用戶個(gè)人資料填寫(xiě)的省份// city 普通用戶個(gè)人資料填寫(xiě)的城市// country 國(guó)家,如中國(guó)為CN// headimgurl 用戶頭像,最后一個(gè)數(shù)值代表正方形頭像大小(有0、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒(méi)有頭像時(shí)該項(xiàng)為空// privilege 用戶特權(quán)信息,json數(shù)組,如微信沃卡用戶為(chinaunicom)// unionid 用戶統(tǒng)一標(biāo)識(shí)。針對(duì)一個(gè)微信開(kāi)放平臺(tái)帳號(hào)下的應(yīng)用,同一用戶的unionid是唯一的。多app數(shù)據(jù)互通保存該值// access_token 用戶當(dāng)前臨時(shí)token值,自主添加的值if(string.IsNullOrEmpty(callBackInfo)){// TODO 登錄失敗,請(qǐng)重試}else{// 解析字段,登錄進(jìn)游戲服務(wù)器}} }
5.7、其他接口封裝

其他接口流程同理,在WeChatUnity.mm中封裝C接口,調(diào)用微信SDK的API,
在WeChatSDK.cs中聲明[DllImport("__Internal")],封裝C#層接口,在WXApiManager.mm的onResp中處理響應(yīng),通過(guò)UnitySendMessage發(fā)消息給Unity,在SDKCallBack.cs中處理回調(diào)。
畫(huà)個(gè)圖方便大家理解,

流程懂了之后,大家應(yīng)該就知道怎么封裝接口和調(diào)用了,我這里就不往下寫(xiě)了~

6、XCodeAPI

我們知道,Unity打包iOS平臺(tái)是導(dǎo)出XCode工程,我們還需要在XCode工程中做一些設(shè)置,最后再導(dǎo)出ipa,事實(shí)上,這個(gè)過(guò)程也可以寫(xiě)成自動(dòng)化處理,我之前寫(xiě)過(guò)一篇文章講過(guò)XCodeAPI,推薦大家看下,《Unity打iOS包之xcodeapi的使用》

7、關(guān)于Universal Link

關(guān)于Universal Link我之前寫(xiě)過(guò)一篇文章,也推薦大家看下,《微信分享顯示“未驗(yàn)證應(yīng)用”問(wèn)題(輔助標(biāo)簽:Universal Link)》

8、關(guān)于iOS劉海屏適配

關(guān)于iOS劉海屏適配的問(wèn)題,我之前寫(xiě)過(guò)一篇文章,也推薦大家看下,《Unity適配iphone劉海屏》

三、完畢

好啦,就到這里吧~
我是林新發(fā):https://blog.csdn.net/linxinfa
原創(chuàng)不易,若轉(zhuǎn)載請(qǐng)注明出處,感謝大家~
喜歡我的可以點(diǎn)贊、關(guān)注、收藏,如果有什么技術(shù)上的疑問(wèn),歡迎留言或私信~

總結(jié)

以上是生活随笔為你收集整理的【游戏开发教程】Unity iOS平台接入微信SDK,实现微信登录等功能(教程 | 流程讲解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。