iOS--React Native手勢(shì)密碼插件(內(nèi)附Demo)

一:介紹

React Native (簡(jiǎn)稱RN)是Facebook于2015年4月開源的跨平臺(tái)移動(dòng)應(yīng)用開發(fā)框架图柏,是Facebook早先開源的JS框架 React 在原生移動(dòng)應(yīng)用平臺(tái)的衍生產(chǎn)物哺窄,目前支持iOS和安卓?jī)纱笃脚_(tái)骑科。RN使用Javascript語言俘种,類似于HTML的JSX阳似,以及CSS來開發(fā)移動(dòng)應(yīng)用叨粘,因此熟悉Web前端開發(fā)的技術(shù)人員只需很少的學(xué)習(xí)就可以進(jìn)入移動(dòng)應(yīng)用開發(fā)領(lǐng)域晤揣。

在React Native移動(dòng)平臺(tái)項(xiàng)目開發(fā)中,除了React Native 提供的封裝好的部分插件和原聲組建外纳击,在實(shí)際的項(xiàng)目中還需要使用到很多其他的插件续扔,比如網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)庫评疗、相機(jī)测砂、相冊(cè)、通訊錄百匆、視頻播放器、瀏覽器呜投、藍(lán)牙連接加匈、圖片處理、消息推送仑荐、地圖雕拼、統(tǒng)計(jì)、埋點(diǎn)等等APP開發(fā)中需要用到的功能粘招,都為IDE開發(fā)平臺(tái)提供封裝好的插件啥寇,以便項(xiàng)目開發(fā)使用。

另外洒扎,這些博文都是來源于我日常開發(fā)中的技術(shù)總結(jié)辑甜,在時(shí)間允許的情況下,我會(huì)針對(duì)技術(shù)點(diǎn)分別分享iOS袍冷、Android兩個(gè)版本磷醋,如果有其他技術(shù)點(diǎn)需要,可在文章后留言胡诗,我會(huì)盡全力幫助大家邓线。這篇文章重點(diǎn)介紹手勢(shì)密碼插件的開發(fā)與使用

源碼Demo獲取方法

如果需要React Native手勢(shì)密碼插件源碼demo,歡迎關(guān)注 【網(wǎng)羅開發(fā)】微信公眾號(hào)煌恢,回復(fù)【66】便可領(lǐng)取骇陈。
網(wǎng)羅天下方法,方便你我開發(fā)瑰抵,所有文檔會(huì)持續(xù)更新你雌,歡迎關(guān)注一起成長(zhǎng)!

二:實(shí)現(xiàn)思路分析

手勢(shì)密碼插件是需要實(shí)現(xiàn)可視頁面控制器谍憔、設(shè)置手勢(shì)密碼匪蝙、驗(yàn)證手勢(shì)密碼主籍、密碼sm3加密、密碼本地保存等功能逛球,這些功能加通過在PwdLockPlugin類中封裝的SetPwdLock方法和DecryptLock方法來提供給Javascript開發(fā)使用千元。

具體的實(shí)現(xiàn)思路如下:

  1. 新建PwdLockPlugin類,實(shí)現(xiàn)RCTBridgeModule協(xié)議

  2. 添加RCT_EXPORT_MODULE()宏

  3. 添加React Native跟控制器

  4. 聲明被JavaScript 調(diào)用的方法

  5. 新建設(shè)置密碼控制器

  6. 新建驗(yàn)證密碼控制器

  7. 設(shè)置手勢(shì)密碼

  8. 驗(yàn)證手勢(shì)密碼

  9. 密碼sm3加密

  10. Javascript調(diào)用瀏覽器方法

三:實(shí)現(xiàn)源碼分析

實(shí)現(xiàn)源碼分析是根據(jù)上面列出的具體實(shí)現(xiàn)思路來為大家解刨內(nèi)部的實(shí)現(xiàn)流程及核心代碼分析颤绕。

1. 新建PwdLockPlugin類幸海,實(shí)現(xiàn)RCTBridgeModule協(xié)議

新建繼承NSObject的PwdLockPlugin類,并實(shí)現(xiàn)RCTBridgeModule協(xié)議

// PwdLockPlugin.h
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <UIKit/UIKit.h>
@interface PwdLockPlugin : NSObject<RCTBridgeModule>
@end

2. 添加RCT_EXPORT_MODULE()宏

