極光認(rèn)證支持 HBuilderX

前提

本文介紹的是如果開發(fā)極光認(rèn)證的 HBuilderX 插件楼肪,最終開發(fā)出的插件已開源始鱼,如果需要使用請(qǐng)點(diǎn)擊前往github千埃。

極光認(rèn)證

極光認(rèn)證整合了三大運(yùn)營商的網(wǎng)關(guān)認(rèn)證能力济欢,為開發(fā)者提供了一鍵登錄和號(hào)碼認(rèn)證功能赠堵。前往官網(wǎng)查看全部功能

HBuilderX

目前極光只提供了 Android&iOS 的原生 SDK 接入,如果希望在 HBuilderX 中接入極光認(rèn)證法褥,需要開發(fā)適用的插件以方便在 HX 中直接使用 JS 調(diào)用極光認(rèn)證能力茫叭。
HBuilderX 是一款I(lǐng)DE,支持 uni-app 開發(fā)框架半等。所以需要按照 uni-app 開發(fā)完插件后打包給 HbuilderX 使用

插件準(zhǔn)備工作

極光側(cè)

1.在極光 Portal 測(cè)注冊(cè)應(yīng)用并開通認(rèn)證功能揍愁,拿到對(duì)應(yīng)的 appkey 等會(huì)做測(cè)試
2.前往下載最新的極光認(rèn)證Android和iOS兩端原生 SDK,本文示例版本

  • Android v2.5.2


    極光認(rèn)證AndroidSDK
  • iOS v2.5.3


    極光認(rèn)證iOSSDK

uni-app 側(cè)

創(chuàng)建插件項(xiàng)目杀饵,并接入認(rèn)證 SDK

Android

  • 1.參考Android平臺(tái)uni-app原生插件開發(fā)文檔 新建一個(gè) module 命名為 uniplugin_jverification莽囤,并在 uniapp SDK 插件項(xiàng)目中接入。

    module 示例

  • 2.按照接入指南手動(dòng)集成部分(因?yàn)閡niapp 官方建議 jar 包優(yōu)先于 jcenter 集成方式)接入極光 SDK切距。

    接入SDK后 module 工程示例

    • 3.因?yàn)?appkey 和 channel 是變量需要配 meta 朽缎,為了方便用戶使用,這兩個(gè) meta 配在 app 的 AndroidManifest 中,并在后續(xù)插件配置中預(yù)留給用戶配置话肖,而不是打進(jìn)插件包里北秽。


      app 的 AndroidManifest
  • 4 在 module 中新建一個(gè)類為 JVerificationWXModule 繼承 WXSDKEngine.DestroyableModule,并將其配置成插件入口狼牺。


  • 5.Android 插件開發(fā)準(zhǔn)備完畢

iOS

  • 3.因?yàn)?appkey 和 channel 是變量需要在后續(xù)插件配置中預(yù)留給用戶配置,而不是打進(jìn)插件包里悄泥,所以將其配在項(xiàng)目的 infolist 中動(dòng)態(tài)獲取虏冻。


  • 4 在 framework 中新建一個(gè)聲明 JVerificationModule.h 導(dǎo)入 WXModuleProtocal.h,并將其配置成插件入口弹囚。



  • 5.iOS 插件開發(fā)準(zhǔn)備完畢

插件開發(fā)

如何開發(fā)和調(diào)試 uniapp 插件

認(rèn)證插件開發(fā)注意事項(xiàng)

認(rèn)證 Android 和 iOS 作為同一款產(chǎn)品的兩端厨相,雖然他們 API 命名不同,但兩端的功能是極其相似的鸥鹉,比如請(qǐng)求一鍵登錄時(shí)蛮穿,均可以設(shè)置超時(shí),設(shè)置登錄完成后是否自動(dòng)關(guān)閉授權(quán)頁毁渗。

