#新建ReactNative工程(過程不再贅述)
#下載ios android的分享包怖侦,申請各個平臺的sdk
#根據(jù)友盟分享的文檔配置ios和android工程
不同的是需要在初始化中設(shè)置類型
如ios需要在程序的最開始處設(shè)置
[UMSocialGlobalshareInstance].type=@"react native";
android需要在程序的最開始處設(shè)置
Config.shareType="react native";
4.ios部分
建立一個類引入頭文件:#import"RCTBridgeModule.h"
我們使用的方式是通過js調(diào)用native部分代碼
所以需要使用
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(show:(NSString*)text image:(NSString*)image url:(NSString*)url title:(NSString*)title callback:(RCTResponseSenderBlock)callback){
UMSocialMessageObject*messageObject = [UMSocialMessageObjectmessageObject];
messageObject.text= text;
UMShareWebpageObject* webobj = [UMShareWebpageObjectshareObjectWithTitle:titledescr:textthumImage:image];
webobj.webpageUrl= url;
messageObject.shareObject= webobj;
dispatch_sync(dispatch_get_main_queue(), ^{
//主線程更新
[[UMSocialManagerdefaultManager]shareToPlatform:UMSocialPlatformType_WechatSessionmessageObject:messageObjectcurrentViewController:selfcompletion:^(iddata,NSError*error) {
NSString*message =nil;
if(!error) {
message = [NSStringstringWithFormat:@"分享成功"];
}
else{
if(error) {
message = [NSStringstringWithFormat:@"失敗原因Code: %d\n",(int)error.code];
}
else{
message = [NSStringstringWithFormat:@"分享失敗"];
}
}
callback( [[NSArrayalloc]initWithObjects:message,nil]);
}];
});
}
我們是通過show從js中傳入的參數(shù),傳入什么樣的參數(shù)扎拣,可以根據(jù)不同情況自己設(shè)置蟀瞧,關(guān)鍵在于回調(diào)Callback要使用RCTResponseSenderBlock類型將結(jié)果回調(diào)給js
js中代碼處理為:
RNIOSAlert.show('from react native ','http://dev.umeng.com/images/tab2_1.png','http://dev.umeng.com','fff',
(message) =>{
this.setState({result:message});
alert(message);
});
回調(diào)中可以有多個字符串或多個類型參數(shù),因為RCTResponseSenderBlock的參數(shù)是一個NSArray
5.android部分:
建立一個類繼承extendsReactContextBaseJavaModule
還需要建立一個SharePackage類繼承ReactPackage
在Application中重寫一下代碼:
@Override
protectedListgetPackages() {
returnArrays.asList(
newSharePackage(),newMainReactPackage()
);
}
這樣在ShareUtil中就可以寫對應(yīng)的方法了
@ReactMethod
public voidshare(finalString text, finalString img, finalString weburl, finalString title, final intsharemedia, finalCallback successCallback){
runOnMainThread(newRunnable() {
@Override
public voidrun() {
newShareAction(ma).withText(text)
.withMedia(newUMImage(contect,img))
.withTargetUrl(weburl)
.withTitle(title)
.setPlatform(getShareMedia(sharemedia))
.setCallback(newUMShareListener() {
@Override
public voidonResult(SHARE_MEDIA share_media) {
successCallback.invoke(0,"success");
}
@Override
public voidonError(SHARE_MEDIA share_media,Throwable throwable) {
successCallback.invoke(1,throwable.getMessage());
}
@Override
public voidonCancel(SHARE_MEDIA share_media) {
successCallback.invoke(2,"cancel");
}
})
.share();
}
});
}
這里注意一定要放在主線程中,所以用runOnMainThread进统,這個方法可以在下載的代碼中看到
js中的代碼:
_share:function(){
ShareView.share('sssss','http://dev.umeng.com/images/tab2_1.png','','',0,(code,message) =>{
this.setState({result:message});
alert(message);
});
},
這樣即可實現(xiàn)互相調(diào)用
6.分享的集成可以看一下友盟的文檔,這里的主要思路就是用native調(diào)用的方式調(diào)用友盟的分享sdk浪听,這里只是提供了一個思路螟碎,方法的參數(shù)都可以根據(jù)需要自行更改。具體實現(xiàn)邏輯可以看以下代碼:
有問題可以給我留言