為了實(shí)現(xiàn)RCTBridgeModule協(xié)議奥务,PwdLockPlugin的類需要包含RCT_EXPORT_MODULE()宏物独。
并在這個(gè)宏里面添加一個(gè)參數(shù)“PwdLockPlugin”用來指定在 JavaScript 中訪問這個(gè)模塊的名字。
如果你不指定氯葬,默認(rèn)就會(huì)使用這個(gè) Objective-C 類的名字挡篓。
如果類名以 RCT 開頭,則 JavaScript 端引入的模塊名會(huì)自動(dòng)移除這個(gè)前綴帚称。

// PwdLockPlugin.m
#import "PwdLockPlugin.h"
@implementation PwdLockPlugin
RCT_EXPORT_MODULE(PwdLockPlugin);
@end

3. 添加React Native跟控制器

如果不添加React Native跟控制器官研,view將不能正常顯示出來,實(shí)現(xiàn)方法如下:

// PwdLockPlugin.m
#import <React/RCTUtils.h>

引入<React/RCTUtils.h>之后闯睹,在視圖初始化或者顯示的時(shí)候戏羽,按照如下方法調(diào)用即可

UIViewController *vc = RCTPresentedViewController();

4. 聲明被JavaScript 調(diào)用的方法

React Native需要明確的聲明要給 JavaScript 導(dǎo)出的方法,否則 React Native 不會(huì)導(dǎo)出任何方法楼吃。下面通過舉例來展示聲明的方法始花,通過RCT_EXPORT_METHOD()宏來實(shí)現(xiàn):

// PwdLockPlugin.m
#import "PwdLockPlugin.h"
#import <React/RCTUtils.h>
@implementation PwdLockPlugin
RCT_EXPORT_MODULE(PwdLockPlugin);
//設(shè)置手勢(shì)密碼
RCT_EXPORT_METHOD(SetPwdLock:(RCTResponseSenderBlock)sucessCallback failCallback:(RCTResponseSenderBlock)failCallback)
{
        NSLog(@"調(diào)起設(shè)置密碼方法");
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_async(queue, ^{
            [CLLockVC showSettingLockVCInVC:RCTPresentedViewController() successBlock:^(CLLockVC *lockVC, NSString *pwd) {
                [lockVC dismiss:0.0f];
                sucessCallback(@[@{@"status":@"1",@"data":@"密碼設(shè)置成功"}]);
                NSLog(@"%@",[self jsonStringWithDict:@{@"status":@"1",@"data":@"密碼設(shè)置成功"}]);
                //存儲(chǔ)密碼
                pwd = [CLLockVC sm3:pwd];
                [CoreArchive setStr:pwd key:CoreLockPWDKey];
            }];
        });
}

//驗(yàn)證手勢(shì)密碼
RCT_EXPORT_METHOD(DecryptLock:(RCTResponseSenderBlock)sucessCallback failCallback:(RCTResponseSenderBlock)failCallback)
{
        NSLog(@"調(diào)起驗(yàn)證密碼方法");
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_async(queue, ^{
        [CLLockVC showVerifyLockVCInVC:RCTPresentedViewController() forgetPwdBlock:^{
            failCallback(@[@{@"resultCode":@"-1",@"resultMessage":@"手勢(shì)密碼三次驗(yàn)證失敗"}]);
        } successBlock:^(CLLockVC *lockVC, NSString *pwd) {
            [lockVC dismiss:0.0f];
            sucessCallback(@[@{@"status":@"1",@"data":@"手勢(shì)密碼驗(yàn)證成功"}]);
        }];
        });
}
@end

5. 新建設(shè)置密碼控制器

設(shè)置密碼控制器是由3乘3的9個(gè)可觸摸按鈕實(shí)現(xiàn),用戶可以通過滑動(dòng)屏幕來觸動(dòng)屏幕按鈕孩锡,每個(gè)按鈕有自己特有的編號(hào)(編號(hào)為0-9)酷宵,通過觸動(dòng)按鈕的先后順序來記錄手勢(shì)密碼,并將密碼存儲(chǔ)在本地浮创。

核心源碼如下:

+(instancetype)showSettingLockVCInVC:(UIViewController *)vc successBlock:(void(^)(CLLockVC *lockVC,NSString *pwd))successBlock{
    CLLockVC *lockVC = [self lockVC:vc];
    lockVC.title = @"設(shè)置密碼";
    lockVC.type = CoreLockTypeSetPwd;
    lockVC.successBlock = successBlock;
    return lockVC;
}

效果如下圖:

1.png

6. 新建驗(yàn)證密碼控制器

