iOS-从Objective-C调用的Swift中的NFCTagReaderSessionDelegate不调用tagReaderSession

问题描述

我们使用j2objc从Java交叉编译源开发iOS应用。 因此,该应用的大部分内容都在Objective-C中。

我决定快速实施NFCTagReaderSessionDelegate,因此必须为新应用程序原生实现某些功能,例如NFCTag读取。

为了测试它,我实现了一个自定义的UIButton,按下该按钮将启动NFCTagReaderSession。 它可以与10种不同的NFC标签配合使用。 ISO,mifare等。

接下来,我将Objective-c和Swift设置为可以一起使用,这也可以正常工作。 Objective-c类在Swift中调用函数将启动会话,并且NFCApp似乎正在读取标签

但是就像从Swift-Button启动一样,NFCTagReaderSessionDelegate的接口函数永远不会被调用: func tagReaderSessionDidBecomeActive(_ session:NFCTagReaderSession) func tagReaderSession(_会话:NFCTagReaderSession,didDetect标签:[NFCTag])

我试图用@objc标记tagReaderSessionDidBecomeActive等,但这没什么区别。

工作代码

import CoreNFC
import Foundation
import UIKit

class ScanNfcTestButton: BauhofButton,NFCTagReaderSessionDelegate {


    var session: NFCTagReaderSession?

    func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
        print("readerSessionDidBecomeActive")
    }

    func tagReaderSession(_ session: NFCTagReaderSession,didInvalidateWithError error: Error) {
        print(error.localizedDescription)
    }

    func tagReaderSession(_ session: NFCTagReaderSession,didDetect tags: [NFCTag]) {
        print("didDetect: \(tags.description)")
        ...
    }
      
    override init(frame: CGRect) {
        super.init(frame: frame)
        addTarget(self,action: #selector(self.buttonClicked),for: .touchDown)
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        addTarget(self,for: .touchDown)
    }

    @objc func buttonClicked(sender:UIButton!) {

        // getting access to the window object from SceneDelegate
        let rootController = UIApplication.shared.delegate?.window?!.rootViewController

        guard NFCTagReaderSession.readingAvailable else {
            let alertController = UIAlertController(
                    title: "NFC scannen nicht erlaubt!",message: "Mit diesem Gerät ist es nicht möglich NFC Tags zu scannen. Ggf. muss dies in den Systemeinstellungen aktiviert werden.",preferredStyle: .alert
            )
            alertController.addAction(UIAlertAction(title: "OK",style: .default,handler: nil))
            rootController!.present(alertController,animated: true,completion: nil)
            return
        }

        session = NFCTagReaderSession(pollingOption: [.iso14443,.iso15693,.iso18092],delegate: self,queue: nil)
        session?.alertMessage = "Halte das iPhone nah an den NFC-Tag des Geräts,dass Du ausleihen willst."
        session?.begin()

    }
}

从Objective-c调用的Swift类:

import CoreNFC
import Foundation
import UIKit

// Subclass from NSObject to make it visible for objective-c
@objc class ScanNfcTag: NSObject,NFCTagReaderSessionDelegate {

    var session: NFCTagReaderSession?
    var nfcScanlistener: DePidataConnectNfcNfcScanListener?

    func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
        print("readerSessionDidBecomeActive")
    }

    func tagReaderSession(_ session: NFCTagReaderSession,didDetect tags: [NFCTag]) {
        print("didDetect: \(tags.description)") ... 
        }
    
    @objc public func readNfcTag(nfcScanlistener: DePidataConnectNfcNfcScanListener) {
        
        self.nfcScanlistener = nfcScanlistener
        startNfcSession()
     }

    private func startNfcSession() {
        // getting access to the window object from SceneDelegate
        let rootController = UIApplication.shared.delegate?.window?!.rootViewController

        guard NFCTagReaderSession.readingAvailable else {
            let alertController = UIAlertController(
                    title: "NFC scannen nicht erlaubt!",dass Du ausleihen willst."
        session?.begin()
    }
}

摘要

  • 在Swift中都可以正常使用NFCReading
  • 从Objective-c到Swift的函数调用正常工作。
  • 调用函数startNfcSession()并开始会话。

问题: 永远不会调用实现的委托函数

编辑: 如果我们在session.?begin()的调试器(AppCode或XCode)中设置断点,然后等待它起作用的对象。从Objective-C调用时,类的初始化似乎存在问题。 我们尝试延迟会议的开始时间,但无济于事。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)