我试图用yosemite (CryptoTokenKit)发布的新API读取智能卡的详细信息。
我能够得到插槽的名称,但是得到插槽的回调函数似乎没有返回。
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");
}结果如下,
#
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回调块没有被呼叫,我是不是漏了什么东西?
提前谢谢。
发布于 2015-01-22 07:02:33
显然,回调块是异步块,因此在上面的代码中程序不等待结果,并且在异步块完成其执行之前存在。
为了让主线程等待异步结果,必须进行适当的同步。请参阅以下更新的代码(标记为新的更改):
#
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");
######根据上述代码,结果如下-
#
START OF PROGRAM
Slot Name : OMNIKEY CardMan (076B:3021) 3021
slot instance --- <TKSmartCardSlot: 0x600000080140>
END OF PROGRAM
#发布于 2015-01-19 08:24:27
您是否在控制台/日志中看到"ctk:连接到插槽注册服务器失败“?(即com.apple.security.smartcard的权利设置为布尔值:YES)。
https://stackoverflow.com/questions/28010185
复制相似问题