资讯专栏INFORMATION COLUMN

React-native 使用原生(ios, android)第三方sdk

qujian / 2578人阅读

摘要:但阿里百川并没有提供直接获取数据的方法,所以选择时一定要慎重。

React-native 使用native第三方sdk ios(以阿里百川用户反馈为例)

首先安装cocopods(类似于npm,ios开发的依赖管理工具,教程:http://www.code4app.com/artic...

在ios根目录下创建Podfile文件,添加如下代码(使用的是百川feedback1.1.1版本),然后执行pod install命令

    target ‘Xss’ do 
       pod "YWFeedbackFMWK", "~> 1.1.1"
    end

pod安装完成后,使用xcode打开Xss.xcworkspace(我的项目名是Xss),在项目中创建BCBridge.h以及BCBridge.m文件,以建立js和原生的bridge,.h文件只是个头文件,.m文件代码如下
在这里简要介绍下ios下的controllerView切换机制,controllerView 切换主要有两种,push和present,其中,push必须在同一UINavigationController发生,push的动画表现为横向切入,present的动画为底部向上切入(类似于弹窗),由于react-native本身处于一个UINavigationController中,然后我目前还没有找到能向这个UINavigationController中push的方法,所以这里采用的是present的方式。

由于这种controller切换在oc里限制比较多,且使用别人的viewController可自定义的部分太受限,所以不是很推荐这种方式。

#import "RCTBridge.h"
#import "RCTEventDispatcher.h"
#import "RCTRootView.h"
#import "BCBridge.h"
#import "YWFeedbackFMWK/YWFeedbackKit.h"

static YWFeedbackKit *feedbackKit;        // 声明一个阿里百川feedback对象

@interface BCBridge ()
@property (nonatomic, strong) UINavigationController *navi;

@end

@implementation BCBridge

+(void)initialize {
  // 使用在百川后台申请的appkey来初始化feedbackKit
  feedbackKit = [[YWFeedbackKit alloc] initWithAppKey: @"yourappkey"];
}

// 建立Bridge,在js中直接使用
RCT_EXPORT_MODULE(BCBridge);

// 在js中调用时函数名为BCFeedback
RCT_EXPORT_METHOD(BCFeedback: (NSDictionary *)style) {
  // 自定义的样式注入,style变量为NSDictionary类型的,有js方法调用时传入,js中表现为Object
  feedbackKit.customUIPlist = style;
  // 将present操作提升到主进程来做(这里我也不太懂oc),这里百川1.0的feedback必须这样做才能切换过去,2.0不存在这个问题
  dispatch_async(dispatch_get_main_queue(), ^{
      // 调用阿里百川提供的初始化方法,此方法接受一个回调函数,默认参数为初始化后的viewController
    [feedbackKit makeFeedbackViewControllerWithCompletionBlock:^(YWLightFeedbackViewController *viewController, NSError *error) {
        // 创建一个新的UINavigationController以阿里百川返回的viewController为RootViewController
      UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
      // 将此controller设为当前域,可以退出
      self.navi = nav;
      // 设置title
      viewController.title = @"意见反馈";
      // 设置关闭按钮
      viewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"关闭" style:UIBarButtonItemStylePlain target:self action:@selector(back)];
      // 执行present操作(此view将从屏幕下方向上切入)
      [[UIApplication sharedApplication].delegate.window.rootViewController presentViewController:nav animated:YES completion:nil];
    }];
  });
}

// 声明退出函数
- (void)back
{
  [self.navi dismissViewControllerAnimated:YES completion:nil];
}
@end

js中调用

import {
  NativeModules
} from "react-native"

NativeModules.BCBridge.BCFeedback(options)

至此,封装完毕,但是这种方式并不友好,而且也不符合react-native统一ui的思想,所以建议使用此种方式来封装第三方sdk的方法(获取数据),然后使用react-native实现一套统一的ui(既可用于android也可用于ios)。但阿里百川并没有提供直接获取数据的方法,所以选择sdk时一定要慎重。

android

依据官方文档下载对应版本的sdk(这里使用的是1.1.3版本的)

在app下建立libs文件夹(如果没有的话),将sdk中文件放进去,将项目根目录下的build.gradle文件对应位置添加如下语句

allprojects {
    repositories {
        ...
        flatDir {
            dirs "libs"
        }
        ...
    }
}

在app目录下的build.gradle文件对应位置添加如下语句
有个大坑是因为阿里百川feedbackSdk默认使用multidex模式编译,如果不在项目中做对应设置,会导致一直编译不通过,看了无数种解决办法才解决此问题,泪崩~~~~

    defaultConfig {
        ...
        multiDexEnabled true                         // 开启multidex模式编译,此处为大坑,否则编译不过
    }
dependencies {
    ...
    compile "com.android.support:multidex:1.0.0"     // 此依赖用于开启mulidex模式编译
    compile(name: "feedbackSdk", ext: "aar")
    compile files("libs/securityguard-3.1.27.jar")
    compile files("libs/utdid4all-1.0.4.jar")
    compile files("libs/alisdk-ut-5.jar")
}

