ios绑定更新
This commit is contained in:
parent
1de8801c69
commit
763c12f86e
@ -7,39 +7,48 @@ namespace NfcLock.Ios.Binding
|
|||||||
[DisableDefaultCtor]
|
[DisableDefaultCtor]
|
||||||
interface NFCManager
|
interface NFCManager
|
||||||
{
|
{
|
||||||
// -(void)startScan;
|
// +(void)startScan;
|
||||||
|
[Static]
|
||||||
[Export ("startScan")]
|
[Export ("startScan")]
|
||||||
void StartScan ();
|
void StartScan ();
|
||||||
|
|
||||||
// -(void)endScan;
|
// +(void)endScan;
|
||||||
|
[Static]
|
||||||
[Export ("endScan")]
|
[Export ("endScan")]
|
||||||
void EndScan ();
|
void EndScan ();
|
||||||
|
|
||||||
// -(void)endScanWithErrorMessage:(NSString * _Nonnull)errorMessage;
|
// +(void)endScanWithErrorMessage:(NSString * _Nonnull)errorMessage;
|
||||||
|
[Static]
|
||||||
[Export ("endScanWithErrorMessage:")]
|
[Export ("endScanWithErrorMessage:")]
|
||||||
void EndScanWithErrorMessage (string errorMessage);
|
void EndScanWithErrorMessage (string errorMessage);
|
||||||
|
|
||||||
// -(void)setLoopCbWithCb:(id)cb;
|
// +(void)setLoopCbWithCb:(id)cb;
|
||||||
|
[Static]
|
||||||
[Export ("setLoopCbWithCb:")]
|
[Export ("setLoopCbWithCb:")]
|
||||||
void SetLoopCbWithCb (NSObject cb);
|
void SetLoopCbWithCb (NSObject cb);
|
||||||
|
|
||||||
// -(void)setFinishedCbWithCb:(void (^ _Nonnull)(void))cb;
|
// +(void)setFinishedCbWithCb:(void (^ _Nonnull)(void))cb;
|
||||||
|
[Static]
|
||||||
[Export ("setFinishedCbWithCb:")]
|
[Export ("setFinishedCbWithCb:")]
|
||||||
void SetFinishedCbWithCb (Action cb);
|
void SetFinishedCbWithCb (Action cb);
|
||||||
|
|
||||||
// -(void)setChargingCbWithCb:(void (^ _Nonnull)(NSString * _Nonnull, int))cb;
|
// +(void)setChargingCbWithCb:(void (^ _Nonnull)(NSString * _Nonnull, int))cb;
|
||||||
|
[Static]
|
||||||
[Export ("setChargingCbWithCb:")]
|
[Export ("setChargingCbWithCb:")]
|
||||||
void SetChargingCbWithCb (Action<NSString, int> cb);
|
void SetChargingCbWithCb (Action<NSString, int> cb);
|
||||||
|
|
||||||
// -(void)setControllingCbWithCb:(void (^ _Nonnull)(NSString * _Nonnull, int))cb;
|
// +(void)setControllingCbWithCb:(void (^ _Nonnull)(NSString * _Nonnull, int))cb;
|
||||||
|
[Static]
|
||||||
[Export ("setControllingCbWithCb:")]
|
[Export ("setControllingCbWithCb:")]
|
||||||
void SetControllingCbWithCb (Action<NSString, int> cb);
|
void SetControllingCbWithCb (Action<NSString, int> cb);
|
||||||
|
|
||||||
// -(void)lockWithPassword:(NSString * _Nonnull)password;
|
// +(void)lockWithPassword:(NSString * _Nonnull)password;
|
||||||
|
[Static]
|
||||||
[Export ("lockWithPassword:")]
|
[Export ("lockWithPassword:")]
|
||||||
void LockWithPassword (string password);
|
void LockWithPassword (string password);
|
||||||
|
|
||||||
// -(void)unlockWithPassword:(NSString * _Nonnull)password;
|
// +(void)unlockWithPassword:(NSString * _Nonnull)password;
|
||||||
|
[Static]
|
||||||
[Export ("unlockWithPassword:")]
|
[Export ("unlockWithPassword:")]
|
||||||
void UnlockWithPassword (string password);
|
void UnlockWithPassword (string password);
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@ -3,32 +3,88 @@ import NFCSDK
|
|||||||
|
|
||||||
@objc(NFCManager)
|
@objc(NFCManager)
|
||||||
public class NFCManager: NSObject, NFCTagReaderSessionDelegate {
|
public class NFCManager: NSObject, NFCTagReaderSessionDelegate {
|
||||||
|
// 单例实例(改为实例属性,而非直接用 static 方法)
|
||||||
static let instance = NFCManager()
|
static let instance = NFCManager()
|
||||||
private let helper = IOSNFCHelper()
|
// NFCSDK 助手(改为实例属性)
|
||||||
private var session: NFCTagReaderSession?
|
let helper = IOSNFCHelper()
|
||||||
private var readyToStart = true
|
// NFC 会话(改为实例属性)
|
||||||
private var controlName = ""
|
var session: NFCTagReaderSession?
|
||||||
|
// 控制状态(改为实例属性)
|
||||||
|
var readyToStart = true
|
||||||
|
var controlName = ""
|
||||||
|
|
||||||
private override init() {
|
private override init() {
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - 对外暴露的 OC 调用方法(通过单例调用实例方法)
|
||||||
|
@objc
|
||||||
|
public static func startScan() {
|
||||||
|
instance._startScan()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
public func startScan() {
|
public static func endScan() {
|
||||||
if (readyToStart) {
|
instance._endScan()
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
public static func endScan(errorMessage: String) {
|
||||||
|
instance._endScan(errorMessage: errorMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
public static func setLoopCb(cb: @escaping (String, Bool, Int) -> Bool) {
|
||||||
|
instance._setLoopCb(cb: cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
public static func setFinishedCb(cb: @escaping () -> Void) {
|
||||||
|
instance._setFinishedCb(cb: cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
public static func setChargingCb(cb: @escaping (String, Int) -> Void) {
|
||||||
|
instance._setChargingCb(cb: cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
public static func setControllingCb(cb: @escaping (String, Int) -> Void) {
|
||||||
|
instance._setControllingCb(cb: cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
public static func lock(password: String) {
|
||||||
|
instance._lock(password: password)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
public static func unlock(password: String) {
|
||||||
|
instance._unlock(password: password)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - 实际的实例方法(核心逻辑)
|
||||||
|
private func _startScan() {
|
||||||
|
// 1. 检查设备是否支持 NFC
|
||||||
|
guard NFCTagReaderSession.readingAvailable else {
|
||||||
|
_endScan(errorMessage: "设备不支持NFC功能")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if readyToStart {
|
||||||
readyToStart = false
|
readyToStart = false
|
||||||
|
// 2. 修复语法错误:移除末尾多余的逗号
|
||||||
session = NFCTagReaderSession(
|
session = NFCTagReaderSession(
|
||||||
pollingOption: [.iso14443],
|
pollingOption: [.iso14443],
|
||||||
delegate: self,
|
delegate: self, // 这里必须传实例 self,而非静态的 self
|
||||||
queue: nil,
|
queue: nil
|
||||||
)
|
)
|
||||||
session?.alertMessage = "请将 iPhone 靠近设备"
|
session?.alertMessage = "请将 iPhone 靠近设备"
|
||||||
session?.begin()
|
session?.begin()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
private func _endScan() {
|
||||||
public func endScan() {
|
|
||||||
session?.invalidate()
|
session?.invalidate()
|
||||||
Task {
|
Task {
|
||||||
try? await Task.sleep(nanoseconds: 2_000_000_000)
|
try? await Task.sleep(nanoseconds: 2_000_000_000)
|
||||||
@ -36,8 +92,7 @@ public class NFCManager: NSObject, NFCTagReaderSessionDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
private func _endScan(errorMessage: String) {
|
||||||
public func endScan(errorMessage: String) {
|
|
||||||
session?.invalidate(errorMessage: errorMessage)
|
session?.invalidate(errorMessage: errorMessage)
|
||||||
Task {
|
Task {
|
||||||
try? await Task.sleep(nanoseconds: 2_000_000_000)
|
try? await Task.sleep(nanoseconds: 2_000_000_000)
|
||||||
@ -45,28 +100,98 @@ public class NFCManager: NSObject, NFCTagReaderSessionDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func _setLoopCb(cb: @escaping (String, Bool, Int) -> Bool) {
|
||||||
|
helper.setLoopCb { id, isNew, rssi in
|
||||||
|
let isNew0 = isNew.boolValue
|
||||||
|
let rssi0 = rssi?.intValue ?? 0
|
||||||
|
self.session?.alertMessage = "检测到设备"
|
||||||
|
return KotlinBoolean(bool: cb(id, isNew0, rssi0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func _setFinishedCb(cb: @escaping () -> Void) {
|
||||||
|
helper.setFinishedCb(cb: {
|
||||||
|
self._endScan()
|
||||||
|
cb()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private func _setChargingCb(cb: @escaping (String, Int) -> Void) {
|
||||||
|
helper.setChargingCb { res, level in
|
||||||
|
let level0 = level?.intValue ?? 0
|
||||||
|
switch res {
|
||||||
|
case "OK":
|
||||||
|
self.session?.alertMessage = "充电中(\(level0)%)"
|
||||||
|
case "UNAUTHORIZED":
|
||||||
|
self._endScan(errorMessage: "验证失败")
|
||||||
|
default:
|
||||||
|
self._endScan(errorMessage: "NFC 标签丢失")
|
||||||
|
}
|
||||||
|
cb(res, level0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func _setControllingCb(cb: @escaping (String, Int) -> Void) {
|
||||||
|
helper.setControllingCb { res, progress in
|
||||||
|
let progress0 = progress?.intValue ?? 0
|
||||||
|
switch res {
|
||||||
|
case "OK":
|
||||||
|
if progress0 < 100 {
|
||||||
|
self.session?.alertMessage = "\(self.controlName)中(\(progress0)%)"
|
||||||
|
} else {
|
||||||
|
self.session?.alertMessage = "\(self.controlName)成功"
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
self._endScan(errorMessage: "\(self.controlName)失败")
|
||||||
|
}
|
||||||
|
cb(res, progress0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func _lock(password: String) {
|
||||||
|
controlName = "关锁"
|
||||||
|
helper.lock(password: password)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func _unlock(password: String) {
|
||||||
|
controlName = "开锁"
|
||||||
|
helper.unlock(password: password)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - NFCTagReaderSessionDelegate 协议方法(必须是实例方法)
|
||||||
|
// 1. 可选方法:会话激活时调用(非必选,但建议保留)
|
||||||
public func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
|
public func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
|
||||||
print("NFC Session Active")
|
print("NFC Session Active")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 2. 必选方法:会话失效/出错时调用
|
||||||
public func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
|
public func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
|
||||||
endScan()
|
// 区分用户主动取消和真实错误
|
||||||
|
if let nfcError = error as? NFCReaderError {
|
||||||
|
if nfcError.code != .readerSessionInvalidationErrorUserCanceled {
|
||||||
|
print("NFC 会话错误: \(nfcError.localizedDescription)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_endScan()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. 必选方法:检测到 NFC 标签时调用
|
||||||
public func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [CoreNFC.NFCTag]) {
|
public func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [CoreNFC.NFCTag]) {
|
||||||
|
guard let tag = tags.first else {
|
||||||
|
_endScan(errorMessage: "未检测到有效NFC标签")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
guard let tag = tags.first else { return }
|
session.connect(to: tag) { [weak self] error in
|
||||||
|
guard let self = self else { return } // 避免循环引用
|
||||||
|
|
||||||
session.connect(to: tag) { error in
|
if let error = error {
|
||||||
if error != nil {
|
self._endScan(errorMessage: "NFC 连接失败: \(error.localizedDescription)")
|
||||||
self.endScan(errorMessage: "NFC 连接失败")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
switch tag {
|
switch tag {
|
||||||
|
|
||||||
case .miFare(let miFareTag):
|
case .miFare(let miFareTag):
|
||||||
|
|
||||||
self.helper.setTransceiver { data, resolve in
|
self.helper.setTransceiver { data, resolve in
|
||||||
let length = Int(data.size)
|
let length = Int(data.size)
|
||||||
var buffer = [UInt8](repeating: 0, count: length)
|
var buffer = [UInt8](repeating: 0, count: length)
|
||||||
@ -76,8 +201,8 @@ public class NFCManager: NSObject, NFCTagReaderSessionDelegate {
|
|||||||
let command = Data(buffer)
|
let command = Data(buffer)
|
||||||
|
|
||||||
miFareTag.sendMiFareCommand(commandPacket: command) { response, error in
|
miFareTag.sendMiFareCommand(commandPacket: command) { response, error in
|
||||||
if error != nil {
|
if let error = error {
|
||||||
self.endScan(errorMessage: "NFC 标签丢失")
|
self._endScan(errorMessage: "NFC 标签丢失: \(error.localizedDescription)")
|
||||||
let _ = resolve(KotlinByteArray(size: 0))
|
let _ = resolve(KotlinByteArray(size: 0))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -94,81 +219,13 @@ public class NFCManager: NSObject, NFCTagReaderSessionDelegate {
|
|||||||
do {
|
do {
|
||||||
try await self.helper.process()
|
try await self.helper.process()
|
||||||
} catch {
|
} catch {
|
||||||
print("process error")
|
print("process error: \(error.localizedDescription)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
self.endScan(errorMessage: "不是 NFC-A 标签")
|
self._endScan(errorMessage: "不是 NFC-A 标签")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
|
||||||
public func setLoopCb(cb: @escaping (String, Bool, Int) -> Bool) {
|
|
||||||
helper.setLoopCb { id, isNew, rssi in
|
|
||||||
let isNew0 = isNew.boolValue
|
|
||||||
let rssi0 = rssi?.intValue ?? 0
|
|
||||||
self.session?.alertMessage = "检测到设备"
|
|
||||||
return KotlinBoolean(bool: cb(id, isNew0, rssi0))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc
|
|
||||||
public func setFinishedCb(cb: @escaping () -> Void) {
|
|
||||||
helper.setFinishedCb(cb: {
|
|
||||||
self.endScan()
|
|
||||||
cb()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc
|
|
||||||
public func setChargingCb(cb: @escaping (String, Int) -> Void) {
|
|
||||||
helper.setChargingCb { res, level in
|
|
||||||
let level0 = level?.intValue ?? 0
|
|
||||||
switch (res) {
|
|
||||||
case "OK":
|
|
||||||
self.session?.alertMessage = "充电中(\(level0)%)"
|
|
||||||
break
|
|
||||||
case "UNAUTHORIZED":
|
|
||||||
self.endScan(errorMessage: "验证失败")
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
self.endScan(errorMessage: "NFC 标签丢失")
|
|
||||||
}
|
|
||||||
cb(res, level0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc
|
|
||||||
public func setControllingCb(cb: @escaping (String, Int) -> Void) {
|
|
||||||
helper.setControllingCb { res, progress in
|
|
||||||
let progress0 = progress?.intValue ?? 0
|
|
||||||
switch (res) {
|
|
||||||
case "OK":
|
|
||||||
if (progress0 < 100) {
|
|
||||||
self.session?.alertMessage = "\(self.controlName)中(\(progress0)%)"
|
|
||||||
} else {
|
|
||||||
self.session?.alertMessage = "\(self.controlName)成功"
|
|
||||||
}
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
self.endScan(errorMessage: "\(self.controlName)失败")
|
|
||||||
}
|
|
||||||
cb(res, progress0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc
|
|
||||||
public func lock(password: String) {
|
|
||||||
controlName = "关锁"
|
|
||||||
helper.lock(password: password)
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc
|
|
||||||
public func unlock(password: String) {
|
|
||||||
controlName = "开锁"
|
|
||||||
helper.unlock(password: password)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user