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

#