Table of Contents
Build
React-Native bridge static library for WeChat SDK which requires:
And react-native-wechat has the following tracking data in open source world:
type | badge |
---|
NPM | |
Dependency | |
Downloads | |
Linking Steps
Before using this library to work with your app, you should follow the below steps to link this library with
your app project, if there is something that not working, please check the list here.
Linking iOS
-
Link RCTWeChat
library from your node_modules/react-native-wechat/ios
folder like react-native's
Linking Libraries iOS Guidance, Note: Don't forget to add it to "Build Phases" of your target project.
-
Add the following libraries to your "Link Binary with Libraries":
SystemConfiguration.framework
CoreTelephony.framework
libsqlite3.0
libc++
libz
-
Add "URL Schema" as your app id for "URL type" in Targets
> info
, See the following screenshot for the view on your XCode
-
Only for iOS 9, add wechat
and weixin
into LSApplicationQueriesSchemes
in Targets
> info
> Custom iOS Target Properties
. Or edit Info.plist
then add:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
<string>wechat</string>
</array>
-
Code the following in AppDelegate.m
of your project to enable [LinkingIOS]
#import "../Libraries/LinkingIOS/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];
}
Linking Android with Gradle
-
Add following lines into android/settings.gradle
include ':RCTWeChat'
project(':RCTWeChat').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-wechat/android')
-
Add following lines into your android/app/build.gradle
in section dependencies
dependencies {
compile project(':RCTWeChat') // Add this line only.
}
-
Add following lines into MainActivity.java
or MainApplication.java
:
import com.theweflex.react.WeChatPackage;
...
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new WeChatPackage()
);
}
-
Create a package named 'wxapi' in your application package and a class named 'WXEntryActivity' in it.
This is required to get authorization and sharing response from wechat.
package your.package.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();
}
}
-
(Optional) Create a package named 'wxapi' in your application package and a class named 'WXPayEntryActivity'
in it. This is required to get payment response from WeChat.
package your.package.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();
}
}
-
Add activity declare in your AndroidManifest.xml
<manifest>
<application>
<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"
/>
</application>
</manifest>
-
Add these lines to 'proguard-rules.pro':
-keep class com.tencent.mm.sdk.** {
*;
}
API Documentation
react-native-wechat supports the following methods to get information and do something functions
with WeChat app.
registerApp(appid)
You should call this function in global, calling over twice would throw an error.
componentDidMount (){
wechat.registerApp('your appid')
}
- {String}
appid
the appid you get from WeChat dashboard - returns {Promise}
registerAppWithDescription(appid, appdesc)
Only available on iOS.
- {String}
appid
the appid you get from WeChat dashboard - {String}
appdesc
the description of your app - returns {Promise}
isWXAppInstalled()
Check if wechat installed in this app.
- returns {Promise} Contain the result.
isWXAppSupportApi()
Check if wechat support open url.
- returns {Promise} Contain the result.
getApiVersion()
Get api version of WeChat SDK.
- returns {Promise} Contain the result.
openWXApp()
Open WeChat app with an optional callback argument.
sendAuthRequest([scope[, state]])
Send authentication request, namely login.
- {Array|String}
scope
Scopes of auth request. - {String}
state
the state of OAuth2 - returns {Promise}
And it returns:
name | type | description |
---|
errCode | Number | |
errStr | String | Error message if any error occurred |
openId | String | |
code | String | Authorization code |
url | String | The URL string |
lang | String | The user language |
country | String | The user country |
shareToTimeline(data)
Share a message to timeline (朋友圈).
- {Object}
data
contain the message to send
- {String}
thumbImage
Thumb image of the message, which can be a uri or a resource id. - {String}
type
Type of this message. Can be {news|text|imageUrl|imageFile|imageResource|video|audio|file} - {String}
webpageUrl
Required if type equals news
. The webpage link to share. - {String}
imageUrl
Provide a remote image if type equals image
. - {String}
videoUrl
Provide a remote video if type equals video
. - {String}
musicUrl
Provide a remote music if type equals audio
. - {String}
filePath
Provide a local file if type equals file
. - {String}
fileExtension
Provide the file type if type equals file
.
And returns:
name | type | description |
---|
errCode | Number | 0 if authorization successed |
errStr | String | Error message if any error occurred |
These example code need 'react-native-chat' and 'react-native-fs' plugin.
import * as WeChat from 'react-native-wechat';
import fs from 'react-native-fs';
let resolveAssetSource = require('resolveAssetSource');
try {
let result = await WeChat.shareToTimeline({
type: 'text',
description: 'hello, wechat'
});
console.log('share text message to time line successful:', result);
} catch (e) {
if (e instanceof WeChat.WechatError) {
console.error(e.stack);
} else {
throw e;
}
}
try {
let result = await WeChat.shareToTimeline({
type: 'imageUrl',
title: 'web image',
description: 'share web image to time line',
mediaTagName: 'email signature',
messageAction: undefined,
messageExt: undefined,
imageUrl: 'http://www.ncloud.hk/email-signature-262x100.png'
});
console.log('share image url to time line successful:', result);
} catch (e) {
if (e instanceof WeChat.WechatError) {
console.error(e.stack);
} else {
throw e;
}
}
try {
let rootPath = fs.DocumentDirectoryPath;
let savePath = rootPath + '/email-signature-262x100.png';
console.log(savePath);
await fs.downloadFile('http://www.ncloud.hk/email-signature-262x100.png', savePath);
let result = await WeChat.shareToTimeline({
type: 'imageFile',
title: 'image file download from network',
description: 'share image file to time line',
mediaTagName: 'email signature',
messageAction: undefined,
messageExt: undefined,
imageUrl: "file://" + savePath
});
console.log('share image file to time line successful:', result);
} catch (e) {
if (e instanceof WeChat.WechatError) {
console.error(e.stack);
} else {
throw e;
}
}
try {
let imageResource = require('./email-signature-262x100.png');
let result = await WeChat.shareToTimeline({
type: 'imageResource',
title: 'resource image',
description: 'share resource image to time line',
mediaTagName: 'email signature',
messageAction: undefined,
messageExt: undefined,
imageUrl: resolveAssetSource(imageResource).uri
});
console.log('share resource image to time line successful', result);
}
catch (e) {
if (e instanceof WeChat.WechatError) {
console.error(e.stack);
} else {
throw e;
}
}
try {
let rootPath = fs.DocumentDirectoryPath;
let fileName = 'signature_method.doc';
let savePath = rootPath + '/' + fileName;
await fs.downloadFile('https://open.weixin.qq.com/zh_CN/htmledition/res/assets/signature_method.doc', savePath);
let result = await WeChat.shareToSession({
type: 'file',
title: fileName,
description: 'share word file to chat session',
mediaTagName: 'word file',
messageAction: undefined,
messageExt: undefined,
filePath: savePath,
fileExtension: '.doc'
});
console.log('share word file to chat session successful', result);
} catch (e) {
if (e instanceof WeChat.WechatError) {
console.error(e.stack);
} else {
throw e;
}
}
try {
let rootPath = fs.ExternalDirectoryPath;
let fileName = 'signature_method.doc';
let savePath = rootPath + '/' + fileName;
await fs.downloadFile('https://open.weixin.qq.com/zh_CN/htmledition/res/assets/signature_method.doc', savePath);
let result = await WeChat.shareToSession({
type: 'file',
title: fileName,
description: 'share word file to chat session',
mediaTagName: 'word file',
messageAction: undefined,
messageExt: undefined,
filePath: savePath,
fileExtension: '.doc'
});
console.log('share word file to chat session successful', result);
}
catch (e) {
if (e instanceof WeChat.WechatError) {
console.error(e.stack);
} else {
throw e;
}
}
shareToSession(data)
Similar to shareToTimeline
but send message to a friend or a groups.
pay(data)
Create a request to proceeding payment.
const result = await WeChat.pay(
{
partnerId: '',
prepayId: '',
nonceStr: '',
timeStamp: '',
package: '',
sign: ''
}
);
It returns an object like this:
name | type | description |
---|
errCode | Number | 0 if authorization successed |
errStr | String | Error message if any error occurred |
addListener(eventType, listener[, context])
Adds a listener to be invoked when events of the specified type are emitted. An optional calling context may be provided.
Return a object like {remove: function}
which can be used to remove this listener.
once(eventType, listener[, context])
Similar to addListener, except that the listener is removed after it is invoked once.
removeAllListeners()
Removes all of the registered listeners, including those registered as listener maps.
Installation
$ npm install react-native-wechat --save
Who Use It
Authors
License
MIT @ WeFlex, Inc