react-native-status-keycard/ios/StatusKeycard.swift

81 lines
2.9 KiB
Swift
Raw Normal View History

2020-11-25 10:24:35 +01:00
import Foundation
import Keycard
2020-11-24 12:29:25 +01:00
@objc(StatusKeycard)
class StatusKeycard: NSObject {
2020-11-25 10:24:35 +01:00
@available(iOS 13.0, *)
private(set) lazy var smartCard: SmartCard? = nil
override init() {
super.init()
if #available(iOS 13.0, *) {
self.smartCard = SmartCard()
}
}
2020-11-25 10:24:35 +01:00
@objc
func nfcIsSupported(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
2020-11-25 10:24:35 +01:00
if #available(iOS 13.0, *) {
resolve(smartCard?.nfcIsSupported())
2020-11-25 10:24:35 +01:00
} else {
resolve(false)
2020-11-25 10:24:35 +01:00
}
}
@objc
func nfcIsEnabled(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
// On iOS NFC is always enabled (if available)
nfcIsSupported(resolve, rejecter: reject)
}
2020-11-25 10:24:35 +01:00
@objc
2020-12-01 14:55:31 +03:00
func openNfcSettings(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
// NFC cannot be enabled/disabled
reject("E_KEYCARD", "Unsupported on iOS", nil)
2020-11-25 10:24:35 +01:00
}
2020-12-01 21:51:39 +01:00
@objc
func `init`(_ pin: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
2020-12-02 17:14:12 +03:00
keycardInvokation(reject) { [unowned self] channel in if #available(iOS 13.0, *) { try self.smartCard?.initialize(channel: channel, pin: pin, resolve: resolve, reject: reject) } }
2020-12-01 21:51:39 +01:00
}
2020-11-25 10:24:35 +01:00
@objc
func signPinless(_ hash: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
keycardInvokation(reject) { [unowned self] channel in if #available(iOS 13.0, *) { try self.smartCard?.signPinless(channel: channel, hash: hash, resolve: resolve, reject: reject)} }
2020-12-02 17:14:12 +03:00
}
@objc
func pair(_ pairingPassword: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
keycardInvokation(reject) { [unowned self] channel in if #available(iOS 13.0, *) { try self.smartCard?.pair(channel: channel, pairingPassword: pairingPassword, resolve: resolve, reject: reject)} }
2020-11-25 10:24:35 +01:00
}
2020-11-25 10:24:35 +01:00
@objc
static func requiresMainQueueSetup() -> Bool {
return true
}
func keycardInvokation(_ reject: @escaping RCTPromiseRejectBlock, body: @escaping (CardChannel) throws -> Void) {
if #available(iOS 13.0, *) {
DispatchQueue.main.async {
var keycardController: KeycardController? = nil;
keycardController = KeycardController(onConnect: { channel in
do {
try body(channel)
keycardController?.stop(alertMessage: "Success")
} catch {
reject("E_KEYCARD", "error", error)
keycardController?.stop(errorMessage: "Read error. Please try again.")
}
}, onFailure: { error in
reject("E_KEYCARD", "disconnected", error)
})
keycardController?.start(alertMessage: "Hold your iPhone near a Status Keycard.")
2020-12-01 21:51:39 +01:00
}
} else {
reject("E_KEYCARD", "unavailable", nil)
}
2020-12-01 21:51:39 +01:00
}
2020-11-24 12:29:25 +01:00
}