第一次写主要是分享一下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. 多种方式测量AMP328频率响应
  2. tcpip卷一二三区别_八年级物理期末试卷(内附初三期末卷)
  3. 【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )
  4. Spring框架—IoC容器
  5. 深度探索I/O完成端口
  6. Dijkstra-解决最短路径问题
  7. Java反射机制概念及应用场景
  8. flash动画制作作品_flash施工动画制作应该展现哪些内容
  9. JPA + Hibernate + PostgreSQL + Maven基本配置示例
  10. X64-CL iPro 采集卡OC-64EO-IPRO0简介
  11. 浅谈UWB室内定位(三)_vortex_新浪博客
  12. Lingo软件的基本语法
  13. IntelliJ IDEA2018版下载安装教程以及详细步骤
  14. idea Translation 使用有道翻译
  15. 1. Cloudcraft
  16. matlab 查找字符串数组,Matlab之字符串数组查找
  17. PHP使用Composer配置微信支付SDK
  18. 深度增强学习:走向通用人工智能之路
  19. 【JS数据结构与算法】双向链表(DoublylinkedList)封装及其方法
  20. 计算机职业生涯规划书一万字,大学生职业规划一万字

热门文章

  1. 每年降本100万元+!企业研发管理该怎么做?
  2. 微信小程序中view和html中div,WXML:微信小程序版HTML
  3. HTML基础语法入门
  4. PC的足迹--新的篇章《二》
  5. 在线投稿系统各种稿件状态大剖析
  6. uniapp怎么使用canvas把两张图片合并成一张图片
  7. ArcGIS距离分析—规划最低成本路径
  8. linux下键盘输入有粘滞感,linux怎么取消粘滞键
  9. 狄克斯特拉--最短路径问题
  10. 鼠标滚轮失灵了,最后换了鼠标编码器,才算修好。