驗(yàn)證密碼控制器是由3乘3的9個(gè)可觸摸按鈕實(shí)現(xiàn)忧吟,用戶可以通過滑動(dòng)屏幕來觸動(dòng)屏幕按鈕,每個(gè)按鈕有自己特有的編號(hào)(編號(hào)為0-9)斩披,通過觸動(dòng)按鈕的先后順序來記錄手勢(shì)密碼溜族,通過和本地存儲(chǔ)的密碼進(jìn)行對(duì)比驗(yàn)證是否一致,判斷是否通過驗(yàn)證垦沉。

核心源碼如下:

+(instancetype)showVerifyLockVCInVC:(UIViewController *)vc forgetPwdBlock:(void(^)())forgetPwdBlock successBlock:(void(^)(CLLockVC *lockVC, NSString *pwd))successBlock{
    CLLockVC *lockVC = [self lockVC:vc];
    lockVC.title = @"手勢(shì)解鎖";
    lockVC.type = CoreLockTypeVeryfiPwd;
    lockVC.successBlock = successBlock;
    lockVC.forgetPwdBlock = forgetPwdBlock;
    return lockVC;
}

效果如下圖:

2.png

7. 設(shè)置手勢(shì)密碼

設(shè)置手勢(shì)密碼的滑動(dòng)實(shí)現(xiàn)流程如下:

    1. 第一次滑動(dòng)設(shè)置
    1. 再次確認(rèn)滑動(dòng)設(shè)置
    1. 檢測(cè)密碼長(zhǎng)度是否符合要求(至少為四個(gè)點(diǎn))
    1. 判斷兩次設(shè)置的密碼是否一致
    1. 如果密碼一致提示設(shè)置成功
    1. 如果不一致提示再次輸入
    1. 將密碼存儲(chǔ)在本地

核心源碼如下:

    //第一次滑動(dòng)設(shè)置
    self.lockView.setPWBeginBlock = ^(){
        [self.label showNormalMsg:CoreLockPWDTitleFirst];
    };
    //再次確認(rèn)滑動(dòng)設(shè)置
    self.lockView.setPWConfirmlock = ^(){
        [self.label showNormalMsg:CoreLockPWDTitleConfirm];
    };
    //檢測(cè)密碼長(zhǎng)度是否符合要求(至少為四個(gè)點(diǎn))
    self.lockView.setPWSErrorLengthTooShortBlock = ^(NSUInteger currentCount){
        [self.label showWarnMsg:[NSString stringWithFormat:@"請(qǐng)連接至少%@個(gè)點(diǎn)",@(CoreLockMinItemCount)]];
    };
    //判斷兩次設(shè)置的密碼是否一致
    self.lockView.setPWSErrorTwiceDiffBlock = ^(NSString *pwd1,NSString *pwdNow){
        [self.label showWarnMsg:CoreLockPWDDiffTitle];
        self.navigationItem.rightBarButtonItem = self.resetItem;
    };
    //如果密碼一致提示設(shè)置成功
    self.lockView.setPWFirstRightBlock = ^(){
        [self.label showNormalMsg:CoreLockPWDTitleConfirm];
    };
    //如果不一致提示再次輸入
    self.lockView.setPWTwiceSameBlock = ^(NSString *pwd){
        [self.label showNormalMsg:CoreLockPWSuccessTitle];
        //將密碼存儲(chǔ)在本地
        [CoreArchive setStr:pwd key:CoreLockPWDKey];
        self.view.userInteractionEnabled = NO;
        if(_successBlock != nil) _successBlock(self,pwd);
        if(CoreLockTypeModifyPwd == _type){
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [self.navigationController popViewControllerAnimated:YES];
            });
        }
    };

8. 驗(yàn)證手勢(shì)密碼

驗(yàn)證手勢(shì)密碼的滑動(dòng)實(shí)現(xiàn)流程如下:

    1. 滑動(dòng)輸入密碼
    1. 檢測(cè)密碼長(zhǎng)度是否符合要求(至少為四個(gè)點(diǎn))
    1. 取出本地存儲(chǔ)的密碼
    1. 判斷輸入的密碼和本地密碼是否一致
    1. 如果一致返回驗(yàn)證成功
    1. 如果不一致提示重新驗(yàn)證

