首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标C/ Mac / Yosemite :使用新的CryptoTokenKit API读取智能卡

目标C/ Mac / Yosemite :使用新的CryptoTokenKit API读取智能卡
EN

Stack Overflow用户
提问于 2015-01-18 13:28:56
回答 2查看 1.4K关注 0票数 1

我试图用yosemite (CryptoTokenKit)发布的新API读取智能卡的详细信息。

我能够得到插槽的名称,但是得到插槽的回调函数似乎没有返回。

代码语言:javascript
复制
NSLog(@"START OF PROGRAM");
TKSmartCardSlotManager *manager = [TKSmartCardSlotManager defaultManager];

if(manager != NULL){

   NSArray *slots = [manager slotNames];

   if([slots count]>0){

        NSString *slotName = [slots objectAtIndex:0];

        NSLog(@"Slot Name : %@",slotName);

        [manager getSlotWithName:slotName reply:^(TKSmartCardSlot *slot) {
               NSLog(@"slot -- >%@",slot);
            }];
   }
   else{
        NSLog(@"no slots available");
   }

}else{
       NSLog(@"Card manager is null");
    }

 NSLog(@"END OF PROGRAM");
}

结果如下,

代码语言:javascript
复制
#
2015-01-18 17:16:37.584 emiratesID-Coca[4449:31081] START OF PROGRAM
2015-01-18 17:16:37.588 emiratesID-Coca[4449:31081] Slot Name : OMNIKEY CardMan (076B:3021) 3021
2015-01-18 17:16:37.588 emiratesID-Coca[4449:31081] END OF PROGRAM

回调块没有被呼叫,我是不是漏了什么东西?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-22 07:02:33

显然,回调块是异步块,因此在上面的代码中程序不等待结果,并且在异步块完成其执行之前存在。

为了让主线程等待异步结果,必须进行适当的同步。请参阅以下更新的代码(标记为新的更改):

代码语言:javascript
复制
#
NSLog(@"START OF PROGRAM");


TKSmartCardSlotManager *manager = [TKSmartCardSlotManager defaultManager];

if(manager != NULL){

NSArray *slots = [manager slotNames];

if([slots count]>0){

    NSString *slotName = [slots objectAtIndex:0];


    NSLog(@"Slot Name : %@",slotName);

    dispatch_semaphore_t sema = dispatch_semaphore_create(0); // NEW

    [manager getSlotWithName:slotName reply:^(TKSmartCardSlot *slot) {

        //<#code#>

        NSLog(@"slot instance ---  %d",[[slot makeSmartCard] valid]);

        dispatch_semaphore_signal(sema); // NEW


    }];


    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); // NEW

}else{

    NSLog(@"no slots available");

}


}else{
    NSLog(@"Card manager is null");
}

NSLog(@"END OF PROGRAM");

######

根据上述代码,结果如下-

代码语言:javascript
复制
#
   START OF PROGRAM
   Slot Name : OMNIKEY CardMan (076B:3021) 3021
   slot instance ---  <TKSmartCardSlot: 0x600000080140>
   END OF PROGRAM

#
票数 0
EN

Stack Overflow用户

发布于 2015-01-19 08:24:27

您是否在控制台/日志中看到"ctk:连接到插槽注册服务器失败“?(即com.apple.security.smartcard的权利设置为布尔值:YES)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28010185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档