// Android
LoginSettings settings = new LoginSettings();
    settings.setAutoFinish(true);//設(shè)置登錄完成后是否自動(dòng)關(guān)閉授權(quán)頁
    settings.setTimeout(15 * 1000);//設(shè)置超時(shí)時(shí)間践磅,單位毫秒。 合法范圍(0灸异,30000],范圍以外默認(rèn)設(shè)置為10000
    settings.setAuthPageEventListener(new AuthPageEventListener() {
        @Override
        public void onEvent(int cmd, String msg) {
            //do something...
        }
    });//設(shè)置授權(quán)頁事件監(jiān)聽
    JVerificationInterface.loginAuth(this, settings, new VerifyListener() {
         @Override
              public void onResult(int code, String content, String operator) {
                 if (code == 6000){
                    Log.d(TAG, "code=" + code + ", token=" + content+" ,operator="+operator);
                }else{
                    Log.d(TAG, "code=" + code + ", message=" + content);
                }
              }
          });
// iOS
  [JVERIFICATIONService getAuthorizationWithController:self hide:NO animated:YES timeout:5*1000 completion:^(NSDictionary *result) {
        NSLog(@"一鍵登錄 result:%@", result);
    } actionBlock:^(NSInteger type, NSString *content) {
        NSLog(@"一鍵登錄 actionBlock :%ld %@", (long)type , content);
    }];

所以為了方便用戶的使用府适,插件需要盡可能的統(tǒng)一兩端的使用方式,比如約定 timeout 和 autoFinish 作為一鍵認(rèn)證功能超時(shí)肺樟,登錄完成后是否自動(dòng)關(guān)閉授權(quán)頁功能的標(biāo)識(shí)檐春,前端下發(fā)一套配置,兩端各自處理對(duì)應(yīng)配置么伯,并將結(jié)果統(tǒng)一返回疟暖,這樣極大方便了前端使用者。

以一鍵登錄為例定義對(duì)外接口:

API - loginAuth(Object田柔,CALLBACK誓篱,EVENTCALLBACK)

調(diào)起一鍵登錄授權(quán)頁面,在用戶授權(quán)后獲取 loginToken凯楔,同時(shí)支持授權(quán)頁事件監(jiān)聽窜骄。

參數(shù)說明

  • Object
參數(shù)名稱 參數(shù)類型 參數(shù)說明
timeout number 設(shè)置初始化超時(shí)時(shí)間,單位毫秒摆屯,合法范圍是(0,30000]邻遏,推薦設(shè)置為 5000-10000,默認(rèn)值為 10000糠亩。
autoFinish boolean 是否自動(dòng)關(guān)閉授權(quán)頁,true - 是准验,false - 否
animationFlag boolean 拉起授權(quán)頁時(shí)是否需要?jiǎng)赢嬓Ч晗撸瑃rue - 是,false - 否糊饱,默認(rèn) true垂寥。(僅作用與 iOS)

根據(jù)接口定義我們可以對(duì)應(yīng)開發(fā)插件兩端代碼為

  • Android
// Android
    @JSMethod(uiThread = true)
    public void loginAuth(JSONObject object, final JSCallback callback, final JSCallback eventCallback) {
        int timeout = 10000;
        boolean autoFinish = true;
        if (object != null) {
            timeout = object.containsKey(JConstants.TIME_OUT) ? object.getIntValue(JConstants.TIME_OUT) : 10000;
            autoFinish = object.containsKey(JConstants.AUTO_FINISH) ? object.getBooleanValue(JConstants.AUTO_FINISH) : true;
        }
        JLogger.d("loginAuth with setting autoFinish:" + autoFinish + " timeout:" + timeout);
        LoginSettings settings = new LoginSettings();
        settings.setAutoFinish(autoFinish);//設(shè)置登錄完成后是否自動(dòng)關(guān)閉授權(quán)頁
        settings.setTimeout(timeout);//設(shè)置超時(shí)時(shí)間,單位毫秒另锋。 合法范圍(0滞项,30000],范圍以外默認(rèn)設(shè)置為10000

        settings.setAuthPageEventListener(new AuthPageEventListener() {
            @Override
            public void onEvent(int cmd, String msg) {
                eventCallback.invokeAndKeepAlive(convertToResult(cmd, msg));
            }
        });//設(shè)置授權(quán)頁事件監(jiān)聽
        JVerificationInterface.loginAuth(mWXSDKInstance.getContext(), settings, new VerifyListener() {
            @Override
            public void onResult(int code, String content, String operator) {
                callback.invoke(convertToResult(code, content, operator));
            }
        });
    }
  • iOS
