云端笔记
云端笔记
  • 发布:2017-05-01 15:31
  • 更新:2018-10-11 09:12
  • 阅读:12233

IOS指纹识别插件开发方法

分类:5+ SDK

更新:HTML5+已经自带指纹识别。http://www.html5plus.org/doc/zh_cn/fingerprint.html。以下文档已过期。

之前一直考虑使用Native.js调用原生方法去实现指纹识别,但是,发现不行,因为Native.js如果调用原生方法中含有闭包的情况时,JS的回调函数无法正确识别参数的内容。
下面来说一下插件的开发,发现还是插件的开发灵活方便。
开发插件需要具备以下准备:
1、MAC系统并安装XCode。
2、按照官方文档配置好5+SDK的配置,并且调试成功。

以上准备工作完成后,就可以开发了:
1、在项目工程中,新建一个FingerprintIdent类,内容如下:
FingerprintIdent.h文件

#import <UIKit/UIKit.h>  
#import <PGPlugin.h>  
#import <PGMethod.h>  

@interface FingerprintIdent : PGPlugin  

// 是否支持指纹识别  
- (void)canEvaluatePolicy:(PGMethod*)command;  

// 弹出指纹识别窗口的方法  
- (void)evaluatePolicy:(PGMethod*)command;  

@end

FingerprintIdent.m文件

#import "FingerprintIdent.h"  
#import <LocalAuthentication/LocalAuthentication.h>  

@implementation FingerprintIdent  

- (void)canEvaluatePolicy:(PGMethod*)command{  
    if(command) {  
        NSString* cbId = [command.arguments objectAtIndex:0];  
        LAContext *lacontent = [[LAContext alloc] init];  
        NSError *error = nil;  
        if([lacontent canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]){  
            [self toSucessCallback:cbId withInt:1];  
        } else {  
            [self toSucessCallback:cbId withInt:0];  
        }  

    }  
}  

- (void)evaluatePolicy:(PGMethod*)command{  
    if(command) {  
        NSString* cbId = [command.arguments objectAtIndex:0];  
        NSString* pArgument1 = [command.arguments objectAtIndex:1];  
        LAContext *lacontent = [[LAContext alloc] init];  
        NSError *error = nil;  
        if([lacontent canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]){  
            [lacontent evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:pArgument1 reply:^(BOOL success, NSError * _Nullable error) {  
                NSMutableDictionary *result = [NSMutableDictionary dictionary];  
                if(success){  
                    [result setValue:@"" forKey:@"error"];  
                } else {  
                    NSString *errorMsg;  
                    switch (error.code) {  
                        case LAErrorSystemCancel:  
                        {  
                            errorMsg = @"切换到其他APP,系统取消验证Touch ID";  
                            break;  
                        }  
                        case LAErrorUserCancel:  
                        {  
                            errorMsg = @"用户取消验证Touch ID";  
                            break;  
                        }  
                        case LAErrorUserFallback:  
                        {  
                            errorMsg = @"用户选择输入密码,切换主线程处理";  
                            break;  
                        }  
                        default:  
                        {  
                            errorMsg = @"其他情况,切换主线程处理";  
                            break;  
                        }  
                    }  
                    [result setValue:errorMsg forKey:@"error"];  
                }  
                NSData *data=[NSJSONSerialization dataWithJSONObject:result options:NSJSONWritingPrettyPrinted error:nil];  
                NSString *jsonStr=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
                [self toSucessCallback:cbId withString:jsonStr];  
            }];  
        } else {  
            [self toSucessCallback:cbId withInt:0];  
        }  
    }  
}  
@end

2、接下来,设置几项内容。
在Xcode项目中找到PandoraApi.bundle >> feature.plist
在里面添加一项 key为FingerprintIdent, type为Dictionary。在里面新建一子项 key为class ,type为String, value为FingerprintIdent。在新建一个子项 key为global ,type为Boolean, value为NO。

3、编辑你的测试页面test.html
内容如下:

