in other functions, I am getting success, such as selectApplication, getApplicationId and others. but while authenticating, getting untraced crashes.
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
guard let tag = tags.first else { return }
// Connect to the tag
session.connect(to: tag) { [weak self] error in
guard let self = self else { return }
if let error = error {
session.invalidate(errorMessage: "Failed to connect: \(error.localizedDescription)")
return
}
switch tag {
case .miFare(let mifare):
let reader = TL_IOSNFCReader(uid: mifare.identifier, historicalBytes: mifare.historicalBytes!)
self.handler = TapLinxApduHandler(reader: reader)
self.handler?.delegate = self
self.tagManager = TLLibraryManager.shared()
self.tagManager?.setApduHandlerWithApduHandler(self.handler)
var desfireWrapper = TL_DESFireWrapper(libraryManager: self.tagManager!)
print(desfireWrapper)
desfireWrapper.setCommandSet(.Native)
desFireEV2 = self.tagManager?.getDESFireEV2Instance()
self.desFireEV2?.selectApplication(withAppID: Int32("0")!) { success in
print("selectApplication: success \(success)")
}
self.desFireEV2?.getApplicationIDs() { success in
print("Get application IDs: success \(success)")
}
self.desFireEV2?.selectApplication(withAppID: Int32(applicationId)!) { success in
print("selectApplication: success \(success)")
}
self.desFireEV2?.getKeyVersion(forKeyNumber: 1) { value, success in
print("Get key version: success \(success)")
}
self.desFireEV2?.getFileIDs() { value, success in
print("Get file IDs: success \(success)")
}
self.desFireEV2?.authenticate(withCardKeyNo: 1, withAuthenticationType: .AES, withAuthKeyType: .AES128, withCommandSetForAuth: .ISO, withAuthkey: aesKeyData, onCompletion: { [weak self] success in
print("authenticate: success", success)
if success {
self?.desFireEV2?.readData(withFileNo: 1, withOffset: 0, withLength: 4) { data, success in
print("readDataWithFileNo: success \(success) - data = \(data)")
}
}
})
}
func apduExchange(withByteArray apduData: Data) -> TL_TagAPDUResponse? {
var dataToreturn = Data()
let semaphore = DispatchSemaphore(value: 0)
mtag?.sendMiFareCommand(commandPacket: apduData) { data, error in
dataToreturn = data
semaphore.signal()
}
_ = semaphore.wait(timeout: .now() + 3.0)
let tl = TL_TagAPDUResponse(responseData: dataToreturn, tag: tagInfo)
return tl
}