שילוב NFC מעשי באפליקציות מובייל
לעתים קרובות אנו נתקלים במצבים שבהם 30–40% מניסיונות הקריאה הראשוניים של NFC נכשלים עם NFCReaderError.readerTransceiveErrorTagConnectionLost ב-iOS או IOException: Tag lost באנדרואיד. הסיבה היא בדרך כלל מגע קצר מדי עם הטלפון, הפרעות ממשטחי מתכת, או timeout שגוי של הסשן. ללא גישה שיטתית, השילוב הופך לניפוי באגים אינסופי.
מדוע מתרחשות שגיאות קריאה?
iOS: מגבלות CoreNFC
CoreNFC קיים כבר זמן מה, אבל קריאה/כתיבה מלאה של NDEF הפכה לזמינה רק בגרסאות iOS מאוחרות יותר. מיקוד בגרסאות ישנות משאיר חצי מהמשתמשים ללא NFC. מכשול נוסף הוא NFCNDEFReaderSession לעומת NFCTagReaderSession. הראשון עובד רק עם תגים תואמי NDEF. אם הלקוח מביא Mifare Classic, זה פשוט לא יעבוד – אפל לא תומכת בפרוטוקול זה מסיבות אבטחה. צריך לבדוק את סוג התג מראש ולהשתמש ב-NFCTagReaderSession עם NFCMiFareTag עבור Mifare Ultralight או NFCISO7816Tag עבור כרטיסים חכמים.
צוואר בקבוק נוסף הוא Background Tag Reading. האפליקציה לא פעילה, המשתמש נוגע בתג – המערכת קוראת NDEF URI ומפעילה את האפליקציה. זה נראה קסום, אבל דורש com.apple.developer.nfc.readersession.formats ב-entitlements עם NDEF, בתוספת URL scheme או Universal Link. אם שוכחים להוסיף את הדומיין ל-apple-app-site-association, ה-deep link פשוט לא ייפתח.
אנדרואיד: פיצול NFC stack
באנדרואיד, NfcAdapter.ACTION_NDEF_DISCOVERED, ACTION_TAG_DISCOVERED, ACTION_TECH_DISCOVERED הם שלושה intents שונים עם עדיפויות שונות. אם מצהירים רק על NDEF, תג ללא מבנה NDEF יעבור לאפליקציה אחרת. Foreground dispatch דרך enableForegroundDispatch() פותר זאת אבל דורש מחזור חיים ברור: הפעלה ב-onResume, כיבוי ב-onPause. קריאה אחת שהוחמצה והאפליקציה מתחילה לקבל NFC intents גם כשהיא לא פעילה.
לכתיבת NDEF: אם התג מוגן כתיבה או מעוצב לסוג אחר, tag.connect() יתקע או יזרוק IOException. צריך timeout מפורש דרך tag.setTimeout() ולוגיקת retry עם exponential backoff. הניסיון שלנו מראה שטיפול נכון בשגיאות מפחית כשלים פי 3.
כיצד אנו מבטיחים קריאת NFC יציבה בשתי הפלטפורמות
iOS
אנו משתמשים ב-CoreNFC דרך NFCNDEFReaderSession לתרחישים סטנדרטיים ו-NFCTagReaderSession לפורמטים לא סטנדרטיים. לכתיבה, אנו יוצרים NFCNDEFMessage עם NFCNDEFPayload הנדרשים. אנו משתמשים ב-NFCNDEFPayload.wellKnownTypeURIPayload() עבור רשומות URI – זה מבטל שגיאות TNF header. הסשן עטוף ב-async/await דרך Continuation כדי להימנע משרשראות delegate. שגיאות ממופות למצבים מובנים – sessionTimeout, tagNotCompatible, writeProtected – ומוצגות דרך התראות מקוריות או UI מותאם. זמן קריאה ממוצע הוא 0.3 שניות, עם 98% הצלחה בסשנים כשמחזיקים נכון.
אנדרואיד
אנו משתמשים במחלקות טכנולוגיה Ndef ו-NdefFormatable דרך Tag.getTechList(). לפני כתיבה, אנו בודקים ndef.isWritable() ו-ndef.maxSize() – טעות נפוצה היא ניסיון לכתוב 500 בתים ל-Ntag213 עם 144 בתים. לעיצוב תגים נקיים, אנו משתמשים ב-NdefFormatable.format() עם הודעה ראשונית מינימלית.
כל קוד ה-NFC ממוקם ב-NfcRepository עם Flow<NfcEvent>, ושכבת ה-UI נרשמת דרך collectLatest. סיבוב מסך אינו מפריע לסשן – foreground dispatch משוחזר ב-onResume. גישה זו נבדקה על 15+ פרויקטים במשך 5 שנים. אנו מבטיחים יציבות סשן אפילו בתצורות מורכבות.
סוגי תגים נתמכים
| סוג תג | iOS | אנדרואיד | הערות |
|---|---|---|---|
| NDEF (Ntag213/215/216) | ✓ | ✓ | הנפוץ ביותר |
| Mifare Ultralight | ✓ (ISO7816) | ✓ | דורש NFCTagReaderSession ב-iOS |
| Mifare Classic | ✗ | ✓ | לא נתמך על ידי אפל |
| ISO 15693 | ✓ (iOS 14+) | ✓ | לתגים תעשייתיים |
| FeliCa | ✓ (יפן בלבד) | ✓ | כרטיסי תחבורה |
השוואת iOS לעומת אנדרואיד
| היבט | iOS | אנדרואיד |
|---|---|---|
| יציבות סשן | גבוהה, אך עם הגבלות קפדניות על סוגי תגים | נמוכה יותר עקב פיצול, אבל גמישה יותר |
| תמיכה בסוגי תגים | מוגבלת (ללא Mifare Classic) | רחבה, כולל כל הסוגים הפופולריים |
| קריאה ברקע | iOS 13+, דורש entitlements | אנדרואיד 10+, Beam הוצא משימוש |
| מורכבות תצורה | גבוהה יותר (entitlements, provisioning) | נמוכה יותר (manifest + dispatch) |
טעויות נפוצות וכיצד להימנע מהן
- Tag Lost ב-iOS: הגדל timeout, הוסף retry, עדכן את המשתמש.
- כתיבה לתג מוגן: בדוק
isWritable()והודע. - הפרעת סשן בסיבוב מסך באנדרואיד: בודד לוגיקה ב-repository עם Flow.
- אי-תאימות סוג תג: בצע audit לפני הפיתוח.
מה כלול בעבודה
- Audit: קביעת סוגי תגים, נפח נתונים, צורך בקריאה ברקע, פלטפורמות יעד. זה יכול לחסוך עד 20% מהתקציב על ידי בחירת stack נכון.
- עיצוב: בחירת מחלקות טכנולוגיה, ארכיטקטורה (repository עם Flow/async/await).
- יישום: unit tests עם תגי mock (
NFCNDEFReaderSessionMockב-iOS,MockNdefTagבאנדרואיד). - בדיקות על תגים אמיתיים מ-NXP, Broadcom, ST Microelectronics.
- תיעוד אינטגרציה והוראות משתמש.
- תמיכה ל-30 יום לאחר המסירה.
קבלו ייעוץ לפרויקט שלכם – נעריך את ההיקף ולוח הזמנים. הזמינו audit לאינטגרציית NFC: ננתח את התגים, הפלטפורמות ותרחישי השימוש שלכם.
תהליך העבודה
- מחקר – ניתוח דרישות, סוגי תגים, תנאי שימוש.
- עיצוב – בחירת stack, יצירת אב-טיפוס סשן.
- פיתוח – יישום עם בדיקות על אמולטורים ומכשירים אמיתיים.
- בדיקות – על 10+ דגמי תגים מיצרנים שונים.
- השקה – פרסום ל-App Store / Google Play, הגדרת קריאה ברקע.
לוח זמנים ותמחור
אינטגרציה בסיסית לקריאה/כתיבת NDEF בפלטפורמה אחת אורכת 3–5 ימי עבודה. עבור פורמטים מותאמים אישית, קריאה ברקע, או סוגי תגים מרובים, זה אורך החל משבועיים. אנו מספקים הערכה מדויקת לאחר audit.
קישורים:







