IOS Core NFC Framework for Contactless Data Exchange

iOS Core NFC çerçevesi, geliştiricilere, iOS uygulamanıza dahil edilen uygulamaları inşa etme ve yazma yeteneği verir (NFC) etiketler, hızlı, güvenli ve doğrudan iletişimsiz veri değişimi sağlar.In NFC teknolojisi, gelişmiş özellikler ve gerçek dünya dağıtım kontrolleri için bir temel haline gelir.

iOS'ta kısa bir bakış

Yakın Alan İletişim (NFC), 13.56 MHz'de çalışan kısa bir kablosuz bağlantı standardıdır. Apple, Core NFC Framework ile iOS 11, başlangıçta NFC Data Exchange Format (NDEF) etiketleri ile sınırlı olarak, iOS 13'ün milyonlarca kullanıcıya ulaşması için destek ekledi.

NFC birkaç santimetre mesafede çalışır, geliştiricilerin NFC’den aldığı verileri ayrıştırma ve işlemesine izin verir.

Core NFC Framework Cap Yükleri

Core NFC framework'in (ve yapamaz) ne anlama geldiğini anlamak, gelişmeye başlamadan önce önemlidir.

  • [FONTF etiketi okuma[[[Dönetici:0)[[[FONTT:0) 3 ) - NDEF mesajları uyumlu NFC etiketleri ile okuyun (ISO 14443, FeliCa ve ISO 15693 daha sonra iOS versiyonlarında).
  • [FONTF etiketinin adı[[[Dönemli etiketlere mesaj yaz)
  • [FONT:0)Background etiketi okuma[Döntgen:0)[Dön etiket okuma[Döntgen: 1 ) - Uygulamanız arka plandayken bile NFC etiketleri okuyun (iOS 13+).
  • [FONT=0) ISO-7816 ve ISO-14443-4 iletişim[[Dönetici: 1 ) - Exchange application protokol veri birimleri (APDUs) ödeme, erişim kontrolü ve hükümet kimlik uygulamaları için.
  • [FONT:0)Müşteri komut gönderme[[Dönetici:0)[[değiştir | kaynağı değiştir] – MIFARE ve diğer kartlara özel komutlar gönderin, MIFARE/NXP sağlayıcısından gerekli en fazla söz sahibi olursunuz.

Geçerli kısıtlamalar: Core NFC, arka plan okuması kullanmadan akran tabanlı veri paylaşımını desteklemez (HCE) iOS'ta mevcut değildir (Apple Pay farklı bir güvenli element yolu kullanır ve NFC kontrolörü yalnızca arka plan okuması kullanmadan ön plana çıkar.

Proje Önlemleri

Donanım ve Yazılım Gereksinimleri

  • Bir iPhone 7 veya daha sonra (iPhone SE, 6s ve daha önceki modeller, Core NFC için NFC donanım desteği eksikliğini yoksundur).
  • Xcode 12 veya daha sonra (geçen okuma ve yazma desteği için).
  • iOS 13+ tam NDEF yazı ve arka plan yetenekleri için önerilir, ancak sadece iOS 11'e geri döner.
  • Apple Developer hesabı (özgür hesaplar fiziksel cihazlarda test edebilir; ticari dağıtım ücretli bir hesap gerektirir).

Core NFC Entitlement

Xcode projesinde, [[0)Signing & Cap tasks) ve [[Dönetici:2|Near Field Communication Tag Reading) yeteneğinizi içerir ve uygulamanızın size ait olduğunu sağlar.

Uygulamanızı NFC için yapılandırın

Info.plist Key

Uygulamanızın neden NFC erişimine ihtiyaç duyduğunu açıklayan bir dize ile anahtar:0) Bu dize, ilk NFC seansı sırasında kullanıcıya sunulur. Örneğin:

<key>NFCReaderUsageDescription</key>
<string>This app uses NFC to read your loyalty cards and event tickets.</string>

Uygulamanız etiketleri yazarsa, aynı zamanda [[DüzFLT:3) anahtar (iOS 13+) eklemek zorundasınız.

Arkak Modular

Arka etiket okumasını sağlamak için, [[Dön Modes[[Dönemli Modes[Dönemli) kapasite ve kontrol edin:2).Near Field Communication Tag Reading) Ek olarak, uygulamanız arka planda etiket algılamayı uygulamanız gerekir.

Core NFC Session Lifecycle

NDEF etiketlerinin okuma merkezi nesnesi, oturum sırasında, bir etiketin okunması (İLFLT:7) veya oturum sırasında, sistem bir sistem tarafından belirlenen bir UI uyarısını gösterir.

Bir Oturuma Başlayın

import CoreNFC

class NFCHandler: NSObject, NFCNDEFReaderSessionDelegate {
 private var session: NFCNDEFReaderSession?

 func beginScanning() {
 guard NFCNDEFReaderSession.readingAvailable else {
 print("NFC is not available on this device.")
 return
 }
 session = NFCNDEFReaderSession(delegate: self, queue: DispatchQueue.main, invalidateAfterFirstRead: true)
 session?.alertMessage = "Hold your iPhone near the tag."
 session?.begin()
 }
}

Delegate Callbacks

İki gerekli delege yöntemi uygulayın:

  • [[Dönetici: Bir veya daha fazla NDEF mesajları başarıyla okunuşunda çağrılan yöntem, nesneler, her bir kayıt içeren nesneler.
  • [[Dörtücük: Oturum sona erdiğinde çağrıldı, çünkü bir etiket okundu ya da bir hata oluştu (örneğin, kullanıcı iptal edildi, desteklenmemiş etiket).Bu yöntemi kullanıcıyı sıfırlamak ve kullanıcı bilgilendirmek için kullanın.

Örnek uygulama:

func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
 for message in messages {
 for record in message.records {
 let payload = String(data: record.payload, encoding: .utf8) ?? "Unknown"
 print("NDEF Record type: \(record.typeNameFormat), payload: \(payload)")
 }
 }
}

func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
 if let readerError = error as? NFCReaderError {
 switch readerError.code {
 case .readerSessionInvalidationErrorUserCanceled:
 print("User cancelled scanning.")
 case .readerSessionInvalidationErrorSessionTimeout:
 print("Session timed out.")
 default:
 print("Session error: \(error.localizedDescription)")
 }
 }
}

Okuma NDEF Tags

NFC etiketleri genellikle NDEF formatında veri depolayabilir. Bir NDEF mesajı bir veya daha fazla kayıt içerebilir, her biri bir tür, tanımlayıcı ve ödeme yükü. Ortak kayıt türleri “Şaplak metin), [[ŞeytanlıkT:14) (URL) ve [[Göneticiler)

Kayıt Payloads

Ücreti yorumlamak, ESRAT:16'i ve [[GÖRÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜŞÜNÜŞÜN

func handleRecord(_ record: NFCNDEFPayload) {
 switch record.typeNameFormat {
 case .nfcWellKnown:
 if record.type == NFCTypeNameFormat.wellKnownTypeText {
 let textPayload = String(data: record.payload, encoding: .utf8) ?? ""
 print("Text: \(textPayload)")
 } else if record.type == NFCTypeNameFormat.wellKnownTypeURI {
 let uriPayload = String(data: record.payload, encoding: .utf8) ?? ""
 print("URI: \(uriPayload)")
 }
 case .absoluteURI:
 let absoluteURI = String(data: record.payload, encoding: .utf8) ?? ""
 print("Absolute URI: \(absoluteURI)")
 default:
 print("Unhandled type name format: \(record.typeNameFormat)")
 }
}

NDEF Etiketler

iOS 13, ile başlayın NDEF mesajları, yazma yeteneği ile birlikte etiketli etiketler kullanarak uyumlu etiketler yazabilirsiniz.) Süreç, [[Ücretsizliğe ihtiyaç duyar.

İşte yazma desteği ile kompakt bir örnek:

func writeToTag() {
 let session = NFCNDEFReaderSession(delegate: self, queue: .main, invalidateAfterFirstRead: false)
 session.alertMessage = "Hold your iPhone near the tag to write."
 session.begin()
}

func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
 guard let tag = tags.first else { return }
 session.connect(to: tag) { error in
 guard error == nil else { return }
 // Create an NDEF message
 let payload = NFCNDEFPayload(
 format: .nfcWellKnown,
 type: NFCTypeNameFormat.wellKnownTypeURI.data(using: .utf8)!,
 identifier: Data(),
 payload: "https://example.com".data(using: .utf8)!
 )
 let message = NFCNDEFMessage(records: [payload])
 tag.queryNDEFStatus { status, _, error in
 guard status == .readWrite, error == nil else { return }
 tag.writeNDEF(message) { error in
 if error == nil {
 print("Write successful.")
 }
 session.invalidate()
 }
 }
 }
}

Not: Yazma sadece yeniden tarif edilebilir etiketlerle çalışır (Type 2, Type 4, vs.). Bazı etiketler ( MIFARE Classic gibi) özel bir kullanım gerektirir veya kilitli olabilir.

Arka plan

Uygun entitlement ve arka plan modu etkinleştirildi, uygulamanız, arka planda olmadığı zaman bile NFC etiketleri tespit edebilir. Sistem başlatıyor veya uygulamanızı başlatıyor ve aynı delege yöntemleri aracılığıyla etiket verileri sunar.You must ensure your app handles the tag quickly, as the background session has limited time.

Arka okuma için anahtar noktalar:

  • Ek olarak, YÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞ
  • Sistem, uygulamanızın adı ve Seçmeli olarak oturum sona ermeden önce ayarladığınız “ŞUYGÜN” adı ile bir uyarı gösterecektir.
  • Uygulama arka planda çalışmıyorsa, sistem birkaç saniye boyunca arka plana başlatacaktır.

Gelişmiş NFC: ISO-7816 ve APDU İletişim

Bir kart içinde güvenli bir elementle doğrudan iletişim gerektiren uygulamalar için (örneğin, ödeme terminalleri, transit kartları, hükümet kimlikleri), kullanım kolaylığı: 4/14) veya [[Döneticiler.Bu, ISO-7816-4 standardında tanımlanabilen ve APDU komutlarını alma imkanı sağlar.

Örnek: MIFARE DESFire Card ile iletişim kurmak

func readerSession(_ session: NFCReaderSession, didDetect tags: [NFCISO7816Tag]) {
 guard let tag = tags.first else { return }
 session.connect(to: tag) { error in
 guard error == nil else { return }
 // Send SELECT command
 let selectCommand = NFCISO7816APDU(
 instructionClass: 0x00,
 instructionCode: 0xA4,
 p1Parameter: 0x04,
 p2Parameter: 0x00,
 data: Data([0xA0, 0x00, 0x00, 0x03, 0x00, 0x00]),
 expectedResponseLength: -1
 )
 tag.sendCommand(apdu: selectCommand) { response, sw1, sw2, error in
 if error == nil {
 print("Command succeeded, SW1=\(sw1), SW2=\(sw2)")
 }
 }
 }
}

ISO-7816 etiketlerinin Gelişmiş kullanımı, hedef kartın komut setinin derin bir anlayış gerektirir. Apple'sETHFLT:0)Core NFC belgeleri[[Dön 1: 1) tam API referansını sağlar.

Güvenlik ve Gizlilik

iOS'ta NFC, ön planda gizlilik ve güvenlik ile tasarlanmıştır:

  • [[Dönetici:0) Kullanıcı onayı[Dönetici:0)[Dönetici 1 ) – Bir NFC seansı her zaman görünür bir sistem uyarısı ile başlar. Kullanıcı, bir etikete yakın cihazı aktif olarak tutmalıdır; uygulama sessiz bir şekilde tarama yapamaz.
  • [FONT=0)Data şifreleme[[Dönetici:0)[[[Dönetici:0)))[[[FONT=FONT=FONT=FONT=FONT=FONT=TRNT=FONT=FONT=TRNT=FONT=FONT=TRNT=FONT=FONT=FONT=FONT=FONT=TRNT=FONT=TRNT=FONT=FONT=TRNT=FONT=TRNT=FONT=FONT=TRNT=FONT=FONT=FONT=FONT=TRNT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=TRNT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=TRNT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=TRNT=TRNT=TRNT=TRNT=FONT=TRNT=FONT=FONT
  • [FONT=0)Etik içerik geçerliliği[[Dönetici:0)[[Dönetici:0) – Her zaman kullanarak önce NFC etiketlerinden ödeme yükü doğrulayabilir.
  • [FONT=0)Entitlement ve plist anahtarlar[Dönetici: 0[DÜDÜDÜT:0)[Üye Olmayanlar: Apple, kullanım açıklamanızı inceler; yanlış kullanmalı NFC yetenekleri reddedilmeye yol açabilir.

Gerçek Dünya Kullanım Vakaları Genişledi

Core NFC, çok çeşitli iletişimsel etkileşimler sağlar:

  • [FONT:0]İletişimz ödeme ve sadakat[Dönetici:0)[Dönetici:0) Mevcut NFC-equipped ödeme terminalleri ile bütünleşme veya depolama kartları ve sadakat puanlarını okumak için çerçeveyi kullanın.
  • [FONT:0) Access control[[DÜT:1) – iOS uygulamanızla fiziksel anahtarları değiştirin. erişim kötüges'e erişmek veya etiketlerin geçici erişim haklarını yazın.
  • [FONT=0]Kamu taşıma[Dönem:0)[Dönesel taşıma[Döneme:0)[Döneme:0)) -- transit geçiş için kullanılan musluklar (örneğin, Japonya'daki FeliCa etiketleri; ISO-14443 birçok Avrupa sisteminde).
  • [[FONT:0) Akıllı ambalaj[[DÜT:1) - Kullanıcıların gerçek bilgileri, geniş tarihleri veya promosyon içeriği görüntülemek için ürün paketlerini takalım.
  • [FONT:0]Museum ve perakende bilgi noktaları[Dönetici:0][Dönetici:0)[Dönetici:0))[[Dönetici:0]Museum and perakende bilgi noktaları[[Dönetici: 1.) – Spot NFC etiketleri, dokunurken zengin medya içeriklerini sunmak için veya ürünleri sunmak için.
  • [FONT=0)Medical ve farmasötik[[Dönetici:0))[[Dönetici:0)))

ilham için, bakınız:0) Apple'ın WWDC 2020 oturumunda, ve [[Dönetici Core NFC örneği kodu).

Performans optimizasyonu ve En İyi Uygulamaları

  • [FONT:0]Reduce seans süresi) - SeturFLT:29 Sadece bir etikete ihtiyacınız olduğunda doğru hareket edin.Parti tarama için, seans yaşam döngüsünü bataryayı boşaltmaktan kaçınmayı dikkatlice yönetin.
  • [FONT:0) Özel bir kuyruk kullanın[[Dönetici:0) – Oturum açma işlemi sırasında ana konuyu engellemekten kaçınmak için bir seri kuyruğunu açın.
  • [FONT:0)Handle NFCReaderError lütufla[Dönetici: 1 ) – Her zaman kullanıcı için açık mesajlar sağlar ve kullanıcı için açık mesajlar sağlar.
  • [FONT=0) Gerçek etiketlerle Test[[[Dönetici: 1) – Simülatör, NFC'yi desteklemiyor. Çeşitli fiziksel etiketler kullanın (Type 2, Type 4, MIFARE) uyumluluk sağlamak için.
  • [0]Bir anket döngüleri yok etmek [Dönetici:0] – Bir etiket tespit edildiğinde, hemen ve oturumu bitirin. Aynı etiketin tekrarlanması gereksizdir.

Sorun Ortak Konuları Sorun Gidermek

ProblemSolution
NFCNDEFReaderSession.readingAvailable returns falseEnsure the device is iPhone 7 or later. Check that the NFC capability is enabled in Xcode and the entitlement file is present.
Session starts but no tag is detectedMake sure the tag is NDEF‑formatted and placed correctly near the top‑back of the iPhone (near the camera). Some thick cases can interfere.
App rejected due to missing usage descriptionAdd both NFCReaderUsageDescription and (if writing) NFCWriteAccessUsageDescription to Info.plist.
Background reading not triggeringEnable the “Near Field Communication Tag Reading” background mode. Also ensure the app was terminated properly (not force‑killed).
Writing fails with “tag not writable”Check if the tag is locked or read‑only. Some tags require a password before writing.

iOS'ta NFC'nin Geleceği

Apple, Core NFC'yi her iOS sürümü ile gelişmeye devam ediyor. Rumored ve gelişmekte olan yetenekler ISO-15693 için geniş bir destek içeriyor (kitap kitapları ve bazı envanter etiketlerinde kullanılır), potansiyel okuma- sıralama geliştirmeler ve daha derin entegrasyon ile Cüzdan ve Express Mode. Geliştiriciler:0Core NFC notları).

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

iOS Core NFC çerçevesi, iletişimsiz veri paylaşımını herhangi bir iPhone uygulamasına ekleyecek sağlam, iyi tasarlanmış bir araçtır. Oturum yaşam döngüsüne usta olarak, NDEF işleme ve gelişmiş etiket iletişim, her şeyi kolay iş kartı taramadan sofistike erişim kontrol sistemlerine teslim edebilirsiniz.