unity探索者之微信分享所有流程,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7560575.html
很久没有写新博客了,前段时间有些忙,这几天趟了几个微信分享的坑,写下来和大家分享下
接过微信分享的人,不论是直接接的微信自己的sdk还是使用了第三方插件,比如友盟、Mob之类的,估计都被微信官方恶心过。因为微信官方的文档真的是除了给了sdk,其余的等于什么都没说。
先说说接分享的流程吧:
首先,需要去微信开放平台申请账号,并注册一个应用,然后等待审核,这个过程我就不细说了,百度上到出都有。
审核通过后,就可以到管理中心查看自己的应用,点击查看进入应用详情界面

新注册的应用默认就有微信分享的权限,但是其他包括支付的功能则需要另外申请。在界面下方就是应用的开发信息了。

这里的应用签名和包名相当重要,因为对应的unity工程所使用的签名文件和包名必须和这里的一模一样,包名没什么好说的按照【com.公司名.项目名】的结构定义就好,主要说说签名,因为博主就在这个问题上栽了跟头。
这里的应用签名并非是简单的名字,也不可以随便定义,而是需要和项目的签名文件的md5相同,先说签名文件的生成,unity有比较简单的方法

在unity的PlayerSettings中的Publishing Settings页中,勾选Create a new key,然后点击下方的Browse Keystore按钮,在弹出的窗口中填写好签名文件的名字,然后保存
接下来,注意,点击保存后并不会立即就生成签名文件,而是需要先在下方的两个输入框中填写签名文件的密码,填写完毕后,再选择下方的Alias下拉框

这时候会出现一个新的选项,Create a new key

填写好相应信息,点击Create Key,然后你会发现,你刚才选择的那个路径出现一个新的keystore文件
然后接下来就可以使用这个签名文件了,不过还没完。
接下来就是第二个很重要的地方了,签名文件的md5码
网上很多人给的方法是使用eclipse创建签名文件的apk,然后使用微信提供的生成md5的工具来获取MD5,不过博主觉得很麻烦,所以选择使用命令行

把刚才生成的签名文件拷贝到你的jdk文件夹下的bin目录中,然后使用命令行
keytool -list -v -keystore xyms.keystore

