背景
項(xiàng)目需要在React Native(之后簡(jiǎn)稱(chēng)RN)的網(wǎng)絡(luò)請(qǐng)求中寫(xiě)入cookie數(shù)據(jù)給服務(wù)端校驗(yàn),但是RN在0.42版本后不再支持用戶(hù)自定義設(shè)置OkHttpClient鬼吵,所以就需要換一種方式給RN的網(wǎng)絡(luò)請(qǐng)求寫(xiě)入cookie。
我當(dāng)前環(huán)境:
RN 0.51.0
Android 16及以上
RN當(dāng)中fetch請(qǐng)求是在NetWorkingModule 這個(gè)類(lèi)中的OkHttpClient發(fā)起的灌曙,所以我們需要替換成我們自己的client,大致有以下三種方案:
1.下載RN源碼修改然后編譯打包
(不推薦直接修改源碼雕什,如果RN版本更新那么維護(hù)起來(lái)就比較痛苦了)
Android端的源碼其實(shí)就是node modules/react-native下ReactAndroid和ReactCommon兩個(gè)項(xiàng)目,關(guān)于怎么導(dǎo)入到安卓工程苹粟,有很多文章:RN源碼編譯1 RN源碼編譯2
找到 NetWorkingModule 這個(gè)類(lèi)的構(gòu)造方法
/**
? * @param context the ReactContext of the application
? */
? public NetworkingModule(final ReactApplicationContext context) {
?? 原來(lái) this(context, null, OkHttpClientProvider.createClient(), null);
?? 改為 this(context, null, OkHttpClientProvider.getOkHttpClient(), null);
? }
然后設(shè)置自定義的client OkHttpClientProvider.replaceOkHttpClient(client)
2.反射設(shè)置自定義的client
雖然NetWorkingModule 中的client是final的有滑,但是并沒(méi)有在聲明的時(shí)候就進(jìn)行初始化,所以通過(guò)反射是可以進(jìn)行設(shè)值的嵌削,由于時(shí)間原因毛好,并沒(méi)有去實(shí)踐這種做法。
3.實(shí)現(xiàn)自定義的 MainReactPackage
由于 NetWorkingModule 是在 MainReactPackage 中初始化的苛秕,而 MainReactPackage 又是我們自己設(shè)置給 ReactInstanceManager 肌访,所以就可以嘗試?yán)^承 MainReactPackage ,重寫(xiě)生成 NetWorkingModule 的邏輯艇劫。需要注意的是 NetWorkingModule 的訪(fǎng)問(wèn)是包范圍的吼驶,所以初始化代碼也要放在對(duì)應(yīng)的包下面,即com.facebook.react.modules.network
public class MyMainReactPackage extends MainReactPackage {
?? @Override
?? public List getNativeModules(ReactApplicationContext context) {
? ? ?? List nativeModules = super.getNativeModules(context);
? ? ?? return adjustModules(context, nativeModules);
?? }
?? private List adjustModules(ReactApplicationContext context, List moduleSpecs) {
? ? ?? ArrayList modules = new ArrayList<>(moduleSpecs);
? ? ?? for (int i = 0; i < modules.size(); i++) {
? ? ? ? ?? ModuleSpec spec = modules.get(i);
? ? ? ? ?? if (spec.getType().equals(NetworkingModule.class)) {
? ? ? ? ? ? ?? modules.set(i, getCustomNetworkingModule(context));
? ? ? ? ? ? ?? break;
? ? ? ? ?? }
? ? ?? }
? ? ?? return modules;
?? }
?? private ModuleSpec getCustomNetworkingModule(final ReactApplicationContext context) {
? ? ?? return ModuleSpec.nativeModuleSpec(
? ? ? ? ? ? ?? NetworkingModule.class,
? ? ? ? ? ? ?? new Provider() {
? ? ? ? ? ? ? ? ?? @Override
? ? ? ? ? ? ? ? ?? public NativeModule get() {
? ? ? ? ? ? ? ? ? ? ?? return NetworkingModuleUtils.createNetworkingModuleWithCustomClient(context);
? ? ? ? ? ? ? ? ?? }
? ? ? ? ? ? ?? });
?? }
}
public class NetworkingModuleUtils {
?? public static NetworkingModule createNetworkingModuleWithCustomClient(ReactApplicationContext context) {
? ? ?? OkHttpClient client = OkHttpClientProvider.createClient();
? ? ?? // ... full access to customize client
? ? ?? return new NetworkingModule(context, null, OkHttpClientManager.getInstance().mOkHttpClient);
?? }
}
方法1和方法3親測(cè)可用店煞,方法2只是一個(gè)思路蟹演,估計(jì)還會(huì)有坑,比如怎么獲取 NetWorkingModule 的引用