context
今天接到一個(gè)給公司RN小伙伴集成VPN SDK的任務(wù).原生代碼三下五除二的就寫(xiě)完了.
坑
在下面的代碼中,由于初始化校驗(yàn)是異步操作,所以加了回調(diào)block.
if (VPN_STATUS_OK == [self.helper vpnQueryStatus]) {
NSLog(@"vpn當(dāng)前是已經(jīng)登錄狀態(tài),注銷后才能再登錄");
return;
}
SdkMode mode = EasyApp;
[self.helper init:mode host:ipAddress port:[port integerValue] delegate:self];
self.initCallBack = callback;
然后為了測(cè)試,我在RN代碼中進(jìn)行調(diào)用:
VPNManager.initWithIPAddress('114.255.251.193','443',(status,description)=>{
AlertIOS.alert(status,description);
if (status=='RESULT_VPN_INIT_SUCCESS'){
VPNManager.startAuthWithUserName('your name','your password',(stausD,descriptionD)=>{
AlertIOS.alert(stausD,descriptionD);
})
}
});
return;
順理成章沒(méi)有難度.
然后發(fā)生的事情讓我沉默了. 原生代碼中helper對(duì)象的代理方法死活不走_.
容易被忽略的線程
原生代碼里面加上斷點(diǎn), 左邊一掃,發(fā)現(xiàn)thread
赫然是34
.難道這就是元兇?
于是改寫(xiě)代碼:
dispatch_async(dispatch_get_main_queue(), ^{
if (VPN_STATUS_OK == [self.helper vpnQueryStatus]) {
NSLog(@"vpn當(dāng)前是已經(jīng)登錄狀態(tài),注銷后才能再登錄");
return;
}
SdkMode mode = EasyApp;
[self.helper init:mode host:ipAddress port:[port integerValue] delegate:self];
self.initCallBack = callback;
});
重新運(yùn)行.
終于實(shí)現(xiàn)了自己的想法.
可能經(jīng)常做RN的小伙伴覺(jué)得這不是什么.可是我這扔下快一年的,而且當(dāng)時(shí)也沒(méi)做RN OC交互的弱雞,真的是好難為.特地記錄一下,希望能幫到人.
附錄
順帶附上今天查資料,關(guān)于RN調(diào)用OC方法的幾個(gè)點(diǎn):
相關(guān)配置
1.頭文件和協(xié)議
#import <React/RCTBridgeModule.h>//導(dǎo)入頭文件
@interface DEVPNManager : NSObject<RCTBridgeModule>//遵守協(xié)議
//.m文件
@implementation DEVPNManager
RCT_EXPORT_MODULE();//導(dǎo)出的模塊名,如果()內(nèi)不寫(xiě),則為類名.
- 方法定義.
- 方法的返回值只能是void
- 異步方法,還是用回調(diào)用
- 我怕生命周期有問(wèn)題,將對(duì)象設(shè)置成了單例
/**
使用IP地址和端口號(hào)初始化VPN
@param ipAddress IP地址 (字符串類型) 例如:114.255.251.193
@param port 端口號(hào) (字符串類型) 例如 443
@param callback 結(jié)果回調(diào)
*/
RCT_EXPORT_METHOD(initWithIPAddress:(NSString *)ipAddress port:(NSString*)port callback:(RCTResponseSenderBlock)callback){
/*
your code
*/
self.callBack = callback;
}
//somewhere 參數(shù)是數(shù)組
self.callBack(@[@"RESULT_VPN_INIT_SUCCESS",@"初始化VPN成功"]);
RN 端使用.
var VPNManager = NativeModules.DEVPNManager; //導(dǎo)入模塊
//某個(gè)觸發(fā)事件
VPNManager.initWithIPAddress('114.255.251.193','443',(status,description)=>{
AlertIOS.alert(status,description);
if (status=='RESULT_VPN_INIT_SUCCESS'){
}
});
參數(shù)依次傳遞, Block類型參數(shù)只能是數(shù)組.