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

article/2025/5/20 0:46:05

文章目录

      • 一、前言
      • 二、流程
        • 1、申请开发者账号
        • 2、创建应用
        • 3、下载SDK
        • 4、导入到Unity中
        • 5、编写Objective-C代码
          • 5.1、CustomAppController.mm
          • 5.2、WXApiManager.h
          • 5.3、WXApiManager.mm
          • 5.4、注册回调对象
          • 5.5、封装初始化接口
          • 5.6、封装登录接口
          • 5.7、其他接口封装
        • 6、XCodeAPI
        • 7、关于Universal Link
        • 8、关于iOS刘海屏适配
      • 三、完毕

一、前言

嗨,大家好,我是新发。
有小伙伴私信问我Unity怎么接入微信登录,
在这里插入图片描述
答案就是接入微信SDK,不过,微信开放平台的文档写的不是很友好,这里我讲讲流程,希望可以帮助到有疑问的同学。(注:我手头上没有mac电脑,不方便测试,本文主要是讲解流程)
注:本文以iOS平台为例。

二、流程

1、申请开发者账号

首先在微信开放平台得先有一个企业开发者账号,微信开放平台地址:https://open.weixin.qq.com/,
在这里插入图片描述
注册流程很简单,不赘述,
在这里插入图片描述

2、创建应用

上面申请好开发者账号后就可以登录了,登录开发者账号后,进入管理中心,选择移动应用,然后点击创建移动应用
在这里插入图片描述
填写相关信息,提交后等审核,
在这里插入图片描述
审核通过后,即可得到应用的AppIDAppSecret,后面调用SDK接口的时候需要用到这两个值。

3、下载SDK

首先可以看一下微信开放平台的文档,这个是 iOS接入指南文档:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html
里面讲了两种方式来引入SDK
1、通过CocoaPods集成;(有点类似于Android Gradle配置依赖,自动下载依赖文件)
2、手动集成。(手动下载SDK库文件,导入工程中)

一般我们是在内网开发,所以这里我讲一下手动集成的方式。
iOS平台SDK库文件下载页:https://developers.weixin.qq.com/doc/oplatform/Downloads/iOS_Resource.html
点击iOS开发工具包即可下载SDK库文件,如果想看下Demo范例,可以点击范例代码,如下
在这里插入图片描述

4、导入到Unity中

iOS开发工具包下载下来后解压,里面的文件如下,一个.a库文件和三个.h头文件,
在这里插入图片描述
我们将它们拷贝到Unity工程的Assets/Plugins/iOS/WeChatSDK目录中,如下,
在这里插入图片描述

5、编写Objective-C代码

想要在C#中调用SDK接口,我们需要写一层中间层(使用Objective-C写),
在这里插入图片描述

5.1、CustomAppController.mm

iOS平台接SDK的时候,需要实现自己的AppController来维护SDK的生命周期,默认是UnityAppController,我们可以继承它并重写逻辑。
Assets/Plugins/iOS/目录中创建一个CustomAppController.mm文件,如下,
(注:文件名必须是 xxxxAppController.mmxxxx前缀可自定义,但不能省略,比如我这里叫CustomAppController.mm​
在这里插入图片描述
内容如下:

// 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

注:上面的代码中有一个宏IMPL_APP_CONTROLLER_SUBCLASSUnity就是通过 IMPL_APP_CONTROLLER_SUBCLASS知道要使用我们定制的 CustomAppController而不是使用默认的UnityAppController

好了,继续往下走流程。

5.2、WXApiManager.h

Assets/Plugins/iOS/目录中创建WeChatUnity文件夹,并创建WXApiManager.h头文件,如下,
在这里插入图片描述
内容如下,很简单,引入WXApi.h头文件,继承WXApiDelegate,然后定义一个单例对象sharedManager

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

WXApiManager.h同级目录中创建WXApiManager.mm文件,去实现具体的逻辑。
在这里插入图片描述
内容如下,

#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 微信回调,调用微信SDK的sendReq,会回调此方法,登录、分享等都是回调到这里
}- (void)onReq:(BaseReq *)req {// TODO 微信回调,从微信端主动发送过来的请求
}@end

TODO的内容我们先留着,继续往下走流程。

5.4、注册回调对象

