Table of Contents
הבנת ה- iOS Core NFC עבור Exchange ללא מגע
מסגרת iOS Core NFC מעניקה למפתחים את היכולת לבנות יישומים שקוראים וכותבים תגים של שדה קרוב (NFC), המאפשרים החלפת נתונים מהירה, בטוחה וגישה ישירה ללא מגע.כפי שטכנולוגיית NFC הופכת לגורם מרכזי בקמעונאי, תחבורה, בקרת גישה ועוד, הבנה כיצד לשלב את המסגרת הזאת לתוך אפליקציית iOS שלך פותחה את הדלת לחוויות משתמש מודרניות, חופשיות חיכוך.
סקירה קצרה של NFC ב- iOS
ליד שדה תקשורת (NFC) הוא תקן קישוריות אלחוטי קצר טווח שפועל ב-13.56 MHz. אפל הציגה את מסגרת הליבה NFC עם iOS 11, מוגבל במקור לקריאה פורמט NFC Data Exchange (NDEF) . גירסאות iOS מקוצרות להרחיב יכולות: iOS 13 הוסיף תמיכה עבור כתיבת תגי NDEF וקריאה רקע, בעוד iOS 14 ומאוחר יותר תאימות עם ISO-41, ISO-156, 7K, ו-i כיום, 7.
NFC פועל על פני מרחק של כמה סנטימטרים, מה שהופך אותו אידיאלי עבור תרחישים "tap-to-interact" כגון תשלום, נאמנות, כרטיסי אשראי, אימות זהות.המסגרת מפשטת את התקשורת הרדיו ברמה נמוכה, ומאפשרת למפתחים להתמקד ב parsing ולטפל בנתונים שהתקבלו תגי NFC.
המונחים: NFC Framework Capabilities
הבנת מה מסגרת NFC Core יכולה (ולא יכולה) לעשות היא חיונית לפני תחילת הפיתוח.
- (FLT:0)NDEF תג קורא את NDEF הודעות מ תגי NFC תואמים (ISO 14443, FeliCa, ו- ISO 15693 בגרסאות מאוחרות יותר של iOS).
- (ב) ויקרא י"ד: ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ויקרא (ב) ויקרא (ב) וקראו תגי NFC גם כאשר האפליקציה שלך נמצאת ברקע (iOS 13+).
- (FLT:0) ISO-7816 ו- ISO-14443-403) תקשורת בין 1:1 - החלפת יישומי פרוטוקול יחידות (APDUs) עבור תשלום, בקרת גישה ויישומים ממשלתיים.
- (ב) ,0) צווונים של צ'קסטום שולחת 1:1 - שלח פקודות קנייניות ל-MIFARE וכרטיסים אחרים, בתנאי שיש לך את ההטבות הדרושות של ספק MIFARE/NXP.
מגבלות לא ניתנות: Core NFC אינה תומכת בחילופי נתונים עמיתים ל-peer, חיקוי מבוסס כרטיס מארח (HCE) אינו זמין ב- iOS (Apple Pay משתמש בדרך אחרת מאובטחת), והבקר NFC זמין באופן בלעדי לאפליקציית ה-Foreground אלא אם כן משתמשים בקריאה ברקע.
פרויקט Prerequisites
דרישות חומרה ותוכנה
- אייפון 7 ואילך (iPhone SE, 6s, ומודלים קודמים חסרים תמיכה בחומרה NFC עבור Core NFC).
- Xcode 12 ואילך (לקריאה וכתיבה)
- iOS 13+ מומלץ לכתיבה מלאה של NDEF ויכולות רקע, אם כי קריאה לבדה עובדת חזרה ל- iOS 11.
- חשבון Apple Developer (חשבונות חינם יכולים לבדוק מכשירים פיזיים; הפצה מסחרית דורשת חשבון בתשלום).
המונחים: Core NFC
בפרויקט Xcode שלך, לנווט ל-FLT:0 (הופנה מהדף ההרחבה) ו- CapabilitiesFOVA: 1LT ולהוסיף את ה-FLT:2Near Field Communication Tag ReadingveFLT 3.
« להציג את האפליקציה שלך עבור NFC
מפתח מידע
הוסף את המפתח ל-FLT:0 ל- 1 שלך עם מיתר המסביר מדוע האפליקציה שלך זקוקה לגישה של NFC. מחרוזת זו מוצגת למשתמש במהלך הפגישה הראשונה של NFC.
<key>NFCReaderUsageDescription</key>
<string>This app uses NFC to read your loyalty cards and event tickets.</string>
אם האפליקציה שלך כותבת לתייגים, עליך להוסיף מפתח 3 (iOS 13+).
מצבי רקע
כדי לאפשר קריאת רקע, לאפשר את ה-FLT:0 (Background ModesFLT) ו- CheckFLT:2Near Field תקשורת Tag ReadingigtureFLT 3.
מעגל החיים של NFC
המטרה המרכזית לקריאה של תגי NDEF היא FLT:5 מושב מתחיל כאשר אתה קורא (FLT:6) ומסתיים באופן אוטומטי כאשר תג נקרא (אם FLT 7 הוא אמת) או כאשר אתה באופן ידני לא יסולא אותו. במהלך הפגישה, המערכת מציגה מערכת המוספקת UI להודיע למשתמש להחזיק את המכשיר ליד תג.
פתיחת ישיבה
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
ליישם את שתי שיטות הציר הנדרשות:
- (ב) ,הופנה כאשר אחד או יותר הודעות NDEF קורא בהצלחה את השיטה מקבל מערך של 10 פריטים, כל אחד מהם מכיל רשומות.
- (FLT:11) - נקרא כאשר הפגישה מסתיימת, או כי תג נקרא או שגיאה התרחשה (למשל, המשתמש ביטל, תג לא נתמך).
דוגמא יישום:
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)")
}
}
}
קריאה של NDEFBs ב Depth
תגי NFC מאחסנים בדרך כלל נתונים בפורמטNDEF.A. NDEF יכול להכיל רשומות אחד או יותר, כל אחד עם סוג, מזהה, ותשלום.סוגי רישום נפוצים כוללים: FLT:13 (טקסט רגיל), FLT:14 (URLs), ו-FLT:15 (תוכן עשיר).
רישום רשומות Payloads
כדי לפרש את המשכורות, לבדוק את הנתונים (FLT:16) ואת הנתונים (FLT:17)
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
החל מ-iOS 13, ניתן לכתוב הודעות NDEF לתייגים תואמים באמצעות ההרחבה (או בשילוב של ה-FLT:20 עם יכולת כתיבה).
הנה דוגמא קומפקטית באמצעות תמיכה בכתב:
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()
}
}
}
}
הערה: כתיבה עובדת רק עם תגים הרגיז (Type 2, Type 4 וכו ') כמה תגים (כמו MIFARE Classic) עשויים לדרוש טיפול מיוחד או יכול להיות נעול.
תגית: Reading
עם תנאי החיוב והרקע המתאימים המותר, האפליקציה שלך יכולה לזהות תגים NFC גם כאשר זה לא בחזית.המערכת משיקה או קורות מחדש את האפליקציה שלך ומספקת את נתוני התג באמצעות אותה שיטות הציר.אתה חייב להבטיח שהאפליקציית שלך מטפלת במהירות, שכן הפגישה הרקע יש זמן מוגבל.
נקודות מפתח לקריאה ברקע:
- שם מקור:0.10.17
- המערכת תציג התראה עם שם האפליקציה שלך, ובאופן אופציונלי, את הגדרת לפני סיום הפגישה.
- אם האפליקציה לא פועלת ברקע, המערכת תפעיל אותה ברקע למשך כמה שניות.
Advanced NFC: ISO-7816 ו-APDU תקשורת
עבור יישומים הדורשים תקשורת ישירה עם אלמנט מאובטח בתוך כרטיס (למשל, מסופי תשלום, כרטיסי מעבר, תעודות ממשלתיות), להשתמש ב-FLT:26 או FLT:27 אובייקטים.זה מאפשר לשלוח ולקבל פקודות APDU כפי שנקבע תקן ISO-7816-4.
דוגמה: לתקשר עם כרטיס MIFARE DESFire
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 דורש הבנה עמוקה של מערך הפיקוד של כרטיס היעד.
שיקולים ביטחוניים ופרטיות
NFC ב- iOS תוכנן עם פרטיות ואבטחה בחזית:
- (FLT:0Users AcceptFLT:1) - מושב NFC תמיד מתחיל עם התראה מערכתית גלויה.המשתמש חייב להחזיק באופן פעיל את המכשיר ליד תג; האפליקציה אינה יכולה לסרוק בשקט.
- (FLT:0Data הצפנה לאחורFLT:1) - עבור פעולות רגישות (למשל תשלום), בקר NFC מתקשר עם האלמנט הבטוח בתוך ה-iPhone.נתוני התג עצמו אינם מוצפנים על ידי המסגרת - האפליקציה שלך חייבת ליישם את ההצפנה שלה אם יש צורך.
- (ב) ,0) תוכן אימות FLT:1 - תמיד לאמת את החיוב של תגי NFC לפני השימוש בו.
- (FLT:0) זכאות ומפתחות רשימת: 1) - אפל סוקרת את תיאור השימוש שלך; שימוש לרעה ביכולות NFC יכול להוביל לדחיית אפליקציה.
מקרים של שימוש אמיתי בעולם
Core NFC מאפשר מגוון רחב של אינטראקציות ללא מגע:
- (FLT:0) תשלומים ללא מגע ונאמנות FLT:1 - Integrate with הקיים NFC-e מאובזר מסוף תשלום או להשתמש המסגרת כדי לקרוא כרטיסי ערך מאוחסנים ונקודות נאמנות.
- (FLT:0) Access ControlofFLT:1) - החליפו מפתחות פיזיים עם אפליקציית iOS שלך.קרא אישורים מ- Access תגים או כתיבת זכויות גישה זמניות לתגיות.
- (FLT:0) תחבורה ציבורית ,FelikaveFLT:1) - תכונות הטמעה של צוק-לקרא עבור מעברי המעבר (למשל, תגי FeliCa ביפן; ISO-14443 במערכות אירופיות רבות).
- (FLT:0) אריזות חכמות (PLT:1) - הבה משתמשים להשתמש בחבילות מוצרים כדי להציג מידע אותנטיות, תאריכי אספירין או תוכן קידום מכירות.
- (FLT:0) מוזיאון ומידע קמעונאי מצביע על 1FLT: Place NFC תגים ליד תערוכות או מוצרים לספק תוכן מדיה עשיר בעת הדבק.
- (FLT:0Medical and פרמצבטיFLT:1) קרא פרקי יד של המטופל או תוויות תרופות כדי לאמת זהות ומינון.
(ב) ראו [[המאה ה-20]] ב[[1924]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]]] ו[[1924]]
אופטימיזציה ביצועים ותרגולים טובים ביותר
- (ב) ,0) ,הזמן של ה-FLT:1 - SetFLT:29 כדי לאמת כאשר אתה צריך רק תג אחד.עבור סריקת אצווה, לנהל מחזור חיי ישיבה בזהירות כדי למנוע ניקוז הסוללה.
- (ב) ,0) תור ייעודי ל- 1 (FLT) – לעבור תור סדרתי לפגישת ה-Siizer כדי להימנע מחסימת החוט הראשי במהלך עיבוד תג.
- (ב) ויקרא י' (ב') ויקרא י' (ב') ,ב': "תמיד תבדקו שגיאות כמו FLT:30 וספקו הודעות ברורות למשתמש.
- (FLT:0)Test עם תגים אמיתיים 1Fillo) - הסימולטור אינו תומך ב-NFC. השתמש במגוון תגים פיזיים (Type 2, Type 4, MIFARE) כדי להבטיח תאימות.
- (ב) ,0) ,Abt אבקת הלולאות (FLT:1 ), לאחר שאג מזוהה, לעבד אותו מיד ולסיים את הפגישה.
בעיות נפוצות
| Problem | Solution |
|---|---|
NFCNDEFReaderSession.readingAvailable returns false | Ensure 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 detected | Make 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 description | Add both NFCReaderUsageDescription and (if writing) NFCWriteAccessUsageDescription to Info.plist. |
| Background reading not triggering | Enable 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. |
עתיד ה-NFC ב-iOS
אפל ממשיכה לפתח את Core NFC עם כל שחרור iOS. Rumored וצומחות יכולות לכלול תמיכה מורחבת עבור ISO-15693 (שימוש בספרי ספרי ספרייה וכמה תגי מלאי), שיפורים פוטנציאליים לקריאה, ושילוב עמוק יותר עם Wallet ו- Express Mode. Developers צריך לפקח על ה-FLT:0Core NFC NFC מציין את הערות השחרור של NFCFLT:1 כדי להישאר נוכחי.
מסקנה
מסגרת iOS Core NFC היא כלי חזק, מעוצב היטב להוסיף חילופי נתונים ללא מגע לכל אפליקציה אייפון. על ידי שליטה מחזור החיים שלה, טיפול NDEF ותקשורת תג מתקדם, אתה יכול לספק הכל מכרטיס עסקי פשוט לסרוק מערכות בקרה גישה מתוחכמת.התחל על ידי בניית קורא מינימלי, ולאחר מכן להרחיב עם כתיבה ויכולות רקע כמו השימוש שלך דרישות.