UNITY_iOS_接入微信登录及分享微信
UNITY_iOS_接入微信登录及分享微信
一、准备工作
开发环境:
Xcode版本:12.4
Unity版本:2018.3.0f2
1.首先配置应用的Universal Links
Universal Links介绍
Universal Link(通用链接)是苹果在iOS9推出的,一种能够方便使用的通过传统https链接来启动App的功能,可以使用相同的网址打开网址和App.
看起来就是一条不同的额https链接,当然是我们在该链接域名根目录配置的一个链接,也可以在该链接中放置对应的H5页面。当用户点击该链接,只要手机中安装了支持该链接的App就会直接进入到App中。如果没有安装啊App则会跳转到Safar浏览器中,展示H5页面,对用户来说则是一个无缝跳转的过程。
配置Universal Links
其实配置很简单,但是遇到的坑很多。微信对Universal links配置要求
2、Universal Links配置的paths不能带query参数
3、微信使用Uniersal Links拉起第三方App时,会在Universal Links末尾拼接路径和参数,因此App配置的paths必须加上通配符/*
配置JSON文件
创建一个空白文件(必须是纯文本,命名为apple-app-site-association,去除后缀名)。建议让后台人员在其本地创建,避免文件传输时,文件自动被更改格式,后缀自动添加等问题。
Universral Links示例: 文件名 apple-app-site-association
{"applinks": {"apps": [],"details": [{"appID": "Team ID.Bundle Identifier","paths": ["*"]}]}
}
说明:
1、Team ID表示苹果账号的团队ID, Bundle Identifier表示项目的BundleID (包名)
2、appID中的Team ID可以通过苹果开发平台->左菜单Membership-> 找到Team ID值:如128LGFR841。Xcode12.4的Team ID可以在这里查看
3、appID的Bundle Identifier可以在Unity或Xcode打开项目Bundle Identifiler中找到,如com.xxx.xxx.(Unity 项目的包名)
4.结合起来appID就是 128LGFR841.com.xxx.xxx
5、paths可默认通配符*
6、配置好Universal Links后 把 apple-app-site-association文件放置到服务器的根目录或者.well-known子目录下(后台人员知道 注意:必须要放在带有https域名的服务器下)。然后让后台提供一个https的url地址。格式是“正式域名/apple-app-site-association”,如:https://www.baidu.com/apple-app-site-association。
达到的效果是 浏览器打开这个地址 ,就可以下载这个文件,另外GET请求这个地址 返回文件是Json内容。这里通过谷歌浏览器的Postman经行实验
注意 返回的数据不能存在乱码 否则说明JSON文件有问题
微信开放平台配置
在微信开放平台配置IOS平台开发信息参数:前提是你自己已经在微信开放平台审核通过你的appid
二、导入核心微信SDK开发工具包——登录
1、iOS开发工具包下载
2、主要包括libWeChatSDK.a,WXApi.h,WXApiObject.h三个。
3、把这三个放到Unity项目->Plugins->iOS文件夹下即可
三、核心唤起登录和反馈代码
1.在Plugins/iOS文件夹新建WXApiManager文件夹 在该文件夹下新建 WXApiManager.h头文件
// WXApiManager.h
#import <Foundation/Foundation.h>
#import "Libraries/Plugins/iOS/WXApi.h"
NS_ASSUME_NONNULL_BEGIN
@interface WXApiManager : UIResponder<UIApplicationDelegate, WXApiDelegate>
+ (instancetype)shareManager;
@end
NS_ASSUME_NONNULL_END
2.在Plugins/iOS/WXApiManager文件夹下新建WXApiManager.mm文件
// WXApiManager.m
#import "WXApiManager.h"
@implementation WXApiManager
+(instancetype) shareManager
{static dispatch_once_t onceToken;static WXApiManager *instance;dispatch_once(&onceToken, ^{instance = [[WXApiManager alloc] init];});return instance;
}
// 微信发送请求到第三方应用时,会回调到该方法
-(void) onReq:(BaseReq *)req {}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
-(void) onResp:(BaseResp *)resp
{NSLog(@"微信响应");if([resp isKindOfClass:[SendAuthResp class]]){SendAuthResp *temp = (SendAuthResp*)resp;int errorCode = temp.errCode;switch (errorCode) {case 0:{printf("登录成功-xcode");NSLog(@"code %@",temp.code);NSString *message = [NSString stringWithFormat:@"%@",temp.code];const char* codeInfo = [message cStringUsingEncoding:NSASCIIStringEncoding];OnShowMessage(codeInfo);//登录成功 将code发送给Unity break;}case -2:printf("用户取消");OnShowMessage("-2;用户取消");break;case -4:printf("用户拒绝授权");OnShowMessage("-4;用户取消");break;default:printf("登录失败");OnShowMessage("-1;登录失败");break;}}//微信分享授权回调else if([resp isKindOfClass:[SendMessageToWXResp class]]){//0成功,-2是取消,其他异常SendMessageToWXResp *rresp = (SendMessageToWXResp*)resp;NSString *code = [NSString stringWithFormat:@"%d",rresp.errCode];const char* codeInfo = [code cStringUsingEncoding:NSASCIIStringEncoding];OnShareShowMessage(codeInfo);}
}//防止内存泄漏,崩溃,这里进行参数转换
char* MakeStringCopy(const char* string){if(string == NULL){return NULL;}char* res = (char*)malloc(strlen(string)+1);strcpy(res, string);return res;
}
//信息提示
void OnShowMessage(const char* msg)
{//将消息发送给UnityUnitySendMessage("WeChatComponent", "LogonCallback", MakeStringCopy(msg));
}void OnShareShowMessage(const char* msg)
{UnitySendMessage("WeChatComponent", "LogonCallback", MakeStringCopy(msg));
}
@end
3、Unity 与iOS交互文件,同样在Plugins/iOS文件夹下新建Native.h头文件
#include "UI/UnityViewControllerBase.h"
#include "UnityAppController+ViewHandling.h"
@interface Native:NSObject
@end
extern "C"
{void _WechatLogin(char* appid,char* message);
bool _isWechatInstalled();
void _ShareByIos(int type, char* url);
}
4、unity与iOS交互文件 同样在Plugins/iOS文件夹下新建Native.mm文件
注:微信官网分享API入口
// 微信SDK注册,universal link
[WXApi registerApp:APP_ID universalLink: UNIVERSAL_LINK];
补充说明:
如果后台提供的url地址是https://www.baidu.com/apple-app-site-association。那么,
代码注册方法及微信开放平台中都填https://www.baidu.com/,
//
// Native.mm
// iosPlugins
//
// Created by os on 2020/4/10.
// Copyright © 2020 os. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Native.h"
#import "Libraries/Plugins/iOS/WXApi.h"
@interface Native()
@end
@implementation Native : NSObject//判断是否安装微信
bool _isWechatInstalled()
{return [WXApi isWXAppInstalled];
}//微信登录
void _WechatLogin(char* appid,char* message)
{//向微信注册appid:填写自己微信开放平台的appid信息NSString *weichatId = [NSString stringWithFormat:@"%s", appid];NSString *UNIVERSAL_LINK = [NSString stringWithFormat:@"%s", "对应申请微信平台上的Universal Links"];[WXApi registerApp:weichatId universalLink:UNIVERSAL_LINK];if([WXApi isWXAppInstalled] ==false){NSLog(@"请先安装微信客户端");return;}//登录SendAuthReq* req = [[SendAuthReq alloc] init];req.scope = @"snsapi_userinfo";req.state = [NSString stringWithFormat:@"%s", message];//[WXApi sendReq:req];[WXApi sendReq:req completion:^(BOOL success) { NSLog(@"唤起微信:%@", success ? @"成功" : @"失败"); }];
}
//分享图片类型接口示例
//参数:type表示分享类型(0:分享某个好友聊天;1:分享到微信朋友圈)
//参数:url为图片本地地址,当然也可以用远程地址然后下载下来。
//具体分享其他类型(如文宇类型,音乐类型,视频类型可参考微信官网API)
void _ShareByIos(int type, char* url)
{NSString *sharePicUrl = [NSString stringWithFormat:@"%s", url];//UIImage *image = [UIImage imageNamed:sharePicUrl];//NSData* imageData = UIImageJPEGRepresentation(image, 0.7);WXImageObject *imageObject = [WXImageObject object];imageObject.imageData = [NSData dataWithContentsOfFile:sharePicUrl];WXMediaMessage *message = [WXMediaMessage message];[message setThumbImage:[UIImage imageNamed:@"xzqShare.png"]];message.mediaObject = imageObject;SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];req.bText = NO;req.message = message;req.scene = type ==0? WXSceneSession : WXSceneTimeline;//0表示聊天,1,表示朋友圈[WXApi sendReq:req completion:^(BOOL success) { NSLog(@"微信分享:%@", success ? @"成功" : @"失败"); }];}
@end
5、接下来就是Unity代码调用这块
把下面的代码挂在到名称为WeChatComponent的物体上 可以自己改
//判断微信是否安装[DllImport("__Internal")]private static extern bool _isWechatInstalled();[DllImport("__Internal")]private static extern void _WechatLogin(string appid,string state);public void SendWxLogin(){bool isInstalled = false;string wx_appid = PublicEntity.WX_APP_ID;string state = PublicEntity.STATE;
#if !UNITY_EDITOR
#if UNITY_IOSisInstalled = _isWechatInstalled();
#endif
#endifif (isInstalled){#if !UNITY_EDITOR
#if UNITY_IOS_WechatLogin(wx_appid,state);
#endif
#endif}else{PublicUtils.ShowAndroidToastMessage("请先安装微信客户端!");}}/// <summary>/// 登录回调/// </summary>/// <param name="msg"></param>public void LogonCallback(string msg){Debug.log(msg);}
微信分享代码段
private int shareType = 0;//分享类型,0:表示分享到聊天;1:表示分享到朋友圈UnityWebRequest webRequest;[DllImport("__Internal")]private static extern void _ShareByIos(int type, string url);/// <summary>/// 图片类型分享至微信/// </summary>/// <param name="_type">0:表示分享到聊天;1:表示分享到朋友圈</param>private void OnShareWXByIOS(int _type){shareType = _type;StartCoroutine(savePicToShare());}IEnumerator savePicToShare(){string sharePicUrl = PublicEntity.HTTP_SERVICE_URL + "uploadFiles/res/sharePic/sharePic.png";webRequest = UnityWebRequest.Get(sharePicUrl);webRequest.timeout = 30;//设置超时,若webRequest.SendWebRequest()连接超时会返回,且isNetworkError为trueyield return webRequest.SendWebRequest();if (webRequest.isNetworkError){Debug.Log("Download Error:" + webRequest.error);}else{//获取二进制数据var File = webRequest.downloadHandler.data;//创建文件写入对象FileStream nFile = new FileStream(PublicEntity.localPicUrl, FileMode.Create);//写入数据nFile.Write(File, 0, File.Length);nFile.Close();_ShareByIos(shareType, PublicEntity.localPicUrl);}}/// <summary>/// 分享回调/// </summary>/// <param name="msg"></param>public void ShareCallBack(string msg){if (msg != null && msg != ""){switch (msg){case "-2":PublicUtils.ShowAndroidToastMessage("分享已取消");break;case "0":PublicUtils.ShowAndroidToastMessage("分享成功");break;default:PublicUtils.ShowAndroidToastMessage("分享失败");break;}}else{PublicUtils.ShowAndroidToastMessage("分享失败");}}
6、接下来就是到导出unity ios项目 剩下的就是在xcode里面配置
1->在"TARGETS"一栏,在“info”变迁栏的“URL Types”添加URL scheme
2.->在"TARGETS"一栏,在“info”变迁栏的“Custom iOS Target Properties”添加"LSApplicationQueriesSchemes"
3.->在"Signing & Capabilities"一栏,添加Associated Domains
补充说明:
如果后台提供的url地址是https://www.baidu.com/apple-app-site-association。那么,
Associated Domains中填写applinks:www.baidu.com,
4.->在"Build Phases"一栏,添加依赖包
主要添加;(可根据需求经行删除)
CoreTelephony.framework
Security.framework
CFNetwork.framework
WebKit.framework
SystemConfiguration.framework
libWeChatSDK.a
5.->在"Build Settings"一栏,Linking—>添加-Objc和-all_load
6.->接下来就是实现回调部分
找到UnityAppController.mm文件
1.首先导入包
#import “Libraries/Plugins/iOS/WXApi.h” //微信API依赖的文件
#import “Libraries/Plugins/iOS/WXApiManager/WXApiManager.h”//这是微信登录回调用的头文件
2.接下来就是修改openURL
// UIApplicationOpenURLOptionsKey was added only in ios10 sdk, while we still support ios9 sdk
- (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: 3];if (url) notifData[@"url"] = url;if (sourceApplication) notifData[@"sourceApplication"] = sourceApplication;if (annotation) notifData[@"annotation"] = annotation;AppController_SendNotificationWithArg(kUnityOnOpenURL, notifData);//return YES; 将返回值修改成[WXApi handleOpenURL:url delegate:[WXApiManager shareManager]] 就行NSLog(@"oepnURL33333...........");return [WXApi handleOpenURL:url delegate:[WXApiManager shareManager]];
}
到这里就基本上结束了,剩下就是在真机上测试。
7.也可以在Unity->Editor文件下新建IosAutoBuild脚本,把一些Xcode的配置绑定好 这样就不用我们手动去设置了
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;public class IosAutoBuild
{[PostProcessBuild(9999)]public static void OnPostProcessBuild(BuildTarget target, string pathToBuildProject){if (target != BuildTarget.iOS)return;string projPath = pathToBuildProject + "/Unity-iPhone.xcodeproj/project.pbxproj";PBXProject proj = new PBXProject();proj.ReadFromFile(projPath);string targetGuid = proj.TargetGuidByName("Unity-iPhone");//添加Other Linker Flagsproj.AddBuildProperty(targetGuid, "Other Link Flags", "-Objc -all_load -framework CoreTelephony");//修改部分设置proj.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");//添加代码库proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libiconv.tbd", "Frameworks/libiconv.tbd", PBXSourceTree.Sdk));proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libsqlite3.tbd", "Frameworks/libsqlite3.tbd", PBXSourceTree.Sdk));proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libc++.tbd", "Frameworks/libc++.tbd", PBXSourceTree.Sdk));proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libz.tbd", "Frameworks/libz.tbd", PBXSourceTree.Sdk));//添加Frameworksproj.AddFrameworkToProject(targetGuid, "Security.framework", false);proj.AddFrameworkToProject(targetGuid, "SystemConfiguration.framework", false);proj.AddFrameworkToProject(targetGuid, "CoreGraphics.Framework", false);proj.AddFrameworkToProject(targetGuid, "CoreTelephony.framework", false);proj.AddFrameworkToProject(targetGuid, "CFNetwork.framework", false);proj.AddFrameworkToProject(targetGuid, "WebKit.fWXApiObject.h" +"ramework", false);//修改Info.pliststring plistPath = Path.Combine(pathToBuildProject, "Info.plist");PlistDocument plist = new PlistDocument();plist.ReadFromFile(plistPath);PlistElementDict rootDict = plist.root;PlistElementArray urlTypes = rootDict.CreateArray("CFBundleURLTypes");var urlItem2 = urlTypes.AddDict();urlItem2.SetString("CFBundleTypeRole", "Editor");urlItem2.SetString("CFBundleURLName", "你自己的包名");//1urlItem2.SetString("CFBundleURLSchemes", "你自己注册的appid");//2,具体那个有效果var schemes2 = urlItem2.CreateArray("CFBundleURLSchemes");schemes2.AddString("wx47074c4bb44164fa");//添加白名单PlistElementArray queriesSchemes = rootDict.CreateArray("LSApplicationQueriesSchemes");queriesSchemes.AddString("weixin");queriesSchemes.AddString("wechat");queriesSchemes.AddString("weixinULAPI");plist.WriteToFile(plistPath);}
}
UNITY_iOS_接入微信登录及分享微信相关推荐
- 微博/微信登录与分享、微信/支付宝支付
目录 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK (2)微信SDK (3)支付宝SDK 2.微博登录 (1)发起微博授权请求,切换到微博 (2)授权操作后返回客户端进行相关处理 3.微 ...
- android 微信登录与分享集成
android 微信登录与分享 android微信登录与分享这两个功能是很常用的,尤其是现在微信用户日益剧增,qq虽然很经典但是感觉大多数用来办公 每个写android的小伙伴估计都会写到这个功能,我 ...
- Android接入三方登录——QQ、微信、Facebook、Twitter
Android接入三方登录--QQ.微信.Facebook.Twitter 避坑指南 facebook错误1: facebook错误2: QQ 微信 Facebook Twitter 补充: 避坑指南 ...
- Android应用实现微信登录与分享
Android应用实现微信登录与分享 1. 闲话(可直接无视 项目慢慢的推进,逐渐的做到了微信第三方登录的功能模块了.其实我想说Orz,我等这一天等了好久了,想做个微信验证登录都等了两个多星期咧(其实 ...
- Android微信登录以及分享集成步骤
准备工作 在应用集成微信登录以及分享之前,我们在微信开放平台必须要个开发者账户 1.注册完之后创建一个移动应用 2.填写对应应用包名以及签名(md5)信息,填写完毕后,会有个审核过程,一般第二天就通过 ...
- 安卓微信登录,分享,支付
1.准备工作 在微信开放平台注册好账号,和获得WX_AppID. 添加依赖 : api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+ ...
- 对于微信二维码相关官方文档的一些注解(微信登录和绑定微信、关注公众号)
转载自:https://www.jianshu.com/p/d533c69be034 由于微信官方文档对此的描述虽然还可以,但是还是有一些让人疑惑的地方,所以笔者做了一些注解,希望对大家有所帮助 为什 ...
- lol微信登录服务器,lol开放微信登录功能 lol微信怎么登陆
lol开放微信登录功能 lol微信登录功能开放大区有哪些 英雄联盟在5月6日开放了部分大区的微信登录功能,玩家们现在可在目前开放了微信登录功能的 大区使用微信登录,但需要将微信账号与已有QQ账号进行绑 ...
- 接入微信登录---(由于微信的官方文档写的有点散,特此记录一下)
最近app上Goole市场,三方登录这块原先用的是mob的,但是Goole那边检测到mob会自动收集手机用户的手机号码信息并上传到mob的后台,所以App被下架了,没办法就让直接对接微信登录.下面就是 ...
- 安卓开发之集成微信登录以及分享群聊,朋友圈功能。
准备工作 先申请应用的各种ID,官网地址:https://open.weixin.qq.com 集成 添加依赖. implementation 'com.tencent.mm.opensdk:wech ...
最新文章
- WebApi2 知识点总结
- Windows 8 的新文件搜索实例分享
- 【LeetCode】两数之和
- 如何防止IDEA 每次启动javaWEB项目都自动打开浏览器标签页
- 展讯召开2017全球合作伙伴大会,发布两款新平台及新战略
- 华南农业大学c语言上机实验答案,华南农业大学C语言上机实验答案.doc
- LoadRunner 录制常见错误解决方法
- Jenkins 配置mirrors
- Flink SQL 在快手的扩展和实践
- py+webdriver学习之旅6:cookie
- LaTex安装及快速入门使用
- 【数字图像处理matlab】sobel、prewitt算子图像锐化
- 基本算法4.1堆积木详细题解
- 来,带你认识几种最流行的Python编辑器的IDEs
- 用JLINK烧写U-boot到Nand Flash中
- 武汉的二本计算机学校有哪些,武汉二本大学有哪些学校
- 电脑开机时多出来个 Windows PE 操作系统选项? 如何去除掉?
- oracle如何exp远程备份,oracle exp远程数据库
- 孩子一看学习就上瘾,不信试试看(ZT)
- FPGA学习之串口发送程序设计(来自小梅哥的教程学习者)
热门文章
- java for循环
- 看完你就明白的锁系列之自旋锁
- 标学历年真题2016年版 真考题库1 电子表格
- linux dns劫持转发,linux的dns被劫持
- 图解网络硬件 资料分享
- 木瓜移动每日资讯0602:“店小秘”宣布完成1.35亿元人民币B+轮融资
- 解决thinkpad sl410 evc windows7硬盘安装ubuntu12.04以后,windows 无线出现断开网速慢等问题
- 青春树儿童摄影网网页
- 关于TC Games针对没有耳机接口的Type-C用户玩手游如何传音和语音
- 数字经济下,银行线上场景化建设的服务颗粒度、用户忠诚度和生态融合度