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 ...
随机推荐
- C#程序员装机必备软件及软件地址
装机必备 Visio2010 下载 http://gd.ddooo.com/visio2010_12530.rar Office 安装包 http://xz.cncrk.com:8080/soft/k ...
- NFS /etc/exports参数解释
nfs 安装 执行以下命令安装 nfs 服务器所需的软件包 yum install -y nfs-utils 执行命令 vim /etc/exports,创建 exports 文件,文件内容如下: / ...
- linux的/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow
1./etc/passwd 存储用户信息 [root@oldboy ~]# head /etc/passwd root:x:::root:/root:/bin/bash bin:x:::bin:/b ...
- Spring Cloud系列之使用Feign进行服务调用
在上一章的学习中,我们知道了微服务的基本概念,知道怎么基于Ribbon+restTemplate的方式实现服务调用,接着上篇博客,我们学习怎么基于Feign实现服务调用,请先学习上篇博客,然后再学习本 ...
- Ionic 警告框
<html ng-app="mySuperApp"> <head> <meta charset="utf-8"> <m ...
- PHP date_parse() 函数
------------恢复内容开始------------ 实例 返回一个包含指定日期的详细信息的关联数组: <?phpprint_r(date_parse("2013-05-01 ...
- Python math 模块、cmath 模块
Python math 模块.cmath 模块 Python 中数学运算常用的函数基本都在 math 模块.cmath 模块中.高佣联盟 www.cgewang.com Python math 模块提 ...
- PHP xml_set_character_data_handler() 函数
定义和用法 xml_set_character_data_handler() 函数为 XML 解析器建立字符数据处理器. 该函数规定当解析器在 XML 文件中找到字符数据时所调用的函数.高佣联盟 ww ...
- 发送ajax请求时候注意的问题
1.在发送ajax请求一般都是默认为异步,就是不去等待后台响应直接可以继续发送, 但这样会有时候遇到一些问题,无法获得后台的响应参数, 所以在你打开编辑弹出框完成数据编辑后无法刷新页面, 这时候可能存 ...
- react ts redux-saga | 谷歌Chrome浏览器风格的标签组件 | 中台
谷歌Chrome浏览器风格的标签组件 选用技术 react typescript redux-saga存储本地标签数据 umi 实现 [x] 支持全部关闭,当前关闭,关闭其他Tab [x] 支持Tab ...