输入密码后,下方的MD5就是我们要的东西了,把这串MD5码的冒号去掉,然后大写改为小写,复制到微信分享平台中应用签名一栏就ok了
网上有人说应用签名和包名一个月只能改一次,不过博主一天改了三回貌似也没啥问题。。。
OK,签名和包名的问题解决了,接下来就是干货了,首先是核心java代码
public class ShareUtils {
public static IWXAPI api = null;
public static void RegisterToWechat (Context context, String appId) {
api = WXAPIFactory.createWXAPI(context, appId, true);
api.registerApp(appId);
}
public static boolean IsWechatInstalled () {
return api.isWXAppInstalled();
}
public static boolean IsWechatAppSupportAPI() {
return api.isWXAppSupportAPI();
}
public static void ShareImage(int scene, byte[] imgData, byte[] thumbData) {
WXImageObject imgObj = new WXImageObject(imgData);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
msg.thumbData = thumbData;
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = BuildTransaction("img");
req.message = msg;
req.scene = scene;
api.sendReq(req);
}
public static void ShareText(int shareType, String text) {
WXTextObject textObj = new WXTextObject();
textObj.text = text;
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
msg.description = text;
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = BuildTransaction("text");
req.message = msg;
req.scene = shareType;
api.sendReq(req);
}
public static void ShareWebPage(int shareType, String url, String title, String content, byte[] thumb) {
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = url;
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = title;
msg.description = content;
msg.thumbData = thumb;
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = BuildTransaction("webpage");
req.message = msg;
req.scene = shareType;
api.sendReq(req);
}
static String BuildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
}
然后是unity代码
public class ShareManager : MonoBehaviour
{
static ShareManager _instance; public static ShareManager Instance
{
get
{
if (_instance == null)
{
GameObject go = new GameObject();
_instance = go.AddComponent<ShareManager>();
go.name = _instance.GetType().ToString();
}
return _instance;
}
} void OnDestory()
{
_instance = null;
} public enum WXScene
{
// 好友
WXSceneSession = ,
// 朋友圈
WXSceneTimeline = ,
// 收藏
WXSceneFavorite = ,
} public static string WechatAppId = "xxxxxxx";
static string shareUtils = "com.xxxx.xxx.mytool.ShareUtils"; public void RegisterAppWechat()
{
#if UNITY_ANDROID
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass utils = new AndroidJavaClass(shareUtils);
utils.CallStatic("RegisterToWechat", currentActivity, WechatAppId);
#endif
} public void ShareImage(WXScene scene, byte[] data, byte[] dataThumb)
{
#if UNITY_ANDROID
AndroidJavaClass utils = new AndroidJavaClass(shareUtils);
utils.CallStatic("ShareImage", (int)scene, data, dataThumb);
#endif
} public void ShareText(WXScene scene, string content)
{
#if UNITY_ANDROID
AndroidJavaClass utils = new AndroidJavaClass(shareUtils);
utils.CallStatic("ShareText", (int)scene, content);
#endif
} public void ShareWebPage(WXScene scene, string url, string title, string content, byte[] thumb)
{
#if UNITY_ANDROID
AndroidJavaClass utils = new AndroidJavaClass(shareUtils);
utils.CallStatic("ShareWebPage", (int)scene, url, title, content, thumb);
#endif
} /// <summary>
/// 是否安装了微信
/// </summary>
/// <returns></returns>
public bool IsWechatInstalled()
{
#if UNITY_ANDROID
AndroidJavaClass utils = new AndroidJavaClass(shareUtils);
return utils.CallStatic<bool>("IsWechatInstalled");
#else
return false;
#endif
}
}
现在,亮点来了,即使上面全部正确,依然有可能出现点击分享打不开界面然后还不报错的情况(这可能是最坑的地方了,让人完全摸不着头脑)
出现这种情况的原因有好几种:
1、分享的图片的缩略图尺寸很大或者质量很高(PS:明明微信自己给的demo工程中的质量都是100,然而实际使用中缩略图的质量不能用100,博主用的40)
2、分享的图片的缩略图尺寸比例太悬殊,比如100*1000这种。。。
3、之前使用过不同的签名或者包名
4、项目的签名或包名和微信平台上填的不同
1、2两种情况都得改传入的缩略图的尺寸,这里提供一个压缩方法,建议缩略图压到150*150
/// <summary>将图片缩放为指定尺寸</summary>
public static Texture2D SizeTextureBilinear(Texture2D originalTexture, Vector2 size)
{
Texture2D newTexture = new Texture2D(Mathf.CeilToInt(size.x), Mathf.CeilToInt(size.y));
float scaleX = originalTexture.width / size.x;
float scaleY = originalTexture.height / size.y;
int maxX = originalTexture.width - ;
int maxY = originalTexture.height - ;
for (int y = ; y < newTexture.height; y++)
{
for (int x = ; x < newTexture.width; x++)
{
float targetX = x * scaleX;
float targetY = y * scaleY;
int x1 = Mathf.Min(maxX, Mathf.FloorToInt(targetX));
int y1 = Mathf.Min(maxY, Mathf.FloorToInt(targetY));
int x2 = Mathf.Min(maxX, x1 + );
int y2 = Mathf.Min(maxY, y1 + ); float u = targetX - x1;
float v = targetY - y1;
float w1 = ( - u) * ( - v);
float w2 = u * ( - v);
float w3 = ( - u) * v;
float w4 = u * v;
Color color1 = originalTexture.GetPixel(x1, y1);
Color color2 = originalTexture.GetPixel(x2, y1);
Color color3 = originalTexture.GetPixel(x1, y2);
Color color4 = originalTexture.GetPixel(x2, y2);
Color color = new Color(Mathf.Clamp01(color1.r * w1 + color2.r * w2 + color3.r * w3 + color4.r * w4),
Mathf.Clamp01(color1.g * w1 + color2.g * w2 + color3.g * w3 + color4.g * w4),
Mathf.Clamp01(color1.b * w1 + color2.b * w2 + color3.b * w3 + color4.b * w4),
Mathf.Clamp01(color1.a * w1 + color2.a * w2 + color3.a * w3 + color4.a * w4)
);
newTexture.SetPixel(x, y, color); }
}
newTexture.Apply();
return newTexture;
}
第3种情况就恶心了,因为清空微信的缓存也不一定有用,还得卸载微信重装,就博主的测试结果来看,如果其余的问题都解决了之后还是不行,那这是唯一的解决办法
第4种情况按照本文前面的做法就ok
微信分享的坑可能还有很多,不过博主目前就遇到了这些,也耽搁了近一天时间,如果大家还有遇到其他的坑,欢迎留言互相讨论
unity探索者之微信分享所有流程,非第三方插件的更多相关文章
- unity探索者之微信分享回调
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7574561.html 上一遍讲了微信分享的一些坑,然后就忘了回调这事儿了,今天补上 ...
- unity探索者之安卓微信登录,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7666348.html 之前写了两篇关于微信分享的博客,其实微信登录.分享.支付博主 ...
- unity探索者之微信支付,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8404604.html 相比微信的登录和分享功能,微信支付sdk的接入显得相当简单, ...
- unity探索者之支付宝支付,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405044.html 支付宝的sdk接入方式和微信支付比较类似,大部分的工作也基本 ...
- 微信小程序开发——使用第三方插件生成二维码
需求场景: 小程序中指定页面需要根据列表数据生成多张二维码. 实现方案: 鉴于需要生成多张二维码,可以将生成二维码的功能封装到组件中,直接在页面列表循环中调用就好了.也可以给组件添加slot,在页面调 ...
- Unity接入微信登录 微信分享 微信支付 支付宝SDK
你将会学到的unity集成SDK游戏中接入微信支付与支付宝支付游戏中接入微信登录与微信分享 目录 mp4格式,大小2.2GB 扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop13 ...
- Unity接入ShareSDK实现QQ登录和QQ分享、微信分享
原文链接:Unity接入ShareSDK实现QQ登录和QQ分享.微信分享 由于微信登录需要企业审核,我这里就不说明了,有需要的可以去官网看一下文档,和QQ登录比多了一个打包的步骤. 第一步:到官网申请 ...
- 安卓一键分享到qq,微信,微博,官方SDK非第三方
当我们项目中需要集成分享功能时,我们通常会采取一下几个办法: 1.调用系统自带分享 优点:简单快速,几行代码搞定,不需添加任何额外包: 缺点:系统会调出手机内部所有带分享功能的APP,且界面风格跟随系 ...
- 在Unity3D项目中接入ShareSDK实现安卓平台微信分享功能(可使用ShareSDK默认UI或自定义UI)
最近公司的大厅要重做,我协助主程一起制作新大厅和新框架,前面制作的编辑器也派上了用场.等全部功能做完后我会再写一个复盘,这两天主程在忙于写热更新的功能,所以把接入分享SDK功能的任务交给了我,Shar ...
随机推荐
- 【Nginx】并发量太高,Nginx扛不住?这次我错怪Nginx了!!
写在前面 最近,在服务器上搭建了一套压测环境,不为别的,就为压测下Nginx的性能,到底有没有传说中的那么牛逼!具体环境为:11台虚拟机,全部安装CentOS 6.8 64位操作系统,1台安装部署Ng ...
- [leetcode/lintcode 题解] Amazon面试题:连接棒材的最低费用
为了装修新房,你需要加工一些长度为正整数的棒材 sticks. 如果要将长度分别为 X 和 Y 的两根棒材连接在一起,你需要支付 X + Y 的费用. 由于施工需要,你必须将所有棒材连接成一根. 返回 ...
- LevelDB,你好~
LevelDB,你好~ 上篇文章初识:LevelDB介绍了啥是LevelDB,LevelDB有啥特性,以及Linux环境下编译,使用及调试方法. 这篇文章的话,算是LevelDB源码学习的开端吧,主要 ...
- Pycharm远程解释器SFTP开发和调试
转载:https://blog.csdn.net/ll641058431/article/details/53049453 使用PyCharm进行远程开发和调试 你是否经常要在Windows 7或MA ...
- C#winform将dll封装到exe当中
我们在在winform程序时经常会用到外部dll,正常情况下,我的exe运行文件旁就需要这些dll文件相伴,总感觉不爽~~特别是要把软件给别人的时候,如果DLL比较多或者没有放在同一个地方,那麻烦大了 ...
- 数据结构C语言实现----图
邻接表储存结构 /*邻接表的边*/ typedef struct ArcNode { int adjvex; struct ArcNode *next; }ArcNode; /*邻接表的结点*/ ty ...
- Blob分析之Board_Segmentation_Uncalib
* ************************************************************************************************** ...
- luogu P4948 数列求和 推式子 简单数学推导 二项式 拉格朗日插值
LINK:数列求和 每次遇到这种题目都不太会写.但是做法很简单. 终有一天我会成功的. 考虑类似等比数列求和的东西 帽子戏法一下. 设\(f(k)=\sum_{i=1}^ni^ka^i\) 考虑\(a ...
- 6.18 省选模拟赛 树 倍增 LCT
LINK:树 考虑暴力 保存每个版本的父亲 然后暴力向上跳.得分20. 考虑离线 可以离线那么就可以先把树给搞出来 然后考虑求k级祖先 可以倍增求. 如何判断合法 其实要求路径上的边的时间戳<= ...
- 算法图解(python2.7)高清PDF电子书
点击获取提取码:pzhb 内容简介 本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量.书中的前三章将帮助你打下基础,带你学习二分查找.大O表示法. ...