// // 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. } */ }