我们要让微信回调到WXApiManager对象的onResp方法,就需要先告诉微信,不然它是不知道回调到哪里的。
我们回到CustomAppController.mm文件,先引入头文件:

#import "WXApiManager.h"

添加如下的调用,

- (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的初始化调用是

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

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

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

它是程序启动时最先执行的地方,如果你不想在这么前的位置执行,想推迟到在C#层去执行,则可以封装一个接口出来,然后由C#层来调用。
我们在Assets/Plugns/iOS/WeChatUnity文件夹中创建WeChatUnity.mm文件,如下,
在这里插入图片描述
内容如下,

// WeChatUnity.mm#import <Foundation/Foundation.h>
#import "WXApiManager.h"#define UNITY_CS_API extern "C"static NSString *mWXAppid = nil;// 将c字符串const char* 转为 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#层声明这个接口并调用了,我们新建一个C#脚本,名叫WeChatSDK.cs,如下
在这里插入图片描述
内容如下,

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

然后你就可以在你的C#入口脚本那里调用WeChatSDK.Init()了。

5.6、封装登录接口

同理,我们继续在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];// 此时会拉起微信,授权后会回调WXApiManager的onResp方法
}

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

// WeChatSDK.cspublic static void Login()
{
#if UNITY_IOS// "app_wechat"后期改为随机数加session来校验UnityWeChatLogin("app_wechat");
#elif UNITY_ANDROID// TODO Android的调用
#endif
}#if UNITY_IOS[DllImport("__Internal")]static extern void UnityWeChatLogin(string state);
#endif

当你在游戏中点击微信登录按钮时,即可调用WeChatSDK.Login啦。
接着,我们去WXApiManager.mmonResp添加回调的响应逻辑,如下,

// WXApiManager.mm- (void)onResp:(BaseResp *)resp {if ([resp isKindOfClass:[SendAuthResp class]]) {NSLog(@"微信授权回调");if (resp.errCode == 0) {// 通过code去交换token,此步需要用到APPSecret,这个字段非常敏感// 实际项目此步是放在服务端执行,这里仅作为客户端演示[self requestWxToken:((SendAuthResp *)resp).code];}else{// 失败,回调给UnityUnitySendMessage("SDKCallBack", "WeChatLoginCallback", "");}}
}// 通过code换取token,此步实际项目是放在服务端执行
-(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];
}// 通过token查询用户信息,此步实际项目是放在服务端执行
-(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];// 回调给UnityUnitySendMessage("SDKCallBack", "WeChatLoginCallback",[jsonStr UTF8String]);}}];[dataTask resume];
}

上面的结果我们是通过UnitySendMessage接口给Unity发送消息的,会查找名字为SDKCallBack的物体上的脚本,调用脚本中的WeChatLoginCallback方法。
我们在场景中创建一个空物体,重命名为SDKCallBack
在这里插入图片描述
然后创建一个SDKCallBack.cs脚本,并将其挂到SDKCallBack物体上,
在这里插入图片描述
我们在SDKCallBack脚本中实现WechatLoginCallback方法,如下,

// SDKCallBack.csusing UnityEngine;public class SDKCallBack : MonoBehaviour
{/// <summary>/// 登录回调/// </summary>/// <param name="callBackInfo"></param>public void WechatLoginCallback(string callBackInfo){// openid	    普通用户的标识,对当前开发者帐号唯一// nickname	    普通用户昵称// sex	        普通用户性别,1为男性,2为女性// province	    普通用户个人资料填写的省份// city	        普通用户个人资料填写的城市// country	    国家,如中国为CN// headimgurl    用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空// privilege	    用户特权信息,json数组,如微信沃卡用户为(chinaunicom)// unionid	    用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。多app数据互通保存该值// access_token  用户当前临时token值,自主添加的值if(string.IsNullOrEmpty(callBackInfo)){// TODO 登录失败,请重试}else{// 解析字段,登录进游戏服务器}}
}
5.7、其他接口封装

其他接口流程同理,在WeChatUnity.mm中封装C接口,调用微信SDKAPI
WeChatSDK.cs中声明[DllImport("__Internal")],封装C#层接口,在WXApiManager.mmonResp中处理响应,通过UnitySendMessage发消息给Unity,在SDKCallBack.cs中处理回调。
画个图方便大家理解,
在这里插入图片描述
流程懂了之后,大家应该就知道怎么封装接口和调用了,我这里就不往下写了~

