NFCDetailVC.swift 6.93 KB
//
//  NFCDetailVC.swift
//  Twear
//
//  Created by yangbin on 2022/2/12.
//

import UIKit
import CoreNFC

@available(iOS 13.0, *)
class NFCDetailVC: UIViewController, NFCNDEFReaderSessionDelegate {

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var cardImageView: UIImageView!
    @IBOutlet weak var imageView: UIImageView!
    var nfcClosure: (() -> ())?
    
    var nfc: NFCModel = NFCModel()
    var index: Int = 0
    var session: NFCNDEFReaderSession?
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        nfcClosure?()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = LocString("详情")
        
        
        let deleteButton = UIButton(frame: CGRect(x: 0, y: 0, width: 40, height: 28))
        deleteButton.setImage(UIImage(named: "NFC_delete"), for: .normal)
        deleteButton.addTarget(self, action: #selector(deleteCard), for: .touchUpInside)
        navigationItem.rightBarButtonItem =  UIBarButtonItem(customView: deleteButton)
        
        
        nameLabel.text = nfc.name
        cardImageView.image = UIImage(named: "NFC_\(nfc.image)")
        imageView.image = UIImage(named: "NFC_\(nfc.image)")
        // Do any additional setup after loading the view.
    }
    
    func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
        
    }
    func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
        
    }
    
    @available(iOS 13.0, *)
    func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
        if let tag = tags.first {
            session.connect(to: tag, completionHandler: { (error: Error?) in
                if nil != error {
                    session.alertMessage = LocString("写入失败")
                    session.invalidate()
                    return
                }
                
                tag.queryNDEFStatus(completionHandler: { (ndefStatus: NFCNDEFStatus, capacity: Int, error: Error?) in
                    guard error == nil else {
                        session.alertMessage = LocString("写入失败")
                        session.invalidate()
                        return
                    }

                    switch ndefStatus {
                    case .notSupported:
                        session.alertMessage = LocString("写入失败")
                        session.invalidate()
                    case .readOnly:
                        session.alertMessage = LocString("写入失败")
                        session.invalidate()
                    case .readWrite:
                        var format: NFCTypeNameFormat = .unknown
                        switch self.nfc.format {
                        case "empty":
                            format = .empty
                        case "nfcWellKnown":
                            format = .nfcWellKnown
                        case "media":
                            format = .media
                        case "absoluteURI":
                            format = .absoluteURI
                        case "nfcExternal":
                            format = .nfcExternal
                        case "unknown":
                            format = .unknown
                        case "unchanged":
                            format = .unchanged
                        default:
                            break
                        }

                        let payload = NFCNDEFPayload(format: format, type: self.nfc.type.data(using: .utf8)!, identifier: self.nfc.identifier.data(using: .utf8)!, payload: self.nfc.payload.data(using: .utf8)!)
                        let message = NFCNDEFMessage(records: [payload])
                        tag.writeNDEF(message, completionHandler: { (error: Error?) in
                            if nil != error {
                                session.alertMessage = LocString("写入失败")
                            } else {
                                session.alertMessage = LocString("写入成功")
                            }
                            session.invalidate()
                        })
                    @unknown default:
                        session.alertMessage = LocString("写入失败")
                        session.invalidate()
                    }
                })
            })
                
        }
    }
    @IBAction func writeCard(_ sender: Any) {
        session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
        session?.alertMessage = LocString("准备写入,请将卡片贴近手机")//"Hold your iPhone near an NDEF tag to write the message."
        session?.begin()
    }
    
    @objc private func deleteCard() {
        self.showAlert(title: LocString("提示"), message: LocString("是否删除此门禁卡?")) {[weak self] action in
            self?.delete()
        }
    }
    
    func delete() {
        let user = UserInfo
        if user.nfc.count > index {
            user.nfc.remove(at: index)
            AdminHelper.shared.updateUser(user)
        }
        navigationController?.popViewController(animated: true)
    }
    
    @IBAction func modifyName(_ sender: Any) {
        let vc = UIStoryboard.loadViewControllerIdentifier(storyboardName: "Setting", identifier: "NFCModifyCardVC") as! NFCModifyCardVC
        vc.name = nfc.name
        vc.nameClosure = { [weak self] name in
            self?.modifyNFCName(name)
        }
        navigationController?.pushViewController(vc, animated: true)
    }
    
    func modifyNFCName(_ name: String) {
        nameLabel.text = name
        nfc.name = name
        let user = UserInfo
        if user.nfc.count > index {
            user.nfc[index] = nfc
            AdminHelper.shared.updateUser(user)
        }
    }
    
    @IBAction func modifyCard(_ sender: Any) {
        let vc = UIStoryboard.loadViewControllerIdentifier(storyboardName: "Setting", identifier: "NFCCardVC") as! NFCCardVC
        let item = Int(nfc.image)!-1
        vc.curIndexPath = IndexPath(row: item%6, section: item/6)
        vc.cardClosure = { [weak self] card in
            self?.modifyCardImage(card)
        }
        navigationController?.pushViewController(vc, animated: true)
    }
    
    func modifyCardImage(_ card: String) {
        cardImageView.image = UIImage(named: "NFC_\(card)")
        imageView.image = UIImage(named: "NFC_\(card)")
        nfc.image = card
        let user = UserInfo
        if user.nfc.count > index {
            user.nfc[index] = nfc
            AdminHelper.shared.updateUser(user)
        }
    }
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}