Objective C / Mac / Yosemite : 使用新的 CryptoTokenKit 读取智能卡 API
Objective C / Mac / Yosemite : Read smart card with new CryptoTokenKit API
我正在尝试使用 yosemite (CryptoTokenKit) 发布的新 API 读取智能卡详细信息。
我可以获取插槽的名称,但获取插槽的回调函数似乎没有 return。
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
回调块没有被调用,我是不是遗漏了什么?
提前致谢。
您是否偶然在 console/your 日志中看到 "ctk: connection to slot registration server failed"? (即 com.apple.security.smartcard' 权利设置为 Boolean:YES)。
显然回调块是一个异步块,因此在上面的代码中 - 程序不等待结果并在异步块完成执行之前就存在
为了让主线程等待异步结果,必须涉及适当的同步。请参阅下面的更新代码(标记为新的更改):
#
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
#
我正在尝试使用 yosemite (CryptoTokenKit) 发布的新 API 读取智能卡详细信息。
我可以获取插槽的名称,但获取插槽的回调函数似乎没有 return。
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
回调块没有被调用,我是不是遗漏了什么?
提前致谢。
您是否偶然在 console/your 日志中看到 "ctk: connection to slot registration server failed"? (即 com.apple.security.smartcard' 权利设置为 Boolean:YES)。
显然回调块是一个异步块,因此在上面的代码中 - 程序不等待结果并在异步块完成执行之前就存在
为了让主线程等待异步结果,必须涉及适当的同步。请参阅下面的更新代码(标记为新的更改):
#
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
#