6、XCodeAPI

我们知道,Unity打包iOS平台是导出XCode工程,我们还需要在XCode工程中做一些设置,最后再导出ipa,事实上,这个过程也可以写成自动化处理,我之前写过一篇文章讲过XCodeAPI,推荐大家看下,《Unity打iOS包之xcodeapi的使用》

7、关于Universal Link

关于Universal Link我之前写过一篇文章,也推荐大家看下,《微信分享显示“未验证应用”问题(辅助标签:Universal Link)》

8、关于iOS刘海屏适配

关于iOS刘海屏适配的问题,我之前写过一篇文章,也推荐大家看下,《Unity适配iphone刘海屏》

三、完毕

好啦,就到这里吧~
我是林新发:https://blog.csdn.net/linxinfa
原创不易,若转载请注明出处,感谢大家~
喜欢我的可以点赞、关注、收藏,如果有什么技术上的疑问,欢迎留言或私信~


http://chatgpt.dhexx.cn/article/QML7Cv4H.shtml

相关文章

iOS开发知识概览

1、学习ios开发的知识概览&#xff0c;经常会认为ios开发会学那些知识&#xff0c;如何把断断续续的知识连接起来&#xff0c; 这就让你有了全局的了解&#xff0c;如何去计划和安排自己的学习计划&#xff0c;有了全局的知识体系。 原文来自&#xff1a;https://github.com/sh…

IOS 开发之逆向分析

在逆向过程中很多时候需要分析 APP 和 Web 端数据交互的内容那么最简单的方式即是抓包网络分析&#xff0c;而使用 Charles、Tcpdump 也是逆袭分析最基本的手段。本文以 Charles 为例来介绍网络相关的内容。 Charles 是在 Mac 下常用的网络封包截取工具&#xff0c;在做 移动开…

ios游戏开发

知识系统 英文教程网站 http://www.csdn.net/article/2012-12-20/2813035-game-dev-guide 开发类库 http://www.csdn.net/article/2012-11-07/2811587-pop-ios-dev-library

芒果iOS开发之Swift教程01-Swift基础

【主要内容】 1.关于Swift 2.Hello World 3.常量和变量 4.类型标注 5.常量和变量的命名 6. 输出常量和变量 7.注释 8.分号 一、关于Swift 苹果在2014年WWDC&#xff08;苹果开发者大会&#xff09;发布了Swift&#xff0c;用于编写iOS&#xff0c;Mac OS X和watchOS…

ios教程,用pc开发ios游戏

原文是Thomas Henshell对手机游戏Catch the Monkey的开发总结&#xff0c;由Lyra翻译。 传智播客今年6月开始ios培训&#xff08;http://ios.itcast.cn&#xff09;的课程&#xff1b;相对于一些应用&#xff0c;我本人对ios游戏开发更感兴趣&#xff0c;这些开发总结并不拘泥…

RPG游戏开发基础教程

RPG游戏开发基础教程 第一步 下载RPG Maker 开发工具包 1.RPG Maker 是什么?RPG Maker 是由Enterbrain公司推出的RPG制作工具。 中文译名为RPG制作大师。 熟悉的人喜欢简称为RM。 根据发行版本的不同,RM在国内流行的版本有4款: 2.附上资源下载地址:点击进入网盘下载 3.关于…

ios开发快速入门教程

1.高级C语言、C语言 C语言是iOS开发的语言(Objective-C)基础&#xff0c;在iOS开发培训的课程中也会涉及到。iOS开发培训需要强调的是并不是要同学们都要精通C/C&#xff0c;而是要掌握iOS开发中要用的的C/C的核心内容。 2.Objective-C语言 Objective-C是iOS开发的标准语言&…

苹果游戏开发教程之如何使用 SpriteKit 和 GameplayKit 制作你的街机手机游戏

项目运行效果 什么是GameplayKit GameplayKit 是由 Apple 开发的框架,在 iOS 9 和 macOS X.11 中引入,它提供了许多类型游戏中常见的基础设施。 它让您专注于游戏玩法和游戏规则,以最大限度地减少意大利面条式代码的编写,并且只需要基于 Objective-C 或 Swift 的界面。 使…

ios 手游SDK 开发教程