核心源碼如下:

    //滑動(dòng)輸入密碼
    self.lockView.verifyPWBeginBlock = ^(){
        [self.label showNormalMsg:CoreLockVerifyNormalTitle];
    };
    //檢測(cè)密碼長(zhǎng)度是否符合要求(至少為四個(gè)點(diǎn))
    self.lockView.verifyPwdBlock = ^(NSString *pwd){
        //取出本地存儲(chǔ)的密碼
        NSString *pwdLocal = [CoreArchive strForKey:CoreLockPWDKey];
        BOOL res = [pwdLocal isEqualToString:pwd];
        //判斷輸入的密碼和本地密碼是否一致
        if(res){
            [self.label showNormalMsg:CoreLockVerifySuccesslTitle];
        }else{
            [self.label showWarnMsg:CoreLockVerifyErrorPwdTitle];
        }
        return res;
    };

9. 密碼sm3加密

對(duì)密碼進(jìn)行sm3加密煌抒,可以保證密碼在傳輸過程中安全傳輸,實(shí)現(xiàn)源碼如下:

+ (NSString *) sm3:(NSString *) input
{
    NSData *inputData = [input dataUsingEncoding:NSUTF8StringEncoding];
    NSData *outputData = [PwdLockSM3Coded sm3_hashWithPainData:inputData];
    NSString *outputString = [CLLockVC convertDataToHexStr:outputData];
    NSString *upper = [outputString uppercaseString];
    return upper;
}
10. Javascript調(diào)用瀏覽器方法

現(xiàn)在從 Javascript 里可以這樣調(diào)用這個(gè)方法:

import { NativeModules } from "react-native";
const PwdLockPlugin = NativeModules.PwdLockPlugin;
//設(shè)置手勢(shì)密碼
PwdlockPlugin.SetPwdLock((msg) => {
                                         Alert.alert(JSON.stringify(msg));

                                         },(err) => {
                                         Alert.alert(JSON.stringify(err));
                                         });
//驗(yàn)證手勢(shì)密碼
PwdlockPlugin.DecryptLock((msg) => {
                                         Alert.alert(JSON.stringify(msg));

                                         },(err) => {
                                         Alert.alert(JSON.stringify(err));
                                         });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厕倍,一起剝皮案震驚了整個(gè)濱河市寡壮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖况既,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件这溅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡棒仍,警方通過查閱死者的電腦和手機(jī)悲靴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莫其,“玉大人癞尚,你說我怎么就攤上這事÷叶福” “怎么了浇揩?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)憨颠。 經(jīng)常有香客問我胳徽,道長(zhǎng),這世上最難降的妖魔是什么烙心? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任膜廊,我火速辦了婚禮,結(jié)果婚禮上淫茵,老公的妹妹穿的比我還像新娘。我一直安慰自己蹬跃,他們只是感情好匙瘪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝶缀,像睡著了一般丹喻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翁都,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天碍论,我揣著相機(jī)與錄音,去河邊找鬼柄慰。 笑死鳍悠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坐搔。 我是一名探鬼主播藏研,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼概行!你這毒婦竟也來了蠢挡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎业踏,沒想到半個(gè)月后禽炬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勤家,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年腹尖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片却紧。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桐臊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晓殊,到底是詐尸還是另有隱情断凶,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布巫俺,位于F島的核電站认烁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏介汹。R本人自食惡果不足惜却嗡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘹承。 院中可真熱鬧窗价,春花似錦、人聲如沸叹卷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骤竹。三九已至帝牡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒙揣,已是汗流浹背靶溜。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懒震,地道東北人罩息。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挎狸,于是被迫代替她去往敵國(guó)和親扣汪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • React Native 是最近非诚谴遥火的一個(gè)話題崭别,介紹如何利用 React Native 進(jìn)行開發(fā)的文章和書籍多如...
    零度_不結(jié)冰閱讀 677評(píng)論 0 1
  • 一:介紹 React Native (簡(jiǎn)稱RN)是Facebook于2015年4月開源的跨平臺(tái)移動(dòng)應(yīng)用開發(fā)框架冬筒,是...
    Swift社區(qū)閱讀 2,235評(píng)論 0 2
  • 你知道那個(gè)女人有多愛我,就知道我有多么努力茅主。 我很愛我女朋友舞痰,她也很愛我遇到他是我最大的幸運(yùn),今天早晨看書诀姚,學(xué)了年...
    A張浩杰閱讀 243評(píng)論 0 1
  • 奮斗的理由有哪些赫段? 這個(gè)社會(huì)雖然沒有絕對(duì)的...
    榴蓮糖糖閱讀 696評(píng)論 0 4
  • 這幾個(gè)夜呀打,大哥莫名又喜歡麻麻了,每天晚上都要和麻麻睡糯笙,老母親深感欣慰贬丛。 這個(gè)夜,和往日一樣给涕,但又不一樣~大...
    我是桃子麻麻閱讀 180評(píng)論 0 0