<!doctype html>  
<html>  
    <head>  
        <meta charset="UTF-8">  
        <title>登录</title>  
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">  
        <meta name="apple-mobile-web-app-capable" content="yes">  
        <meta name="apple-mobile-web-app-status-bar-style" content="black">  
    </head>  
    <body>  
        <div class="content">  
                    <div class="button" onclick="iscanEvaluatePolicy()">是否支持指纹识别</div>  
                    <div class="button" onclick="toEvaluatePolicy()">指纹识别</div>  
        </div>  
    <script src="js/mui.min.js"></script>  
    <script type="text/javascript">  
      document.addEventListener( "plusready",  function() {  
        // 声明的JS“扩展插件别名”  
        var _BARCODE = 'FingerprintIdent',  
        B = window.plus.bridge;  
        var fingerprintIdent = {  
            canEvaluatePolicy : function (successCallback, errorCallback ) {  
              var success = typeof successCallback !== 'function' ? null : function(args) {  
                successCallback(args);  
              },  
              fail = typeof errorCallback !== 'function' ? null : function(code) {  
                errorCallback(code);  
              };  
              callbackID = B.callbackId(success, fail);  
              // 通知Native层plugintest扩展插件运行”PluginTestFunction”方法  
              return B.exec(_BARCODE, "canEvaluatePolicy", [callbackID]);  
            },  
            evaluatePolicy : function (Argus1, successCallback, errorCallback ) {  
              var success = typeof successCallback !== 'function' ? null : function(args) {  
                successCallback(args);  
              },  
              fail = typeof errorCallback !== 'function' ? null : function(code) {  
                errorCallback(code);  
              };  
              callbackID = B.callbackId(success, fail);  
              // 通知Native层plugintest扩展插件运行”PluginTestFunction”方法  
              return B.exec(_BARCODE, "evaluatePolicy", [callbackID, Argus1]);  
            }  
        };  
        window.plus.fingerprintIdent = fingerprintIdent;  
      }, true );  

    // 是否支持指纹识别  
      function iscanEvaluatePolicy() {  
        plus.fingerprintIdent.canEvaluatePolicy(function( result ) {  
            alert( result);  
          },  
          function(result){  
            //alert(result)  
          });  
      }  
    // 校验指纹识别  
      function toEvaluatePolicy() {  
        plus.fingerprintIdent.evaluatePolicy('请校验指纹', function( result ) {  
            var data = mui.parseJSON(result);  
            if(!data.error) {  
                alert('校验成功');  
            } else {  
               alert( '错误原因:'+data.error);  
            }  
          },  
          function(result){  
            //alert(result)  
          });  
      }  
    </script>  
    </body>  
</html>

OK,至此,IOS指纹识别插件已经开发完成。但是记住,一定要在本地使用XCode调试并打包才会生效。看到官方文档里面的IOS插件实例还是空的,我这提供一个实例。哈哈。

15 关注 分享
DCloud_heavensoft jwenlee Huiqi s***@163.com d***@sina.com 8***@qq.com GCJ 果汁 fanglong x***@vip.qq.com 芒鞋 q***@163.com 移动达人 5***@qq.com 7***@qq.com

要回复文章请先登录注册

5***@qq.com

5***@qq.com

回复 DCloud_heavensoft :
我是自己自定义的原生插件
2018-10-11 09:12
DCloud_heavensoft

DCloud_heavensoft

回复 5***@qq.com :
HTML5+已经自带指纹识别。[http://www.html5plus.org/doc/zh_cn/fingerprint.html](http://www.html5plus.org/doc/zh_cn/fingerprint.html)
2018-10-10 21:41
5***@qq.com

5***@qq.com

真机运行时报HTML5+runtime错误,说打包时未添加XXX模块,请问这是什么原因?
2018-10-10 19:47
23dreamer

23dreamer

怎么才能以进入页面就进行指纹识别,就像支付宝那样
2017-10-26 22:17
回梦無痕

回梦無痕

嗯。插件好用,测试通过。
发现一个有趣现象,如果故意按错几次指纹,然后检测是否支持指纹会返回不支持,指纹验证也会返回0,直到锁屏密码验证重开,苹果真调皮。
所以在验证失败与否那里,应该再加一个判断是否为0。
2017-10-18 09:40
x***@vip.qq.com

x***@vip.qq.com

好贴
2017-07-22 22:07
androidjdx

androidjdx

good job
2017-07-04 20:32
云端笔记

云端笔记 (作者)

回复 1***@qq.com :
不可以
2017-06-22 16:02
1***@qq.com

1***@qq.com

回复 云端笔记 :
离线打包了可以在hbuilder使用吗?
2017-06-22 15:56
云端笔记

云端笔记 (作者)

回复 1***@qq.com :
只能在XCode中使用,需要离线打包。
2017-06-22 15:53