前言&#xff1a; 各位同学大家好 &#xff0c;有一段时间没有见面了。 具体多久我也不清楚了&#xff0c; 最近在学习iOS 手游sdk 的开发 所以就想着写完 写一份教程分享给大家&#xff0c; 本人之前一直都是做安卓开发的 安卓 app和安卓手游SDK 开的都会。 需要用到的三方库…

数据分析:大数据时代的必备技能之EXCEL

文章目录 数据分析价值与数据分析思维一、数据分析概述1.什么是数据2.理解数据3.什么是数据分析3. 数据分析的步骤 二、数据分析价值1.定义和组成2. 商业价值案例--豆浆 三、数据分析思维1. 核心思维方式(1)、结构化分析思维(2)、公式化分析思维(3)、业务化分析思维 数据预处理…

#C数据结构与算法# 绪论 算法与大O时间复杂度表示法(附例题)

一 算法基本概念与特性。 1.解决问题的五个步骤 由此我们可以看出良好的解决问题离就不开算法。 2.什么是算法 算法是指在解决问题时&#xff0c;按照某种机械的步骤一定可以得到问题的结果&#xff08;有的问题有解&#xff0c;有的没有&#xff09;的处理过程。算法是对解…

云计算期末速成大法

笔记仅自用&#xff0c;杠勿cue我 1. 绪论 4V特征&#xff1a;Volume&#xff08;规模大&#xff09;&#xff0c;Variety&#xff08;种类杂&#xff09;&#xff0c;Velocity&#xff08;变化快&#xff09;&#xff0c;Value&#xff08;价值密度小&#xff09; 从抽样到全…

简单分析几十个游戏案例

文章目录 一、 介绍二、 影响游戏体验的要点三、 游戏爆火的秘诀1.解读5个关键因素2.把握玩游戏的两种经典心理3.分析几款爆款游戏Qq农场植物大战僵尸水果忍者召唤神龙羊了个羊 4.值得游戏公司学习的经验5.未来游戏面对的诸多挑战 四、 几十款游戏的多方面分析FC红白游戏机十二…

软考高级-系统分析师-案例分析-系统设计

系分-案例分析-系统设计 结构化设计SD内聚&#xff08;高内聚低耦合&#xff09;耦合 业务流程建模IDEF&#xff08;建模仿真&#xff09; 面向对象的设计OOD设计原则设计模式分类 人机界面设计架构设计Zachman 架构框架Zachman 架构框架&#xff08;案例&#xff09; 面向服务…

系统分析师【系统规划案例分析汇总】

系统规划 项目选择和确定 &#xff08;1&#xff09;选择有核心价值的项目 &#xff08;2&#xff09;评估所选择的项目 &#xff08;3&#xff09;项目优先级排序 &#xff08;4&#xff09;评估项目的多种实施方式 &#xff08;5&#xff09;平衡地选择合适的方案 可行…

数据分析师常用的商业模型

数据分析少不了商业分析思维&#xff0c;以及对业务的理解。很多时候觉得思维不够健全&#xff0c;或者分析没有思路&#xff0c;其实都可以借助思维模型的学习来不足&#xff0c;来加速分析的成功。 一、波特五种竞争力模型 波特五力模型是企业制定竞争战略时常用的战略分析…

障碍度如何分析?

通常在综合评价后&#xff0c;比如计算得到准则层和指标层的分别权重之后&#xff08;指标权重体系构建后&#xff09;&#xff0c;为了找到‘主要障碍因子’&#xff0c;此时可使用‘障碍度模型’&#xff08;obstacle degree&#xff09;进一步研究&#xff0c;以便进行障碍度…

大数据分析师技能图谱详解

全球的数据量正在以每18个月翻一倍的惊人速度增长,世界正在高速数字化,大数据堪比石油,如何掘金大数据是所有个人、企业和国家的机遇和挑战。中国是人才大国,能理解和应用大数据的创新人才更是稀缺资源。大数据分析应用已经渗透到我们生活的方方面面。 随着大数据在国内的…

大数据分析案例-基于决策树算法构建银行客户流失预测模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…

系分 - 案例分析 - 需求分析

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 系分 - 案例分析 - 需求分析结构化分析SA数据流图DFD答题技巧典型例题 1题目描述参考答案 典型例题 2题目描述参考答案 面向对象的分析OOA用例图用例模型细化用例描述用例关系【包含、扩展、泛化】分析模…