unity探索者之iOS微信登录、分享
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405700.html
iOS接入微信的SDK相对于安卓要麻烦一点,除了核心功能代码以外,还需要在UnityAppController文件中添加不少处理
为了方便管理,我们将微信相关的OC代码写到单独的脚本文件中
先上头文件代码
#import <UIKit/UIKit.h>
#import "WXApi.h"
@interface WechatForUnity : UIResponder <UIApplicationDelegate, WXApiDelegate>
+(instancetype)wechatInstance;
@end
因为微信的原因,所以需要在头文件中响应微信WXApiDelegate,wechatInstance是自定义用于处理回调的实例
接下来就是核心代码了
#import "WechatForUnity.h"
#import "WXApi.h"
#include "UnityAppController.h" static NSString *mWXAppid = nil;
static NSString *mWXSecret = nil;
extern NSString* _CreateNSString (const char* string); extern "C"
{
void RegisterApp_iOS(const char* appId, const char* appSecret){
mWXAppid =_CreateNSString(appId);
mWXSecret =_CreateNSString(appSecret);
[WXApi registerApp:_CreateNSString(appId) universalLink:@"你的App在微信开放平台设置的UniversalLink"];
} void OpenWechat_iOS(const char* state)
{
if ([WXApi isWXAppInstalled]) {
SendAuthReq *req = [[SendAuthReq alloc] init];
req.scope = @"snsapi_userinfo";
req.state = _CreateNSString(state); [WXApi sendReq:req completion:nil];
}
} bool IsWechatInstalled_iOS()
{
return [WXApi isWXAppInstalled];
} bool _IsWechatAppSupportApi() {
return [WXApi isWXAppSupportApi];
} void ShareImageWx_iOS(int scene, Byte* ptr, int size, Byte* ptrThumb, int sizeThumb){
WXMediaMessage *message = [WXMediaMessage message]; NSData *data = [[NSData alloc] initWithBytes:ptr length:size];
NSData *dataThumb = [[NSData alloc] initWithBytes:ptrThumb length:sizeThumb]; [message setThumbImage:[UIImage imageWithData:dataThumb scale:]]; WXImageObject *ext = [WXImageObject object];
ext.imageData = data; UIImage* image = [UIImage imageWithData:ext.imageData];
ext.imageData = UIImagePNGRepresentation(image);
message.mediaObject = ext; SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = scene; [WXApi sendReq:req completion:nil];
} void ShareTextWx_iOS(int scene, char * content){
SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init];
req.text = _CreateNSString(content);
req.bText = YES;
req.scene = scene; [WXApi sendReq:req completion:nil];
} void ShareUrlWx_iOS(int scene, char* url, char* title, char* content, Byte* ptrThumb, int sizeThumb){
WXMediaMessage *message = [WXMediaMessage message];
message.title = _CreateNSString(title);
message.description = _CreateNSString(content);
NSData *data = [[NSData alloc] initWithBytes:ptrThumb length:sizeThumb];
[message setThumbImage:[UIImage imageWithData:data scale:]]; WXWebpageObject *ext = [WXWebpageObject object];
ext.webpageUrl = _CreateNSString(url); message.mediaObject = ext; SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = scene; [WXApi sendReq:req completion:nil];
}
} @implementation WechatForUnity +(instancetype)wechatInstance {
static dispatch_once_t onceToken;
static WechatForUnity *instance;
dispatch_once(&onceToken, ^{
instance = [[WechatForUnity alloc] init];
});
return instance;
}-(void) onReq:(BaseReq *)req{} /*! 微信回调,不管是登录还是分享成功与否,都是走这个方法 @brief 发送一个sendReq后,收到微信的回应
* 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
* 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
*/
-(void) onResp:(BaseResp*)resp{
if ([resp isKindOfClass:[SendAuthResp class]]) {//授权登录的类。
if (resp.errCode == ) {
[self requestWxToken:((SendAuthResp *)resp).code];
}else{
UnitySendMessage("ThirdPartySdkManager", "WechatLoginCallback","");
}
}else if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
UnitySendMessage("ShareManager", "WechatCallBack", [[NSString stringWithFormat:@"%d",resp.errCode] UTF8String]);
}
} -(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, mWXSecret, 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];
} -(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]; UnitySendMessage("ThirdPartySdkManager", "WechatLoginCallback",[jsonStr UTF8String]);
}
}]; [dataTask resume];
} -(NSString*)DataTOjsonString:(id)object
{
NSString *jsonString = nil;
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object
options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
error:&error];
if (! jsonData) {
NSLog(@"Got an error: %@", error);
} else {
jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
return jsonString;
} @end
将上述两个文件放在工程的Plugins/iOS目录下之后,就可以生成xcode工程了
然后在生成的xcode工程的UnityAppController头文件和.mm文件中作如下修改
在头文件的最上方添加 #import "WXApi.h" 引用
在.mm文件中添加
#import "WXApi.h"
#import "WechatForUnity.h"
然后重写下面的函数
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [WXApi handleOpenURL:url delegate:[WechatForUnity wechatInstance]];
}
修改下面这个函数的返回值
- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary<NSString*, id>*)options
{
id sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey], annotation = options[UIApplicationOpenURLOptionsAnnotationKey]; NSMutableDictionary<NSString*, id>* notifData = [NSMutableDictionary dictionaryWithCapacity: ];
if (url) notifData[@"url"] = url;
if (sourceApplication) notifData[@"sourceApplication"] = sourceApplication;
if (annotation) notifData[@"annotation"] = annotation; AppController_SendNotificationWithArg(kUnityOnOpenURL, notifData);
return [WXApi handleOpenURL:url delegate:[WechatForUnity wechatInstance]];
}
因为在iOS13中,苹果要求打开其他app必须使用UniversalLink,所以还需要再重写下面这个函数
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler NS_AVAILABLE_IOS(8_0);
{
if([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *url = userActivity.webpageURL;
if(url){return [WXApi handleOpenUniversalLink:userActivity delegate:[WechatForUnity wechatInstance]];
}
}
return YES;
}
最后,添加微信的白名单和必要的库的引用,如何添加这些东西在这里就不详细说了
unity探索者之iOS微信登录、分享的更多相关文章
- unity探索者之安卓微信登录,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7666348.html 之前写了两篇关于微信分享的博客,其实微信登录.分享.支付博主 ...
- ios 微信登录相关
引入项目的文件 info.plist 添加内容 WXApi.registerApp(Config.wx.APP_ID,enableMTA: true)//注册微信api(在AppDelegate里面注 ...
- IOS微信禁用分享跳转页面返回BUG修复
fresh(); function fresh() { let isPageHide = false; window.addEventListener('pageshow', function () ...
- Android微信登录、分享、支付
转载需要著名出处: http://blog.csdn.net/lowprofile_coding/article/details/78004224 之前写过微信登录分享支付第一版: http://bl ...
- 社会化登录分享-Android SDK的二次封装和使用
本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...
- iOS开发笔记14:微博/微信登录与分享、微信/支付宝支付
产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK S ...
- Unity接入微信登录 微信分享 微信支付 支付宝SDK
你将会学到的unity集成SDK游戏中接入微信支付与支付宝支付游戏中接入微信登录与微信分享 目录 mp4格式,大小2.2GB 扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop13 ...
- Unity接入ShareSDK实现QQ登录和QQ分享、微信分享
原文链接:Unity接入ShareSDK实现QQ登录和QQ分享.微信分享 由于微信登录需要企业审核,我这里就不说明了,有需要的可以去官网看一下文档,和QQ登录比多了一个打包的步骤. 第一步:到官网申请 ...
- react-native 的微信SDK辅助包,支持微信登录、微信分享、微信支付
微信SDK集成示例,现已完成微信授权登录,之后将陆续包装分享等其他功能. ReactNative高级交流群 127482131 或访问 http://blog.1ygowu.com ReactNat ...
随机推荐
- Markdown画图(mermaid)学习
简介 目前博客园支持mermaid的graph,subgraph,sequenceDiagram,gantt,classDiagram mermaid(美人鱼), 是一个类似markdown,用文本语 ...
- 说出来也许你不信,我被 Linux 终端嘲笑了……
人这一辈子,真的是非常不容易:读书时,被老师.同学嘲笑,工作时,被老板.同事嘲笑,就连出去撸个串儿,还可能被朋友嘲笑-- 这些也就算了,毕竟大家还都是同类,都是活生生的人.但是,你如果被 Linux ...
- [转载]android网络通信解析
原文地址:android网络通信解析作者:clunyes 网络编程的目的就是直接戒间接地通过网络协议不其他计算机进行通讯. 网络编程中有两个主要的问题, 一个是如何准确的定位网络上一台戒多台指主机: ...
- IO流——Properties类、序列化流、反序列化流、打印流、commons-IO
一. Properties类 1. Properties类介绍 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 ...
- 5分钟白嫖我常用的免费效率软件/工具!效率300% up!
Mac 免费效率软件/工具推荐 1. uTools(Windows/Mac) 还在为了翻译 English 而专门下载一个翻译软件吗? 还在为了格式某个 json 文本.时间戳转换而打开网址百度地址吗 ...
- PHP localtime() 函数
------------恢复内容开始------------ 实例 以一个数值数组和一个关联数组的形式输出本地时间: <?phpprint_r(localtime());echo "& ...
- PHP fileowner() 函数
定义和用法 fileowner() 函数返回指定文件的用户 ID(所有者). 如果成功,该函数返回用户 ID.如果失败,则返回 FALSE. 语法 fileowner(filename) 参数 描述 ...
- 2019 HL SC day4
自闭场本来 以为 顶多一些不太会 结果发现 一堆不太会 . 树状数组 感觉 好久没看 了有点遗忘 不过还好 现在我来了.莅临之神将会消灭一切知识点哦. 今天说点不一样东西 树状数组 hh 很有用的东 ...
- luogu P4606 [SDOI2018]战略游戏
LINK:战略游戏 一道很有价值的题目.这道题 一张无向联通图 每次询问给出K个关键点 问摧毁图中哪个点可以使得这K个关键的两两之间有一对不能联通 去掉的这个点不能是关键点 求方案数. 可以发现 当K ...
- 剑指 Offer 57. 和为s的两个数字
本题 题目链接 题目描述 我的题解 双指针 思路分析 因为该数组是递增数组,所以我们可以用双指针法. 声明指针left 和 right分别指向数组的头(数组下标为0)和尾(数组下标为length-1) ...