- (void)loginAuth:(NSDictionary*)params callback:(WXModuleKeepAliveCallback)callback eventCallback:(WXModuleKeepAliveCallback)eventCallback
{
     [self logger:@"loginAuth with params:" log:params];
    BOOL autoFinish = true;
    BOOL animation = true;
    NSTimeInterval time  = 10000;
    if (params[@"autoFinish"]) {
        autoFinish = [params[@"autoFinish"] boolValue];
    }
    if (params[@"animationFlag"]) {
        animation = [params[@"animationFlag"] boolValue];
    }
    if(params[@"timeout"]){
        time = [params[@"timeout"] doubleValue];
    }

    UIViewController *topVC = [self findVisibleVC];
    [JVERIFICATIONService getAuthorizationWithController:topVC hide:autoFinish animated:animation timeout:time completion:^(NSDictionary *result) {
        NSNumber *code = result[@"code"];
        NSString *content = @"";
        if(result[@"content"]){
            content = result[@"content"];
        }
        if(result[@"loginToken"]){
            content = result[@"loginToken"];
        }
        NSString *operator = result[@"operator"]?result[@"operator"]:@"";
        NSDictionary *responseData = [self convertToResult:code content:content operator:operator];
        callback(responseData,NO);
       
    } actionBlock:^(NSInteger type, NSString *content) {
        NSNumber *code = [NSNumber numberWithLong: type];
        NSDictionary *responseData = [self convertToResult:code content:content];
      eventCallback(responseData,YES);
    }];

}

這樣前端僅需一套代碼即可控制兩端的認(rèn)證功能

示例

jv.loginAuth({
        autoFinish:true,
        timeout:5000
    },result=>{
        // 結(jié)果監(jiān)聽
        let code = result.code;
        let loginToken = result.content;
        let operator = result.operator;

    },event=>{
        // 事件監(jiān)聽
        let code = result.code;
        let eventDesc = result.content;
    })

這里就不重復(fù)接口定義了,更多 API 參考:https://github.com/jpush/jverification-hbuilder-plugin/blob/master/doc/API.md

插件打包

如何打包 uniapp 插件

認(rèn)證打包注意事項(xiàng)

我們?cè)谂渲霉こ虝r(shí)戏仓,預(yù)留了 appkey 和 channel 的配置,所以在打包需要?jiǎng)討B(tài)配置兩個(gè)參數(shù)亡鼠,參考配置出 manifest赏殃,動(dòng)態(tài)參數(shù)關(guān)鍵看 parameters 部分。

