Sample code for 30+ languages & platforms
Objective-C

PC/SC Get Card UID

See more SCard Examples

Sends the APDU command to get a card's UID.

Chilkat Objective-C Downloads

Objective-C
#import <CkoSCard.h>
#import <CkoBinData.h>

BOOL success = NO;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

CkoSCard *scard = [[CkoSCard alloc] init];

// First establish a context to the PC/SC Resource Manager
success = [scard EstablishContext: @"user"];
if (success == NO) {
    NSLog(@"%@",scard.LastErrorText);
    return;
}

// Use your own smart card reader name here.
success = [scard Connect: @"ACS ACR122 0" shareMode: @"shared" preferredProtocol: @"no_preference"];
if (success == NO) {
    NSLog(@"%@",scard.LastErrorText);
    return;
}

NSLog(@"%@%@",@"Connected reader: ",scard.ConnectedReader);
NSLog(@"%@%@",@"Active protocol: ",scard.ActiveProtocol);
NSLog(@"%@%@",@"ATR: ",scard.CardAtr);
NSLog(@"%@%@",@"Reader Status: ",scard.ReaderStatus);

//  Send the APDU command 0xFF, 0xCA, 0x00, 0x00, 0x00
CkoBinData *bdRecv = [[CkoBinData alloc] init];
success = [scard TransmitHex: scard.ActiveProtocol apduHex: @"FFCA000000" bdRecv: bdRecv maxRecvLen: [NSNumber numberWithInt: 32]];
if (success == YES) {

    NSLog(@"%@%@",@"Received: ",[bdRecv GetEncoded: @"hex"]);

    // The UID is the returned data without the final 2 bytes.
    int numBytes = [bdRecv.NumBytes intValue];
    if (numBytes > 2) {
        NSLog(@"%@%@",@"UID: ",[bdRecv GetEncodedChunk: [NSNumber numberWithInt: 0] numBytes: [NSNumber numberWithInt: (numBytes - 2)] encoding: @"hex"]);
    }

}
else {
    NSLog(@"%@",scard.LastErrorText);
}

// Disconnect from this reader.
success = [scard Disconnect: @"leave"];
if (success == NO) {
    NSLog(@"%@",scard.LastErrorText);
}

// Applications should always release the context when finished.
success = [scard ReleaseContext];
if (success == NO) {
    NSLog(@"%@",scard.LastErrorText);
}