文章目录

  • 一、前言
  • 二、流程
    • 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
原创不易,若转载请注明出处,感谢大家~
喜欢我的可以点赞、关注、收藏,如果有什么技术上的疑问,欢迎留言或私信~

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

  1. Unity Android平台接入支付宝SDK

    这篇文章前面讲的创建Android Studio工程的流程是不正确的!!! 正确的流程请参见:Unity Android平台下插件/SDK开发通用流程 最近帮一个群里的朋友接了一下支付宝的SDK,开发 ...

  2. iOS 平台 接入新浪微博 SDK 的坑(registerApp 的问题)

    转载:http://leenjewel.github.io/blog/2015/01/08/ios-ping-tai-cocos2d-x-xiang-mu-jie-ru-xin-lang-wei-bo ...

  3. 小游戏开发Laya对接主流平台(qq,抖音,vivo,oppo,微信)

    小游戏开发-Laya对接主流平台 laya对接主流平台简介(qq,抖音,vivo,oppo,微信) 全平台讲座地址: qq https://blog.csdn.net/koljy111/article ...

  4. 王楠——海外华人程序员视角:解密移动游戏开发与Unity 4引擎特性

    海外华人程序员视角:解密移动游戏开发与Unity 4引擎特性 发表于2012-09-07 17:24| 12534次阅读| 来源CSDN整理| 0 条评论| 作者杨依帆 游戏开发Unity游戏引擎王楠 ...

  5. Unity 2D游戏开发视频教程 Unity 2D Game Developer Course Farming RPG

    Unity 2D游戏开发视频教程 Unity 2D Game Developer Course Farming RPG Unity 2D游戏开发课程农业RPG MP4 |视频:h264,1280×72 ...

  6. 微信SDK非微信ipad协议

    微信SDK非微信ipad协议 个人微信号开发sdk非微信ipad协议.非mac协议,非安卓协议 无需扫码登录.可收发朋友圈.查看朋友圈.朋友圈互动点赞.评论.好友列表.微信消息收发.发文本消息.图片消 ...

  7. python微信库有哪些_GitHub - zwczou/weixin-python: 微信SDK - 包括微信支付,微信公众号,微信登陆,微信消息处理等...

    微信SDK 提供微信登陆,公众号管理,微信支付,微信消息的全套功能 文档目录 如果需要单独使用其中的某些模块,可以见文档目录的具体模块 如果需要组合在一起可以参考快速开始 目录 安装 使用pip su ...

  8. 游戏开发技术Unity开发引擎

    Unity 是一个完全集成的开发引擎,提供了丰富的开箱即用的功能,用于创建游戏及其他互动式3D内容.您可以使用Unity 将艺术和资源组装到场景和环境:增加物理效果:同步播放测试和编辑您的游戏,并在准 ...

  9. 【2d游戏开发】unity实现UI框架搭建

    前言 前面一直比较忙,然后到现在才继续接游戏的文章,那么本次将带大家去搭建一个ui框架,同样,需要更具体的教学,可以到b站搜索本人的关于2d游戏开发-unity实现xxx的系列视频. 步骤 其实大致的 ...

  10. 【游戏开发实战】手把手教你从零跑一个Skynet,详细教程,含案例讲解(服务端 | Skynet | Ubuntu)

    文章目录 一.前言 二.关于Skynet 三.Ubuntu虚拟机 1.Ubuntu系统镜像下载 2.VirtualBox虚拟机软件 2.1.VirtualBox下载 2.2.VirtualBox安装 ...

最新文章

  1. 李彦宏成为首登《时代周刊》的互联网大佬,百度研究院再添三名大牛
  2. 多路复用select和epoll的区别(转)
  3. 容器(一)剖析面试最常见问题之 Java 集合框架
  4. Spark SQL JOIN操作代码示例
  5. Javaweb-AJAX快速入门及案例实战
  6. facebook对话链接_如何应用防错原则,看看 Facebook 和 Gmail 是怎么做的
  7. C# 使用TcpClient 测试网络连接是否正常
  8. vue跨域/webpack跨域
  9. 分布式文件存储SeaweedFS试用对比总结
  10. Word2013中如何去掉页眉横线
  11. springboot项目报错-The Bean Validation API is on the classpath but no implementation could be found
  12. Microsemi Libero系列教程(六)——Identify片上逻辑分析仪的使用
  13. Flutter 数据持久化
  14. 腾讯优图实验室日常实习生招聘
  15. Anaconda 安装与 使用
  16. leetcode 455 分发饼干(c++和python) 贪心算法
  17. css 溢出隐藏省略号代替
  18. Spine动画显示错乱问题
  19. JavaWeb基于老杜课程笔记的完善
  20. Windows环境下的命令行工具cmder的安装和使用

热门文章

  1. C语言实现“轰炸”代码(QQ)
  2. js检测微信浏览器_JavaScript判断是否是微信浏览器
  3. 细等线体cass_CAD中,刚打开一个文件,细等线体显示不出来,然后换个字体后在换回细等线体才正常显示,怎么回事?...
  4. android抓包为什么有些数据抓不了?抓包的辛酸历程
  5. JavaScript 3D 散点图
  6. MyBatis下载和使用(保姆级)
  7. 微信小程序文件大小限制
  8. 2021密码应用技术白皮书
  9. 正点原子STM32F103(精英版)------串行通信
  10. 活动回顾 I 《传奇动物园》项目团队沙盘演练圆满结束!