初始化
在MainActivity类中的onCreate方法中添加如下语句(如果FeedbackAPI无法引入,说明sdk依赖为添加成功,请检查上一步)

        MultiDex.install(this);      // 同样是开启multidex模式编译,网上大部分解决方案都没提这个设置,泪崩~~~~
        FeedbackAPI.initAnnoy(this.getApplication(), "yourappkey");    // 初始化阿里百川意见反馈

封装activity切换方法
创建BCBridge类(注意引入对应依赖)

具体代码如下

public class BCBridge extends ReactContextBaseJavaModule {

    public BCBridge(final ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        // 设置在js中调用的类名
        return "BCBridge";
    }

    // 在js中调用的方法名同样为BCFeedback,readableMap对应js中的Object
    @ReactMethod
    public void BCFeedback(ReadableMap map) {
        ReadableNativeMap middleMap = (ReadableNativeMap) map;
        // 将ReadableMap转化为hashMap
        Map nativeMap = middleMap.toHashMap();
        // 设置部分ui样式
        FeedbackAPI. setUICustomInfo(nativeMap);
        // 切换到阿里百川反馈界面
        FeedbackAPI.openFeedbackActivity(getReactApplicationContext());
    }
}

建立BCBridgePackage
将上一步封装的方法集成到应用中(我是这样理解的)

public class BCBridgePackage implements ReactPackage {
@Override
public List createNativeModules(ReactApplicationContext reactContext) {
    return Arrays.asList(
            new BCBridge(reactContext)
    );
}

@Override
public List> createJSModules() {
    return Collections.emptyList();
}

@Override
public List createViewManagers(ReactApplicationContext reactContext) {
    return Collections.emptyList();
}
}

同时在MainApplication中对应位置添加如下代码(如果引用一些别人封装好的rn-原生组件,通过rn link 也能实现此操作,但是手动更改此文件时可能会导致一些情况下rn link失效,请注意检查)

    @Override
    protected List getPackages() {
      return Arrays.asList(
          ...
          new BCBridgePackage()
      );
    }

对比于oc,java的代码好理解些,但是使用android的activity同样会有ios中提到的问题。

总结(个人心得)

由于上面提到的封装原生的页面(ios中体现为viewController,android中体现为activity),所以不提倡直接去使用别人集成好的viewController和activity,比较提倡使用这类方式来集成原生中的方法或者是组件,然后用rn来实现整体的ui布局,这样在开发成本上以及性能上都能得到很大的提高。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91105.html

相关文章

  • windows系统安装配置react-native运行环境

    摘要:把目录添加到环境变量中打开控制面板系统和安全系统高级系统设置高级环境变量,选中变量,然后点击编辑。 最近公司要开发react-native项目,自己在windows系统上练习了一下,过程中发现好多问题,在这里整理出来供大家参考; 一、首先来看一下reactNative官网 官网上的教程很详细,介绍了IOS和Android的环境搭建、示例教程等等,建议大家先按照官网的环境搭建教程尝试搭...

    SunZhaopeng 评论0 收藏0
  • windows系统安装配置react-native运行环境

    摘要:把目录添加到环境变量中打开控制面板系统和安全系统高级系统设置高级环境变量,选中变量,然后点击编辑。 最近公司要开发react-native项目,自己在windows系统上练习了一下,过程中发现好多问题,在这里整理出来供大家参考; 一、首先来看一下reactNative官网 官网上的教程很详细,介绍了IOS和Android的环境搭建、示例教程等等,建议大家先按照官网的环境搭建教程尝试搭...

    sixgo 评论0 收藏0
  • [React Native Android安利系列]搭建React Native Android环境

    摘要:环境首先,我们需要搭建一个开发环境。在终端下,直接执行命令进行查看,如果没有,请百度安装与环境变量配置。如图图不过,如果你运行到了这一步,恭喜你,你已经将的安卓项目成功的编译并安装到手机上了。 欢迎大家收看react-native-android系列教程,跟着本系列教程学习,可以熟练掌握react-native-android的开发,你值得拥有https://segmentfault....

    pf_miles 评论0 收藏0
  • React Native植入原生Android应用的流程解析

    摘要:在应用内添加依赖回到,到的文件级别的里添加依赖最后一行的就是我们新增的,注意这里的版本号要和里的一致。因此,建议用这样的写法,并检查版本号是否和里的一致。 引言 React Native是现在移动开发新的可选方案,也带来了原属于Web领域的React的优秀开发特性。另一方面,React Native的技术栈一经掌握,可以用于iOS、Android及Windows(见此)多个平台,即所说...

    worldligang 评论0 收藏0
  • React Native植入原生Android应用的流程解析

    摘要:在应用内添加依赖回到,到的文件级别的里添加依赖最后一行的就是我们新增的,注意这里的版本号要和里的一致。因此,建议用这样的写法,并检查版本号是否和里的一致。 引言 React Native是现在移动开发新的可选方案,也带来了原属于Web领域的React的优秀开发特性。另一方面,React Native的技术栈一经掌握,可以用于iOS、Android及Windows(见此)多个平台,即所说...

    荆兆峰 评论0 收藏0

发表评论

0条评论

qujian

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<