一、android配置
1、下载QQ互联sdk
sdk下载
2、在android/app下新建libs文件夹,将sdk放入文件夹内
3、在android/app/build.gradle中添加如下:
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.facebook.react:react-native:+"
compile files('libs/open_sdk_r2973327_lite.jar') //添加此处,引入sdk
......
}
4、在android/app/src/main/java/com/项目文件夹里面创建qq文件夹,并创建QQModule.java,代码如下:
package com.test.qq; // test改成你的包名
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.app.Activity;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.RCTNativeAppEventEmitter;
import com.tencent.connect.common.Constants;
import com.tencent.connect.share.QQShare;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;
import org.json.JSONObject;
import java.util.Date;
/**
* Created by tdzl2_000 on 2015-10-10.
*
* Modified by Renguang Dong on 2016-05-25.
*/
public class QQModule extends ReactContextBaseJavaModule implements IUiListener, ActivityEventListener {
private String appId;
private Tencent api;
private final static String INVOKE_FAILED = "QQ API invoke returns false.";
private boolean isLogin;
private static final String RCTQQShareTypeNews = "news";
private static final String RCTQQShareTypeImage = "image";
private static final String RCTQQShareTypeText = "text";
private static final String RCTQQShareTypeVideo = "video";
private static final String RCTQQShareTypeAudio = "audio";
private static final String RCTQQShareType = "type";
private static final String RCTQQShareText = "text";
private static final String RCTQQShareTitle = "title";
private static final String RCTQQShareDescription = "description";
private static final String RCTQQShareWebpageUrl = "webpageUrl";
private static final String RCTQQShareImageUrl = "imageUrl";
private static final int SHARE_RESULT_CODE_SUCCESSFUL = 0;
private static final int SHARE_RESULT_CODE_FAILED = 1;
private static final int SHARE_RESULT_CODE_CANCEL = 2;
public QQModule(ReactApplicationContext context) {
super(context);
ApplicationInfo appInfo = null;
try {
appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
throw new Error(e);
}
if (!appInfo.metaData.containsKey("QQ_APPID")){
throw new Error("meta-data QQ_APPID not found in AndroidManifest.xml");
}
this.appId = appInfo.metaData.get("QQ_APPID").toString();
}
@Override
public void initialize() {
super.initialize();
if (api == null) {
api = Tencent.createInstance(appId, getReactApplicationContext().getApplicationContext());
}
getReactApplicationContext().addActivityEventListener(this);
}
@Override
public void onCatalystInstanceDestroy() {
if (api != null){
api = null;
}
getReactApplicationContext().removeActivityEventListener(this);
super.onCatalystInstanceDestroy();
}
@Override
public String getName() {
return "RCTQQAPI";
}
@ReactMethod
public void isQQInstalled(Promise promise) {
if (api.isSupportSSOLogin(getCurrentActivity())) {
promise.resolve(true);
}
else {
promise.reject("not installed");
}
}
@ReactMethod
public void isQQSupportApi(Promise promise) {
if (api.isSupportSSOLogin(getCurrentActivity())) {
promise.resolve(true);
}
else {
promise.reject("not support");
}
}
@ReactMethod
public void login(String scopes, Promise promise){
this.isLogin = true;
if (!api.isSessionValid()){
api.login(getCurrentActivity(), scopes == null ? "get_simple_userinfo" : scopes, this);
promise.resolve(null);
} else {
promise.reject(INVOKE_FAILED);
}
}
@ReactMethod
public void shareToQQ(final ReadableMap data, final Promise promise){
UiThreadUtil.runOnUiThread(new Runnable() {
@Override
public void run() {
_shareToQQ(data, 0);
promise.resolve(null);
}
});
}
@ReactMethod
public void shareToQzone(final ReadableMap data, final Promise promise)
{
UiThreadUtil.runOnUiThread(new Runnable() {
@Override
public void run() {
_shareToQQ(data, 1);
promise.resolve(null);
}
});
}
private void _shareToQQ(ReadableMap data, int scene) {
this.isLogin = false;
Bundle bundle = new Bundle();
if (data.hasKey(RCTQQShareTitle)){
bundle.putString(QQShare.SHARE_TO_QQ_TITLE, data.getString(RCTQQShareTitle));
}
if (data.hasKey(RCTQQShareDescription)){
bundle.putString(QQShare.SHARE_TO_QQ_SUMMARY, data.getString(RCTQQShareDescription));
}
if (data.hasKey(RCTQQShareWebpageUrl)){
bundle.putString(QQShare.SHARE_TO_QQ_TARGET_URL, data.getString(RCTQQShareWebpageUrl));
}
if (data.hasKey(RCTQQShareImageUrl)){
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, data.getString(RCTQQShareImageUrl));
}
if (data.hasKey("appName")){
bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, data.getString("appName"));
}
String type = RCTQQShareTypeNews;
if (data.hasKey(RCTQQShareType)) {
type = data.getString(RCTQQShareType);
}
if (type.equals(RCTQQShareTypeNews)){
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
} else if (type.equals(RCTQQShareTypeImage)){
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, data.getString(RCTQQShareImageUrl));
} else if (type.equals(RCTQQShareTypeAudio)) {
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_AUDIO);
if (data.hasKey("flashUrl")){
bundle.putString(QQShare.SHARE_TO_QQ_AUDIO_URL, data.getString("flashUrl"));
}
} else if (type.equals("app")){
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_APP);
}
Log.e("QQShare", bundle.toString());
if (scene == 0 ) {
// Share to QQ.
bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE);
api.shareToQQ(getCurrentActivity(), bundle, this);
}
else if (scene == 1) {
// Share to Qzone.
bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
api.shareToQQ(getCurrentActivity(), bundle, this);
}
}
private String _getType() {
return (this.isLogin?"QQAuthorizeResponse":"QQShareResponse");
}
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
Tencent.onActivityResultData(requestCode, resultCode, data, this);
}
public void onNewIntent(Intent intent){
}
@Override
public void onComplete(Object o) {
WritableMap resultMap = Arguments.createMap();
if (isLogin) {
resultMap.putString("type", "QQAuthorizeResponse");
try {
JSONObject obj = (JSONObject) (o);
resultMap.putInt("errCode", 0);
resultMap.putString("openid", obj.getString(Constants.PARAM_OPEN_ID));
resultMap.putString("access_token", obj.getString(Constants.PARAM_ACCESS_TOKEN));
resultMap.putString("oauth_consumer_key", this.appId);
resultMap.putDouble("expires_in", (new Date().getTime() + obj.getLong(Constants.PARAM_EXPIRES_IN)));
} catch (Exception e){
WritableMap map = Arguments.createMap();
map.putInt("errCode", Constants.ERROR_UNKNOWN);
map.putString("errMsg", e.getLocalizedMessage());
getReactApplicationContext()
.getJSModule(RCTNativeAppEventEmitter.class)
.emit("QQ_Resp", map);
}
} else {
resultMap.putString("type", "QQShareResponse");
resultMap.putInt("errCode", SHARE_RESULT_CODE_SUCCESSFUL);
resultMap.putString("message", "Share successfully.");
}
this.resolvePromise(resultMap);
}
@Override
public void onError(UiError uiError) {
WritableMap resultMap = Arguments.createMap();
resultMap.putInt("errCode", SHARE_RESULT_CODE_FAILED);
resultMap.putString("message", "Share failed." + uiError.errorDetail);
this.resolvePromise(resultMap);
}
@Override
public void onCancel() {
WritableMap resultMap = Arguments.createMap();
resultMap.putInt("errCode", SHARE_RESULT_CODE_CANCEL);
resultMap.putString("message", "Share canceled.");
this.resolvePromise(resultMap);
}
private void resolvePromise(ReadableMap resultMap) {
getReactApplicationContext()
.getJSModule(RCTNativeAppEventEmitter.class)
.emit("QQ_Resp", resultMap);
}
}
5、在qq文件夹内创建QQPackage.java,代码如下:
package com.test.qq; // test改成你的包名
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Created by tdzl2_000 on 2015-10-10.
*/
public class QQPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Arrays.asList(new NativeModule[]{
// Modules from third-party
new QQModule(reactContext),
});
}
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
6、在MainApplication.java中添加如下代码:
import com.test.qq.QQPackage; //添加此处 test改为你的包名
@Override
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
packages.add(new QQPackage()); //添加此处
return packages;
}
7、在AndroidManifest.xml添加如下:
<application>
<!-- qq声明 -->
<meta-data android:name="QQ_APPID" android:value="此处为你的appId"/>
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="此处为tencent+你的appId" />
</intent-filter>
</activity>
<activity android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
</application>
二、ios配置
1、将sdk放入ios目录下,通过xcode将sdk添加到项目工程中
2、在工程target的Build Phases->Link Binary with Libraries中加入libRCTQQAPI.a、libiconv.tbd、libsqlite3.tbd、libz.tbd、libc++.tbd
3、在 Build Settings->Search Paths->Framework Search Paths(如果你找不到Framework Search Paths,请注意选择Build Settings下方的All,而不是Basic) 中加入路径 $(SRCROOT)/…/ios/RCTQQAPI
4、在 Build Settings->Link->Other Linker Flags 中加入 -framework “TencentOpenAPI”
5、在工程plist文件中加入qq白名单:(ios9以上必须) 请以文本方式打开Info.plist,在其中添加
<key>LSApplicationQueriesSchemes</key>
<array>
<!-- QQ、Qzone URL Scheme 白名单-->
<string>mqqapi</string>
<string>mqq</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqqconnect</string>
<string>mqqopensdkdataline</string>
<string>mqqopensdkgrouptribeshare</string>
<string>mqqopensdkfriend</string>
<string>mqqopensdkapi</string>
<string>mqqopensdkapiV2</string>
<string>mqqopensdkapiV3</string>
<string>mqzoneopensdk</string>
<string>wtloginmqq</string>
<string>wtloginmqq2</string>
<string>mqqwpa</string>
<string>mqzone</string>
<string>mqzonev2</string>
<string>mqzoneshare</string>
<string>wtloginqzone</string>
<string>mqzonewx</string>
<string>mqzoneopensdkapiV2</string>
<string>mqzoneopensdkapi19</string>
<string>mqzoneopensdkapi</string>
<string>mqzoneopensdk</string>
</array>
6、通过xcode在项目工程下创建RCTQQAPI文件夹,并在文件夹内创建RCTQQAPI.h文件,代码如下:
#if __has_include(<React/RCTBridge.h>)
#import <React/RCTBridgeModule.h>
#else
#import "RCTBridgeModule.h"
#endif
#define RCTQQShareTypeNews @"news"
#define RCTQQShareTypeImage @"image"
#define RCTQQShareTypeText @"text"
#define RCTQQShareTypeVideo @"video"
#define RCTQQShareTypeAudio @"audio"
#define RCTQQShareType @"type"
#define RCTQQShareTitle @"title"
#define RCTQQShareDescription @"description"
#define RCTQQShareWebpageUrl @"webpageUrl"
#define RCTQQShareImageUrl @"imageUrl"
@interface RCTQQAPI : NSObject<RCTBridgeModule>
@end
7、在RCTQQAPI文件夹内创建RCTQQAPI.m文件,代码如下:
//
// QQAPI.m
// RNThirdShareMangager
//
// Created by LvBingru on 10/10/15.
// Copyright © 2015 erica. All rights reserved.
//
#import "RCTQQAPI.h"
#import <TencentOpenAPI/TencentOAuth.h>
#import <TencentOpenAPI/TencentOAuthObject.h>
#import <TencentOpenAPI/QQApiInterface.h>
#import <TencentOpenAPI/QQApiInterfaceObject.h>
#if __has_include(<React/RCTBridge.h>)
#import <React/RCTLog.h>
#import <React/RCTBridge.h>
#import <React/RCTEventDispatcher.h>
#import <React/RCTImageLoader.h>
#else
#import "RCTLog.h"
#import "RCTEventDispatcher.h"
#import "RCTBridge.h"
#import "RCTImageLoader.h"
#endif
//#define NOT_REGISTERED (@"registerApp required.")
#define INVOKE_FAILED (@"QQ API invoke returns false.")
@interface RCTQQAPI()<QQApiInterfaceDelegate, TencentSessionDelegate> {
TencentOAuth* _qqapi;
}
@end
@implementation RCTQQAPI
@synthesize bridge = _bridge;
RCT_EXPORT_MODULE();
- (dispatch_queue_t)methodQueue
{
return dispatch_get_main_queue();
}
- (instancetype)init
{
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:@"RCTOpenURLNotification" object:nil];
[self _autoRegisterAPI];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)handleOpenURL:(NSNotification *)note
{
NSDictionary *userInfo = note.userInfo;
NSString *url = userInfo[@"url"];
if ([TencentOAuth HandleOpenURL:[NSURL URLWithString:url]]) {
}
else {
[QQApiInterface handleOpenURL:[NSURL URLWithString:url] delegate:self];
}
}
RCT_EXPORT_METHOD(isQQInstalled:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
{
if ([QQApiInterface isQQInstalled]) {
resolve(@[[NSNull null]]);
}
else {
reject(@"-1",INVOKE_FAILED,nil);
}
}
RCT_EXPORT_METHOD(isQQSupportApi:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
{
if ([QQApiInterface isQQSupportApi]) {
resolve(@[[NSNull null]]);
}
else {
reject(@"-1",INVOKE_FAILED,nil);
}
}
RCT_EXPORT_METHOD(login:(NSString *)scopes resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
{
NSArray *scopeArray = nil;
if (scopes && scopes.length) {
scopeArray = [scopes componentsSeparatedByString:@","];
}
if (scopeArray == nil) {
scopeArray = @[@"get_user_info", @"get_simple_userinfo"];
}
BOOL success = [_qqapi authorize:scopeArray];
if (success) {
resolve(@[[NSNull null]]);
}
else {
reject(@"-1",INVOKE_FAILED,nil);
}
}
RCT_EXPORT_METHOD(shareToQQ:(NSDictionary *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
{
[self _shareToQQWithData:data scene:0 resolve:resolve reject:reject];
}
RCT_EXPORT_METHOD(shareToQzone:(NSDictionary *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
{
[self _shareToQQWithData:data scene:1 resolve:resolve reject:reject];
}
RCT_EXPORT_METHOD(logout)
{
[_qqapi logout:nil];
}
- (void)_shareToQQWithData:(NSDictionary *)aData scene:(int)aScene resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject{
NSString *imageUrl = aData[RCTQQShareImageUrl];
if (imageUrl.length && _bridge.imageLoader) {
CGSize size = CGSizeZero;
if (![aData[RCTQQShareType] isEqualToString:RCTQQShareTypeImage]) {
CGFloat thumbImageSize = 80;
size = CGSizeMake(thumbImageSize,thumbImageSize);
}
[_bridge.imageLoader loadImageWithURLRequest:[RCTConvert NSURLRequest:imageUrl] callback:^(NSError *error, UIImage *image) {
dispatch_async(dispatch_get_main_queue(), ^{
[self _shareToQQWithData:aData image:image scene:aScene resolve:resolve reject:reject];
});
}];
}
else {
[self _shareToQQWithData:aData image:nil scene:aScene resolve:resolve reject:reject];
}
}
- (void)_shareToQQWithData:(NSDictionary *)aData image:(UIImage*) image scene:(int)aScene resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
NSString *type = aData[RCTQQShareType];
NSString *title = aData[RCTQQShareTitle];
NSString *description= aData[RCTQQShareDescription];
NSString *imgPath = aData[RCTQQShareImageUrl];
NSString *webpageUrl = aData[RCTQQShareWebpageUrl]? :@"";
NSString *flashUrl = aData[@"flashUrl"];
QQApiObject *message = nil;
if (type.length <=0 || [type isEqualToString: RCTQQShareTypeNews]) {
message = [QQApiNewsObject
objectWithURL:[NSURL URLWithString:webpageUrl]
title:title
description:description
previewImageURL:[NSURL URLWithString:imgPath]];
}
else if ([type isEqualToString: RCTQQShareTypeText]) {
message = [QQApiTextObject objectWithText:description];
}
else if ([type isEqualToString: RCTQQShareTypeImage]) {
NSData *imgData = UIImageJPEGRepresentation(image, 1);
message = [QQApiImageObject objectWithData:imgData
previewImageData:imgData
title:title
description:description];
}
else if ([type isEqualToString: RCTQQShareTypeAudio]) {
QQApiAudioObject *audioObj = [QQApiAudioObject objectWithURL:[NSURL URLWithString:webpageUrl]
title:title
description:description
previewImageURL:[NSURL URLWithString:imgPath]];
if (flashUrl) {
[audioObj setFlashURL:[NSURL URLWithString:flashUrl]];
}
message = audioObj;
}
else if ([type isEqualToString: RCTQQShareTypeVideo]) {
QQApiVideoObject *videoObj = [QQApiVideoObject objectWithURL:[NSURL URLWithString:webpageUrl]
title:title
description:description
previewImageURL:[NSURL URLWithString:imgPath]];
if (flashUrl) {
[videoObj setFlashURL:[NSURL URLWithString:flashUrl]];
}
message = videoObj;
}
QQApiSendResultCode sent = EQQAPISENDFAILD;
if (message != nil) {
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:message];
if (aScene == 0) {
sent = [QQApiInterface sendReq:req];
}
else {
sent = [QQApiInterface SendReqToQZone:req];
}
}
if (sent == EQQAPISENDSUCESS) {
resolve(@[[NSNull null]]);
}
else if (sent == EQQAPIAPPSHAREASYNC) {
resolve(@[[NSNull null]]);
}
else {
reject(@"-1",INVOKE_FAILED,nil);
}
}
- (void)_autoRegisterAPI
{
NSString *appId = nil;
NSArray *list = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleURLTypes"];
for (NSDictionary *item in list) {
NSString *name = item[@"CFBundleURLName"];
if ([name isEqualToString:@"qq"]) {
NSArray *schemes = item[@"CFBundleURLSchemes"];
if (schemes.count > 0)
{
appId = [schemes[0] substringFromIndex:@"tencent".length];
break;
}
}
}
_qqapi = [[TencentOAuth alloc] initWithAppId:appId andDelegate:self];
}
#pragma mark - qq delegate
- (void)onReq:(QQBaseReq *)req
{
}
- (void)onResp:(QQBaseResp *)resp
{
if ([resp isKindOfClass:[SendMessageToQQResp class]]) {
}
NSMutableDictionary *body = @{@"type":@"QQShareResponse"}.mutableCopy;
body[@"errMsg"] = resp.errorDescription;
if (resp.errorDescription) {
body[@"errCode"] = @(-1);
}
else {
body[@"errCode"] = @(0);
}
body[@"result"] =resp.result;
body[@"extendInfo"] =resp.extendInfo;
[self.bridge.eventDispatcher sendAppEventWithName:@"QQ_Resp" body:body];
}
- (void)isOnlineResponse:(NSDictionary *)response
{
}
#pragma mark - oauth delegate
- (void)tencentDidLogin
{
NSMutableDictionary *body = @{@"type":@"QQAuthorizeResponse"}.mutableCopy;
body[@"errCode"] = @(0);
body[@"openid"] = _qqapi.openId;
body[@"access_token"] = _qqapi.accessToken;
body[@"expires_in"] = @([_qqapi.expirationDate timeIntervalSince1970]*1000);
body[@"oauth_consumer_key"] =_qqapi.appId;
[self.bridge.eventDispatcher sendAppEventWithName:@"QQ_Resp" body:body];
}
- (void)tencentDidNotLogin:(BOOL)cancelled
{
NSMutableDictionary *body = @{@"type":@"QQAuthorizeResponse"}.mutableCopy;
body[@"errCode"] = @(-1);
if (cancelled) {
body[@"errMsg"] = @"login canceled";
}
else {
body[@"errMsg"] = @"login failed";
}
[self.bridge.eventDispatcher sendAppEventWithName:@"QQ_Resp" body:body];
}
- (void)tencentDidNotNetWork
{
}
@end
8、在Info->URL Types 中增加QQ的scheme: Identifier 设置为qq, URL Schemes 设置为你注册的QQ开发者账号中的APPID,需要加前缀tencent,例如tencent1104903684
9、在工程的AppDelegate.m文件中添加如下代码:
#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];
}
到此配置已经完成,使用
import {NativeModules} from "react-native"
async sharQQ(datas){ //qq分享
try {
let appOr = await NativeModules.QQAPI.isQQInstalled();
if(!appOr){
return false
}
var a =await NativeModules.QQAPI.shareToQQ(datas)
} catch (error) {
alert("没有安装QQ软件,请您安装QQ之后再试")
}
},
注意:IOS分享提示该应用未授权,是因为sdk更新了,详情可查看官网文档
临时解决方案:下载旧版的sdk
下载地址