前言

最近做了第一个用​​react-native​​​写的​​app​​,记录下相关第三方插件的配置

关于微信分享,主要用到了这两个库 ​​react-native-wechat-lib​

​react-native-wechat​

其中第一个是在第二个基础上优化的。更新相关微信​SDK​​等

备注:本文使用​​rn​​​版本为​​0.61.5​

步骤

  • 申请微信相关

微信官方网址​​https://open.weixin.qq.com/​​,注册移动应用,填写相关信息,获取到相关到key

其中需要注意到是,安卓需要先生成​​release​​​包,然后使用​​Gen_Signature_Android2.apk​​​获取到​​app​​的签名

安卓​​app​​​包名地址:​​android/app/build.gradle​​​文件中的​​applicationId​​字段

打开安卓获取签名软件,输入包名,会得到一个签名,这就是微信​SDK​​需要的一个东西

react-native集成微信分享记录_微信分享

  • android配置

在​​app/src/main/java/com/companyName/​​​ 下新建​​wxapi​​​文件夹,新增​​WXEntryActivity.java​​​,​​WXPayEntryActivity.java​​文件

内容如下:

​WXEntryActivity.java​​ 文件:

package com.logisticsrn.wxapi; // 你的包名.wxapi

import android.app.Activity;
import android.os.Bundle;
import com.theweflex.react.WeChatModule;

public class WXEntryActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WeChatModule.handleIntent(getIntent());
finish();
}
}

​WXPayEntryActivity.java​​ 文件

package com.logisticsrn.wxapi; // 你的包名.wxapi

import android.app.Activity;
import android.os.Bundle;
import com.theweflex.react.WeChatModule;

public class WXPayEntryActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WeChatModule.handleIntent(getIntent());
finish();
}
}

在​​AndroidManifest.xml​​​添加声明,该文件在 ​​app/src/main/AndroidManifest.xml​

<activity
android:name=".wxapi.WXEntryActivity"
android:label="@string/app_name"
android:exported="true"
/>
<activity
android:name=".wxapi.WXPayEntryActivity"
android:label="@string/app_name"
android:exported="true"
/>

关于微信分享,安卓相关配置就这些,微信支付以后再研究

  • ios配置

先将微信​Libraries​​​ 引入进来,打开​​XCode​​​,点击项目​​Libraries​​,右键添加文件到xx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WidSsQkN-1585826301125)(https://static.ahwgs.cn/blog-img/20200402184644.png)]

我们使用的是​​react-native-wechat-lib​​​,找到依赖下的该包,打开​​ios​​​文件夹,将​​RCTWeChat.xcodeproj​​ 导入进来

react-native集成微信分享记录_微信_02

在工程​​Build Phases ➜ Link Binary With Libraries​​中添加如下几个库

libRCTWeChat.a
libz.tbd
libc++.tbd
libsqlite3.0.tbd
SystemConfiguration.framework
CoreTelephony.framework

react-native集成微信分享记录_微信分享_03

在​​TARGETS​​​ 下项目名 -> ​​info​​​ ,添加我们申请得到的微信​AppId​​​填写在 ​​"URL type"​​​的​​"URL Schema"​​​处,​​ldentifier​​​填写为:​​weixin​

注意:​​weixin​​​对应的值就是微信开放者平台上申请的那个​​key​

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nClT65k7-1585826301127)(https://static.ahwgs.cn/blog-img/20200402185750.png)]

​iOS9​​ 以上,添加 微信白名单

react-native集成微信分享记录_android_04

在项目的​​AppDelegate.m​​​添加以下代码,启动​​[LinkingIOS]​

#import <React/RCTLinkingManager.h>

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
}
  • rn代码中使用

在项目开始文件中,

import * as WeChat from 'react-native-wechat-lib';

WeChat.registerApp(
'appid',
'Universal Links',
);

封装​​wxHandle.js​​处理微信分享逻辑

import * as WeChat from 'react-native-wechat-lib';
import CommonConfig from './config';
import toast from './toast';

/**
* 分享到微信朋友圈
* @param {object} shareMetadata
* return Promise true:成功 false: 失败
*/
export const shareToTimeline = async shareMetadata => {
const defaultShareData = {
title: '应用名',
description: '',
thumbImageUrl: ``, // 缩略图
webpageUrl: '',
scene: 1, // 分享到, 0:会话 1:朋友圈 2:收藏
isRemoveSuffix: true,
};
try {
const isInstalled = await WeChat.isWXAppInstalled();
if (!isInstalled) {
toast('请先安装微信');
return Promise.resolve(false);
}
const metadata = {...defaultShareData, ...shareMetadata};
if (!metadata.isRemoveSuffix) {
metadata.title = cutTitleShort(metadata.title, 30);
}
const res = await WeChat.shareWebpage(metadata);

if (res.errCode === 0) {
// 在分享中取消 也正常返回
toast('分享成功');
return Promise.resolve(false);
}
} catch (e) {
toast('分享失败');
if (e instanceof WeChat.WechatError) {
console.warn(e.stack);
} else {
console.log(e);
}
}
return Promise.resolve(false);
};

/**
* 分享给朋友 对话框
* @param {object} shareMetadata
* return Promise true:成功 false: 失败
*/
export const shareToSession = async shareMetadata => {
const defaultShareData = {
title: '应用名',
description: '',
thumbImageUrl: '', // 缩略图
webpageUrl: '',
scene: 0, // 分享到, 0:会话 1:朋友圈 2:收藏
isRemoveSuffix: false,
};
try {
const isInstalled = await WeChat.isWXAppInstalled();
if (!isInstalled) {
toast('请先安装微信');
return Promise.resolve(false);
}
const metadata = {...defaultShareData, ...shareMetadata};
if (!metadata.isRemoveSuffix) {
metadata.title = cutTitleShort(metadata.title, 22);
}
const res = await WeChat.shareWebpage(metadata);
if (res.errCode === 0) {
// 分享成功
toast('分享成功');
return Promise.resolve(true);
}
} catch (e) {
toast('分享失败');
if (e instanceof WeChat.WechatError) {
console.warn(e.stack);
} else {
console.log(e);
}
}
return Promise.resolve(false);
};

/**
* 分享出去的标题不能太长
* @param {string} titleString
* @param {number} maxStrLength
* @param isAddSuffix
*/
const cutTitleShort = (titleString, maxStrLength) => {
if (!titleString) {
return '应用名';
}
let newStr;
if (titleString.length > maxStrLength - 7) {
newStr = `${titleString.substring(0, maxStrLength - 7)}...【应用名】`;
} else {
newStr = `${titleString}【应用名】`;
}
return newStr;
};

/**
* 分享图片到微信
* @param {string} imageUrl
* @param {number} scene
*/
export const sharePicToWechat = async shareMetadata => {
const defaultShareData = {
imageUrl:'',
scene: 0,
};
try {
const isInstalled = await WeChat.isWXAppInstalled();
if (!isInstalled) {
toast('请先安装微信');
return Promise.resolve(false);
}
const metadata = {...defaultShareData, ...shareMetadata};
const res = await WeChat.shareImage(metadata);
if (res.errCode === 0) {
// 分享成功
toast('分享成功');
return Promise.resolve(true);
}
} catch (e) {
toast('分享失败');
if (e instanceof WeChat.WechatError) {
console.warn(e.stack);
} else {
console.log(e);
}
}
return Promise.resolve(false);
};

关于

微信分享还是很简单的,具体的一些API可以参考微信官方文档与插件文档,这里整理的是微信分享相关,后面做到支付再补充支付项目内容