更新: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插件实例还是空的,我这提供一个实例。哈哈。
18 个评论
要回复文章请先登录或注册
1***@qq.com
8***@qq.com
云端笔记 (作者)
d***@sina.com
8***@qq.com
云端笔记 (作者)
8***@qq.com
jwenlee