React Native 友盟分享和第三方登录iOS(与原生交互)

友盟分享和第三方登录配置的文档点我看友盟官方文档

1、首先我们需要在xcode中新建一个文件夹,
里面放置RCTUmengShare.h和RCTUmengShare.m文件

.h文件中的代码

#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>

@interface RCTUmengShare : NSObject<RCTBridgeModule>

@end

.m文件中的代码

#import "RCTUmengShare.h"
#import <UMSocialCore/UMSocialCore.h>
#import <UShareUI/UShareUI.h>
#import "AppDelegate.h"
#import <UIKit/UIKit.h>
#import <React/RCTImageLoader.h>

@interface RCTUmengShare ()

@end
@implementation RCTUmengShare
// 导出模块
RCT_EXPORT_MODULE()

// 友盟注册
RCT_EXPORT_METHOD(registerUMShare)
{
  /* 打开调试日志 */
  [[UMSocialManager defaultManager] openLog:YES];

  /* 设置友盟appkey */
  [[UMSocialManager defaultManager] setUmSocialAppkey:USHARE_DEMO_APPKEY];

}

/*
 设置微信的appKey和appSecret
 [微信平台从U-Share 4/5升级说明]http://dev.umeng.com/social/ios/%E8%BF%9B%E9%98%B6%E6%96%87%E6%A1%A3#1_1
 */
RCT_EXPORT_METHOD(configWeixin:(NSString *)key withSecret:(NSString *)secret)
{
  [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession appKey:key appSecret:secret redirectURL:nil];
}

/* 设置分享到QQ互联的appID
 * U-Share SDK为了兼容大部分平台命名,统一用appKey和appSecret进行参数设置,而QQ平台仅需将appID作为U-Share的appKey参数传进即可。
 100424468.no permission of union id
 [QQ/QZone平台集成说明]http://dev.umeng.com/social/ios/%E8%BF%9B%E9%98%B6%E6%96%87%E6%A1%A3#1_3
 */
RCT_EXPORT_METHOD(configQQZone:(NSString *)key withSecret:(NSString *)secret)
{
  [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_QQ appKey:key /*设置QQ平台的appID*/  appSecret:secret redirectURL:@"http://mobile.umeng.com/social"];
}

/*
 设置新浪的appKey和appSecret
 [新浪微博集成说明]http://dev.umeng.com/social/ios/%E8%BF%9B%E9%98%B6%E6%96%87%E6%A1%A3#1_2
 */
RCT_EXPORT_METHOD(configSinaWeibo:(NSString *)key withSecret:(NSString *)secret withRedirectUrl:(NSString *)redirectUrl)
{
  [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_Sina appKey:key  appSecret:secret redirectURL:redirectUrl];
}

/**
 *
 * 友盟分享和React Native交互方法
 */
RCT_REMAP_METHOD(shareLink, title:(NSString *)title
                 desc:(NSString *)desc
                 imageUrl:(NSString *)imageUrl
                 link:(NSString *)link
                 resolver:(RCTPromiseResolveBlock)resolve
                 rejecter:(RCTPromiseRejectBlock)reject
                 )
{

   dispatch_sync(dispatch_get_main_queue(), ^{
    [UMSocialUIManager setPreDefinePlatforms:@[@(UMSocialPlatformType_WechatSession),@(UMSocialPlatformType_WechatTimeLine),@(UMSocialPlatformType_QQ),@(UMSocialPlatformType_Sina)]];

    [UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMSocialPlatformType platformType, NSDictionary *userInfo) {
      //创建分享消息对象
      UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];

      //创建网页内容对象
//      NSString* thumbURL = imageUrl;
//      NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:imageUrl ? imageUrl : @""]];
//      [self.bridge.imageLoader loadImageWithURLRequest:imageRequest callback:^(NSError *error, UIImage *image) {
//        
//      }]
      UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:title descr:desc thumImage:imageUrl ? imageUrl : [UIImage imageNamed:@"shareIcon"]];
      //设置网页地址
      shareObject.webpageUrl = link;

      //分享消息对象设置分享内容对象
      messageObject.shareObject = shareObject;
      [self shareWithShareObject:messageObject platformType:platformType resolver:resolve rejecter:reject];


      //调用分享接口

    }];
  });

}

-(void)shareWithShareObject:(UMSocialMessageObject *)messageObject platformType:(UMSocialPlatformType)platformType resolver:(RCTPromiseResolveBlock)resolve
                   rejecter:(RCTPromiseRejectBlock)reject
{
        UIViewController * viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
        while (viewController.presentedViewController) {
          viewController = viewController.presentedViewController;
        }
  switch (platformType) {
    case UMSocialPlatformType_Sina:
    {
      resolve(@"新浪");
    }
      break;
    case UMSocialPlatformType_WechatSession:
    {
      resolve(@"微信");
    }
      break;
    case UMSocialPlatformType_WechatTimeLine:
    {
      resolve(@"微信");
    }
      break;
    case UMSocialPlatformType_QQ:
    {
      resolve(@"QQ");
    }
      break;
    default:
      break;
  }
  [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) {


    if (error) {
      UMSocialLogInfo(@"************Share fail with error %@*********",error);
    }else{

      if ([data isKindOfClass:[UMSocialShareResponse class]]) {
        UMSocialShareResponse *resp = data;
        //分享结果消息
        UMSocialLogInfo(@"response message is %@",resp.message);
        //第三方原始返回的数据
        UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse);

      }else{
        UMSocialLogInfo(@"response data is %@",data);
      }
    }

  }];
}



