第一次写主要是分享一下Android端实现微信小程序分享过程中踩的一些坑。自己Google和百度了好久,分享问题也算是解决了,但是还是有些问题没有很好的答案,所以自己总结一下。很多人在RN端做微信分享的时候使用的是yorkie/react-native-wechat这个第三方库,这个库npm的最新版本没有小程序分享功能,下面就介绍两种解决方法。

1、在原来的react-native-wechat上进行修改

1. 接入微信开发平台官方文档的SDK
在 Android端上使用AS(Android studio)上打开,直接在react-native-wechat的app的build.gradle中引入

dependencies {compile 'com.facebook.react:react-native:+'compile files('libs/libammsdk.jar')compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

2. 在原生的WeChatModule中进行修改
在WeChatModule.java中引入

import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.tencent.mm.opensdk.constants.Build;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
import com.tencent.mm.opensdk.modelmsg.WXFileObject;
import com.tencent.mm.opensdk.modelmsg.WXImageObject;
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage;
import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram;
import com.tencent.mm.opensdk.modelmsg.WXMiniProgramObject;
import com.tencent.mm.opensdk.modelmsg.WXMusicObject;
import com.tencent.mm.opensdk.modelmsg.WXTextObject;
import com.tencent.mm.opensdk.modelmsg.WXVideoObject;
import com.tencent.mm.opensdk.modelmsg.WXWebpageObject;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.modelpay.PayResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.tencent.mm.opensdk.utils.Log;

3.修改isWXAppSupportApi方法:

@ReactMethodpublic void isWXAppSupportApi(String supportApi,Callback callback) {if (api == null) {callback.invoke(NOT_REGISTERED);return;}int supportSDKINT = Build.PAY_SUPPORTED_SDK_INT;switch (supportApi) {case "SDK_INT":supportSDKINT = Build.SDK_INT;break;case "MIN_SDK_INT":supportSDKINT = Build.MIN_SDK_INT;break;case "CHECK_TOKEN_SDK_INT":supportSDKINT = Build.CHECK_TOKEN_SDK_INT;break;case "TIMELINE_SUPPORTED_SDK_INT":supportSDKINT = Build.TIMELINE_SUPPORTED_SDK_INT;break;case "EMOJI_SUPPORTED_SDK_INT":supportSDKINT = Build.EMOJI_SUPPORTED_SDK_INT;break;case "MUSIC_DATA_URL_SUPPORTED_SDK_INT":supportSDKINT = Build.MUSIC_DATA_URL_SUPPORTED_SDK_INT;break;case "PAY_SUPPORTED_SDK_INT":supportSDKINT = Build.PAY_SUPPORTED_SDK_INT;break;case "OPENID_SUPPORTED_SDK_INT":supportSDKINT = Build.OPENID_SUPPORTED_SDK_INT;break;case "FAVORITE_SUPPPORTED_SDK_INT":supportSDKINT = Build.FAVORITE_SUPPPORTED_SDK_INT;break;case "MESSAGE_ACTION_SUPPPORTED_SDK_INT":supportSDKINT = Build.MESSAGE_ACTION_SUPPPORTED_SDK_INT;break;case "SCAN_QRCODE_AUTH_SUPPORTED_SDK_INT":supportSDKINT = Build.SCAN_QRCODE_AUTH_SUPPORTED_SDK_INT;break;case "MINIPROGRAM_SUPPORTED_SDK_INT":supportSDKINT = Build.MINIPROGRAM_SUPPORTED_SDK_INT;break;case "VIDEO_FILE_SUPPORTED_SDK_INT":supportSDKINT = Build.VIDEO_FILE_SUPPORTED_SDK_INT;break;case "SUBSCRIBE_MESSAGE_SUPPORTED_SDK_INT":supportSDKINT = Build.SUBSCRIBE_MESSAGE_SUPPORTED_SDK_INT;break;case "LAUNCH_MINIPROGRAM_SUPPORTED_SDK_INT":supportSDKINT = Build.LAUNCH_MINIPROGRAM_SUPPORTED_SDK_INT;break;case "CHOOSE_INVOICE_TILE_SUPPORT_SDK_INT":supportSDKINT = Build.CHOOSE_INVOICE_TILE_SUPPORT_SDK_INT;break;case "INVOICE_AUTH_INSERT_SDK_INT":supportSDKINT = Build.INVOICE_AUTH_INSERT_SDK_INT;break;case "NON_TAX_PAY_SDK_INT":supportSDKINT = Build.NON_TAX_PAY_SDK_INT;break;case "PAY_INSURANCE_SDK_INT":supportSDKINT = Build.PAY_INSURANCE_SDK_INT;break;case "SUBSCRIBE_MINI_PROGRAM_MSG_SUPPORTED_SDK_INT":supportSDKINT = Build.SUBSCRIBE_MINI_PROGRAM_MSG_SUPPORTED_SDK_INT;break;case "OFFLINE_PAY_SDK_INT":supportSDKINT = Build.OFFLINE_PAY_SDK_INT;break;case "SEND_TO_SPECIFIED_CONTACT_SDK_INT":supportSDKINT = Build.SEND_TO_SPECIFIED_CONTACT_SDK_INT;break;case "OPEN_BUSINESS_WEBVIEW_SDK_INT":supportSDKINT = Build.OPEN_BUSINESS_WEBVIEW_SDK_INT;break;}boolean isWXAppSupportAPI = api.getWXAppSupportAPI() >= supportSDKINT;callback.invoke(null, isWXAppSupportAPI);}

4.修改_share方法(添加判断type是否等于miniProgram)

    private void _share(final int scene, final ReadableMap data, final Bitmap thumbImage, final Callback callback) {if (!data.hasKey("type")) {callback.invoke(INVALID_ARGUMENT);return;}String type = data.getString("type");WXMediaMessage.IMediaObject mediaObject = null;if (type.equals("news")) {mediaObject = _jsonToWebpageMedia(data);} else if (type.equals("text")) {mediaObject = _jsonToTextMedia(data);} else if (type.equals("imageUrl") || type.equals("imageResource")) {__jsonToImageUrlMedia(data, new MediaObjectCallback() {@Overridepublic void invoke(@Nullable WXMediaMessage.IMediaObject mediaObject) {if (mediaObject == null) {callback.invoke(INVALID_ARGUMENT);} else {WeChatModule.this._share(scene, data, thumbImage, mediaObject, callback);}}});return;} else if (type.equals("imageFile")) {__jsonToImageFileMedia(data, new MediaObjectCallback() {@Overridepublic void invoke(@Nullable WXMediaMessage.IMediaObject mediaObject) {if (mediaObject == null) {callback.invoke(INVALID_ARGUMENT);} else {WeChatModule.this._share(scene, data, thumbImage, mediaObject, callback);}}});return;} else if (type.equals("video")) {mediaObject = __jsonToVideoMedia(data);} else if (type.equals("audio")) {mediaObject = __jsonToMusicMedia(data);} else if (type.equals("file")) {mediaObject = __jsonToFileMedia(data);} else if (type.equals("miniProgram")) {mediaObject = __jsonToMiniProgramMedia(data);}if (mediaObject == null) {callback.invoke(INVALID_ARGUMENT);} else {_share(scene, data, thumbImage, mediaObject, callback);}}

5.增加方法__jsonToMiniProgramMedia

  private WXMiniProgramObject __jsonToMiniProgramMedia(ReadableMap data) {if (!data.hasKey("userName")) {return null;}WXMiniProgramObject miniProgramObj = new WXMiniProgramObject();miniProgramObj.webpageUrl = data.getString("webpageUrl"); // 兼容低版本的网页链接miniProgramObj.userName = data.getString("userName");    // 小程序原始idminiProgramObj.path = data.getString("path");         //小程序页面路径miniProgramObj.miniprogramType = data.getInt("miniProgramType");return miniProgramObj;return miniProgramObj;}

6.修改小程序分享图片大小
由于第三方库不支持小程序分享,分享小程序的图片会呈现分享网页时的尺寸是以1:1显示,分享出去图片显示模糊
修改图片尺寸为微信官方提供的尺寸比例(4:5)

private void _share(final int scene, final ReadableMap data, final Callback callback) {}
private void _share(final int scene, final ReadableMap data, final Callback callback) {...if(data.getString("type").equals("miniProgram")){this._getImage(uri, new ResizeOptions(400, 500), new ImageCallback() {@Overridepublic void invoke(@Nullable Bitmap bitmap) {WeChatModule.this._share(scene, data, bitmap, callback);}});}else{this._getImage(uri, new ResizeOptions(100, 100), new ImageCallback() {@Overridepublic void invoke(@Nullable Bitmap bitmap) {WeChatModule.this._share(scene, data, bitmap, callback);}});}}

7. 在js端调用

WeChat.isWXAppInstalled().then((isInstalled) => {if (isInstalled) {WeChat.shareToSession({type: 'miniProgram',title: title,description: description,webpageUrl: webpageUrl,thumbImage: weixinMiniProgramThumbImage,miniProgramType: 0, //分享小程序的版本(0-正式,1-开发,2-体验)userName: '',//小程序IDpath: '/pages/index?id=123' //小程序页面路径}).then((res) => {//成功回调if (res.errCode === 0) {Toast.show("分享成功")}}).catch((error => {console.log(error.message)}))} else {Toast.show('没有安装微信软件,请您安装微信之后重试!')console.log('没有安装微信软件,请您安装微信之后重试!')}})
  1. 增加了 检查列表 功能。

2.覆盖/node_modules/react-native-wechat目录下所有代码

下载puti94/react-native-wechat的代码。虽然我没有使用过,毕竟需要重新配置,但是原理也是差不多,GitHub也有详细的教程,在这里就不详细讲解了。

第一次写博客,写的不是很好,哪里有问题,或是不详细有错误,请多多包涵,可以在下面留言,我看到后会及时恢复的,共同进步。

react-native-wechat分享微信小程序的彩坑相关推荐

  1. 友盟分享小程序_iOS分享微信小程序

    最近项目中遇到了APP分享微信小程序,记录下来问题,希望能帮助到需要的人 项目中的分享集成的是第三方的友盟,我看了下微信官方的sdk和友盟的小程序分享差不多,于是,就先罗列下友盟的分享 1.首先在微信 ...

  2. android 分享小程序到微信,Android 分享微信小程序之图片优化

    小菜上周接入了微信分享小程序的入口,基本功能实现都没问题,有需要的朋友可以了解一下 Android 分享微信小程序失败二三事,虽然功能都正常,但整体测试发现图片展示效果不佳.于是小菜整理了一个简单的小 ...

  3. php欢迎界面代码,分享微信小程序欢迎界面开发的实例代码

    这篇文章主要分享微信小程序欢迎界面开发的实例代码的相关资料,这里实现欢迎界面的简单实例和实现代码及实现效果图,需要的朋友可以参考下 微信小程序 欢迎界面 市面上大多数的app都会有一个欢迎界面,下面将 ...

  4. WeChat applet 微信小程序(1)

    微信小程序 Wechat applet 微信小程序开发工具下载网址 https://developers.weixin.qq.com/miniprogram/dev/devtools/download ...

  5. iOS分享微信小程序无反应、失败;iOS多种分享形式(以微信为例:链接+图片+小程序)

    背景 先交代下背景:最近一个需求,根据接口返回数据来控制分享形式,即传入分享类别(比如文章.音频.邀请好友下载应用等).分享平台(比如微信好友.朋友圈等).分享类别所对应的id(比如文章id.音频id ...

  6. 分享微信小程序资讯类仿LOL盒子开发

    分享微信小程序资讯类仿LOL盒子开发 一.主要功能 联盟盒子微信小程序功能分为管理员和非管理员功能.系统拥有多个非管理员用户,管理员用户仅有一个角色,对于管理员而言,管理员一般拥有操作用户信息比如更改 ...

  7. android分享分享到朋友圈图片,android app分享微信小程序(包含封面网络图片)+图片到朋友圈...

    A 分享微信小程序效果: image.png 实现代码 //第一步通过url拿网络图片并生成bitmap val path = "分享小程序某个界面包含传参数" if (!Text ...

  8. 微信小程序初步入坑指南

    微信小程序初步入坑小指南 安装工具 developers.weixin.qq.com/miniprogram- 打开链接下载小程序云开发 app.json 为json格式的文件,为一个配置文件,属于全 ...

  9. 微信小程序继续入坑指南

    微信小程序继续入坑指南 wxml 类似于html 感觉和ejs灰常的相似 数据绑定 js Page({data: {message: "hello world"} }) wxml ...

最新文章

  1. Web 服务器 之 简易WWW服务器的架设
  2. window用ssh连接本机虚拟机中的ubuntu
  3. 统一建模语言UML轻松入门系列
  4. kafka分区与分组原理_Kafka工作原理
  5. 【Spark】Spark调优 资源调优
  6. spring cloud 资源
  7. 将Maven集成到idea中并创建第一个Maven项目
  8. 按比例算出成绩 用c语言,Excel按指定比例生成学生总分,并迭代计算出各学科分数...
  9. 其实,API 编程并不难!
  10. py脚本实现用例执行html报告,pytest文档7-pytest-html生成html报告
  11. 不满当免费劳力,NPM 热门库 “colors” 和 “faker” 的作者设无限循环
  12. 内外网同时运行路由设置
  13. java系统课程设计报告_201621123063《JAVA课程设计报告》
  14. bigmp4.com AI 视频无损放大高清补帧工具
  15. unity通过点击按钮获取手机验证码
  16. win10启动虚拟机蓝屏的一种解决方法
  17. LeetCode 24.两两交换链表中的节点 C语言
  18. 对一个数组排序之后求相邻数的最大差值
  19. 如何按照规格型号表挑选合适的快速接头
  20. 如何做好项目经理的黑色幽默313句

热门文章

  1. 2.IT-解决方案-2-FAX
  2. oracle实验生鲜水果团购系统,水果蔬菜社区团购系统怎么做?如何运营
  3. 大学毕业十年后(转)
  4. 传奇--多么怀念的游戏!
  5. MestReNove自己入门学习过程记录
  6. hate vs hatred
  7. Census立体匹配算法算法的Python实现
  8. 【k8s】——Kubernetes知识盘点
  9. 动态规划生产存储matlab,动态规划方法的matlab实现及其应用
  10. HTML5 三年二班周杰伦