<iOS> 设备验证 指纹验证

iOS 设备验证接口从iOS8开始开放,暂时无法获取指纹数据,api只返回验证成功与否.指纹功能5s以上设备才有.


使用步骤:
1.导入系统库
#import <LocalizedAuthentication/LocalizedAuthentication.h>

2.api从iOS8才开始开放,所以先要判断系统版本
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0f) {

    3.创建设备验证上下文
    LAContext *context  = [[LAContext alloc] init];
    //设置使用touchID(指纹)验证的时间间隔,在这个间隔内,下次调起指纹验证将直接通过.
    //例如设备刚解锁,那么15s(如下)内再次调起指纹时不需要触摸home键直接通过验证
    context.touchIDAuthenticationAllowableReuseDuration = 15;

    4.先试探本设备开放的验证策略
    NSError *error = nil;
    if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
        //验证策略有两种LAPolicyDeviceOwnerAuthentication    LAPolicyDeviceOwnerAuthenticationWithBiometrics
        //试探和后面开始验证应该使用相同的策略.就好像不会canOpenURL:百度,结果openURL:脸书
        //LAPolicyDeviceOwnerAuthentication:该策略首先使用指纹,如果未录入指纹或者有可能设备不支持则会切换到设备密码验证
        //LAPolicyDeviceOwnerAuthenticationWithBiometrics:该策略只是用指纹,如果未录入指纹或者设备不支持则会返回失败
        //失败情况下可以通过error获取失败原因,[error code]为-5说明设备没有设置密码或者指纹.
        //-7则说明未注册指纹(只有在LAPolicyDeviceOwnerAuthenticationWithBiometrics策略下才会出现-7)

        5.开始验证
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"提示语" reply:^(BOOL success, NSError *Nullable error) {
            //success表示设备验证成功或者失败
            //error可以获取失败原因,[error code]为-2说明是用户取消了验证(点击了取消)
            //-4说明是系统取消了,可能是此时有电话呼入或者用户按下home键`电源键等等.也有可能出现-7,见上
        }];
    }
}

只需要指纹的话就用LAPolicyDeviceOwnerAuthenticationWithBiometrics策略,因为使用指纹的时候往往是为了避免输入密码.使用LAPolicyDeviceOwnerAuthentication策略的话如果未设置指纹或者不支持指纹有可能会弹出设备密码输入界面,这样并不能简化输入密码的流程.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:为了确保代码的正确性和安全性,以下是修改后的代码: ```cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <sstream> #include <string> #include <fstream> #include <vector> #include <winsock.h> #pragma comment(lib,"ws2_32.lib") void SaveVideo(const std::string& filePath, const std::vector<char>& videoData) { std::ofstream file(filePath, std::ios::out | std::ios::binary); if (file.is_open()) { file.write(videoData.data(), videoData.size()); file.close(); std::cout << "Video saved successfully." << std::endl; } else { std::cerr << "Failed to save video." << std::endl; } } int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "Failed to initialize winsock." << std::endl; return 1; } SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == INVALID_SOCKET) { std::cerr << "Failed to create socket." << std::endl; WSACleanup(); return 1; } sockaddr_in serverAddress{}; serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(12345); // 修改为服务端的端口号 serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); // 修改为服务端的IP地址 if (connect(clientSocket, reinterpret_cast<sockaddr*>(&serverAddress), sizeof(serverAddress)) != 0) { std::cerr << "Failed to connect to the server." << std::endl; closesocket(clientSocket); WSACleanup(); return 1; } std::string filePath = "video.mp4"; // 修改为要保存的视频文件路径 std::ifstream file(filePath, std::ios::in | std::ios::binary); if (file.is_open()) { std::vector<char> videoData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); file.close(); // 发送视频数据到服务端 if (send(clientSocket, videoData.data(), videoData.size(), 0) == SOCKET_ERROR) { std::cerr << "Failed to send video data." << std::endl; } else { std::cout << "Video data sent successfully." << std::endl; } // 保存视频到本地 SaveVideo("received_video.mp4", videoData); } else { std::cerr << "Failed to open video file." << std::endl; } closesocket(clientSocket); WSACleanup(); return 0; } ``` 请确保以下几点: 1. 修改 `serverAddress.sin_port` 为服务端的端口号。 2. 修改 `serverAddress.sin_addr.s_addr` 为服务端的IP地址。 3. 修改 `filePath` 为要保存的视频文件路径。 4. 确保链接了 `ws2_32.lib` 库。 注意:这是一个简单的示例代码,仅展示了如何将视频数据发送到服务端并将其保存到本地。实际情况可能需要进行更多的错误处理和安全性考虑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值