/**
 *
 *  友盟第三方登录与React Native交互方法
 */
RCT_REMAP_METHOD(thirdPartyAuthorization,loginPlatformType:(NSString *)platform resolver:(RCTPromiseResolveBlock)resolve
                 rejecter:(RCTPromiseRejectBlock)reject){
  UMSocialPlatformType platformType = UMSocialPlatformType_UnKnown;
  if ([platform isEqualToString:@"新浪"]) {
    platformType = UMSocialPlatformType_Sina;
  }else if ([platform isEqualToString:@"QQ"]){
    platformType = UMSocialPlatformType_QQ;

  }else if ([platform isEqualToString:@"微信"]){
    platformType = UMSocialPlatformType_WechatSession;
  }
   dispatch_async(dispatch_get_main_queue(), ^{ // 放在主线程中执行
     @try {
       UIViewController * viewController = [UIApplication sharedApplication].keyWindow.rootViewController;

       while (viewController.presentedViewController) {
         viewController = viewController.presentedViewController;
       }
       [[UMSocialManager defaultManager] getUserInfoWithPlatform:platformType currentViewController:viewController completion:^(id result, NSError *error) {

         if(error){
           reject(@"-1",@"授权失败",error);
         }else{
           if(result){ // 字段需要判断是否是空值
             UMSocialUserInfoResponse *resp = result;
             resolve(@{@"uid":resp.uid ? resp.uid : @"",
                       @"openid": resp.openid ? resp.openid : @"",
                       @"accessToken": resp.accessToken ? resp.accessToken : @"",
                       @"refreshToken": resp.refreshToken ? resp.refreshToken : @"",
                       @"expiration": resp.expiration ? resp.expiration : @"",
                       @"name": resp.name ? resp.name : @"",
                       @"iconurl": resp.iconurl ? resp.iconurl : @"",
                       @"gender": resp.gender ? resp.gender : @"",
                       @"originalResponse": resp.originalResponse ? resp.originalResponse : @"",
                       @"platform": platform});
           }else{

           }
         }
       }];
     } @catch (NSException *exception) {
        reject(@"-1",@"授权失败",nil);
     }
   });
}
@end

2、此时在React Native中建立一个文件夹,在里面创建index.js文件

import {NativeModules} from 'react-native';

const UmengShareUtil = NativeModules.UmengShare;

/**
 * 初始化
 * @param umAppKey
 */
function init(umAppKey) {
    UmengShareUtil.init(umAppKey);
}

/**
 * 配置微信分享
 * @param key
 * @param secret
 */
function configWeixin(key, secret) {
    UmengShareUtil.configWeixin(key, secret);
}
/**
* 配置QQ分享
* @param event
* @param param
*/
function configQQZone(key, secret) {
    UmengShareUtil.configQQZone(key, secret);
}
/**
 * 配置新浪分享
 * @param event
 * @param param
 */
function configSinaWeibo(key, secret, redirectUrl) {
    UmengShareUtil.configSinaWeibo(key, secret, redirectUrl);
}

/**
 * 分享
 * @param title
 * @param desc
 * @param imageUrl
 * @param link
 * @return {Promise.<*>}
 */
function shareLink(title, desc, imageUrl, link) {
    return UmengShareUtil.shareLink(title, desc, imageUrl, link);

}

/**
 *  第三方登录(传值"QQ","微信","新浪")
 */
function thirdPartyAuthorization(platform) {
    return UmengShareUtil.thirdPartyAuthorization(platform);
}
export {configWeixin,configQQZone,configSinaWeibo,shareLink, thirdPartyAuthorization};

3、相应的APPSECRETAPPKEY配置在Root.js中的componentDidMount中实现

  UmengShare.configWeixin(Config.WEIXIN_APPKEY, Config.WEIXIN_APPSECRET);
  UmengShare.configQQZone(Config.QQ_APPKEY_IOS, Config.QQ_APPSECRET);
  UmengShare.configSinaWeibo(Config.WEIBO_APPKEY_IOS, Config.WEIBO_APPSECRET, Config.WEIBO_REDIRECT_URL);

4、实现方法如下:

友盟分享

UmengShare.shareLink('我的酒窖', '描述', null, Config.HOST_H5 + '/newWineCellarList).then((data) => {});

第三方登录

// 这边遍历三个按钮,platformt传QQ 微信 新浪字符串给原生接受,也可以自己定义int类型也可以,但是要修改原生.m文件中的字符串
let platform = '';
        switch (index) {
            case 0: {
                platform = "QQ";
                break;
            }
            case 1: {
                platform = "微信";
                break;
            }
            case 2: {
                platform = "新浪";
                break;
            }
            default:
                break;
        }
UmengShare.thirdPartyAuthorization(platform).then(data => { }).catch(err=>{});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值