微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。