{
    "name": "JIGUANG-JVerification",
    "id": "JIGUANG-JVerification",
    "version": "1.0.0",
    "description": "極光認(rèn)證Hbuilder插件",
    "_dp_type":"nativeplugin",
    "_dp_nativeplugin":{
        "ios": {
            "plugins": [{
                "type": "module",
                "name": "JIGUANG-JVerification",
                "class": "JVerificationModule"
            }],
            "integrateType": "framework",
            "deploymentTarget": "8.0",
            "frameworks": [
                "AdSupport.framework",
                "CoreLocation.framework",
                "CFNetwork.framework",
                "CoreFoundation.framework",
                "libresolv.tbd",
                "libz.tbd",
                "libc++.1.tbd",
                "CoreTelephony.framework",
                "SystemConfiguration.framework",
                "Security.framework",
                "CoreGraphics.framework",
                "libsqlite3.tbd",
                "MobileCoreServices.framework"
            ],
            "resources": [
                "JVerificationResource.bundle"
            ],
            "parameters": {  
                "JPUSH_APPKEY_IOS": {  
                    "des": "[iOS]極光 portal 配置應(yīng)用信息時(shí)分配的 AppKey",  
                    "key": "JVerification:APP_KEY"  
                },
                "JPUSH_CHANNEL_IOS": {  
                    "des": "[iOS]用于統(tǒng)計(jì)分發(fā)渠道间涵,不需要可填默認(rèn)值 developer-default",  
                    "key": "JVerification:CHANNEL"  
                }
            }
        },
        "android": {
            "plugins": [
                {
                    "type": "module",
                    "name": "JIGUANG-JVerification",
                    "class": "cn.jiguang.uniplugin_jverification.JVerificationWXModule"
                }
            ],
            "integrateType": "aar",
            "minSdkVersion": "16",
            "permissions": [
                "android.permission.INTERNET",
                "android.permission.READ_PHONE_STATE",
                "android.permission.WRITE_EXTERNAL_STORAGE",
                "android.permission.ACCESS_NETWORK_STATE",
                "android.permission.ACCESS_WIFI_STATE",
                "android.permission.CHANGE_NETWORK_STATE",
                "android.permission.WRITE_SETTINGS",
                "android.permission.SYSTEM_ALERT_WINDOW",
                "android.permission.CHANGE_WIFI_STATE",
                "android.permission.GET_TASKS",
                "android.permission.VIBRATE",
                "android.permission.WAKE_LOCK"
            ],
            "abis": [  
                "armeabi-v7a",  
                "arm64-v8a",
                "x86"  
            ],
            "parameters": {  
                "JPUSH_APPKEY_ANDROID": {  
                    "des": "[Android]極光 portal 配置應(yīng)用信息時(shí)分配的 AppKey",  
                    "key": "JPUSH_APPKEY"  
                },
                "JPUSH_CHANNEL_ANDROID":{
                    "des": "[Android]用于統(tǒng)計(jì)分發(fā)渠道仁热,不需要可填默認(rèn)值 developer-default",  
                    "key": "JPUSH_CHANNEL"
                }
            }
        }
    }
}

打包后插件名和插件 id 為 JIGUANG-JVerification,打包后插件工程目錄:


插件接入

  • 1.將 nativeplugins/JIGUANG-JVerification 導(dǎo)入項(xiàng)目對(duì)應(yīng)位置浑厚。

  • 2.項(xiàng)目 manifest.json 中接入 JIGUANG-JVerification 插件。并配置好 appkey(極光 portal 注冊(cè)分配)根盒,channel 信息钳幅。

  • 3.在項(xiàng)目中引用插件即可

const jv = uni.requireNativePlugin('JIGUANG-JVerification');

結(jié)尾

最終開發(fā)出的認(rèn)證插件及源碼已開源,點(diǎn)擊前往炎滞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敢艰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子册赛,更是在濱河造成了極大的恐慌钠导,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件森瘪,死亡現(xiàn)場(chǎng)離奇詭異牡属,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扼睬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門逮栅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事措伐√叵耍” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵侥加,是天一觀的道長捧存。 經(jīng)常有香客問我,道長担败,這世上最難降的妖魔是什么昔穴? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮氢架,結(jié)果婚禮上傻咖,老公的妹妹穿的比我還像新娘。我一直安慰自己岖研,他們只是感情好卿操,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孙援,像睡著了一般害淤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拓售,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天窥摄,我揣著相機(jī)與錄音,去河邊找鬼础淤。 笑死崭放,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸽凶。 我是一名探鬼主播币砂,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼玻侥!你這毒婦竟也來了决摧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤凑兰,失蹤者是張志新(化名)和其女友劉穎掌桩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姑食,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡波岛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了音半。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盆色。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灰蛙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隔躲,到底是詐尸還是另有隱情摩梧,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布宣旱,位于F島的核電站仅父,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浑吟。R本人自食惡果不足惜笙纤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望组力。 院中可真熱鬧省容,春花似錦、人聲如沸燎字。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽候衍。三九已至笼蛛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛉鹿,已是汗流浹背滨砍。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妖异,地道東北人惋戏。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像他膳,于是被迫代替她去往敵國和親响逢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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