iOS NFC ہینڈ بک: React Native کے ساتھ NFC ٹیگز کو کیسے پڑھیں، لکھیں اور لاک کریں۔

جب آپ اپنے آئی فون کو اسٹیکر کے قریب رکھتے ہیں تو کیا ہوتا ہے۔ بزنس کارڈ کسی رابطے پر آتا ہے، ایک گہرا سیشن ختم ہوتا ہے، یا دروازہ کھلتا ہے۔ چپ کی قیمت تقریباً 20 پنس ہے اور اس میں تقریباً 130 بائٹس ہیں۔

ایک پڑھنے کے لیے دو فنکشن کالز لگتی ہیں۔ دو کال کرنے کا حق حاصل کرنے میں کافی وقت لگتا ہے۔ CoreNFC پھر اسے دوسری بار حاصل کرنے کو کہتا ہے۔

پہلا چیلنج ایپل کا ہے۔ ادا شدہ ڈویلپر اکاؤنٹ، ویب پورٹل میں رجسٹرڈ ایپ آئی ڈی، اس کے لیے چیک کیے گئے فیچرز، پروویژننگ پروفائل کو دوبارہ بنایا گیا۔ اگر ایک چیز غلط ہے، تو تعمیر کوڈ پر دستخط کرنے کی غلطی کے ساتھ ناکام ہو جائے گا جہاں لفظ "NFC” ظاہر نہیں ہوگا۔

دوسرا CoreNFC سے ہے اور وہ ہے جس کے بارے میں آپ کو کسی نے متنبہ نہیں کیا۔ یہ ایک سیشن پر مبنی API ہے جس میں مندوب کال بیکس، چار نیسٹڈ غیر مطابقت پذیر اقدامات، اور خاموشی سے سزا دینے والے قوانین کا ایک مجموعہ ہے۔

اگر آپ سیشن کو غلط متغیر پر رکھتے ہیں، تو سسٹم شیٹ بغیر کسی غلطی کے بالکل غائب ہو جائے گی۔ ایک کامیاب پڑھنا دو بار وعدے کی تصدیق کرتا ہے اور نتیجہ کو ناکامی سے بدل دیتا ہے۔ اگر آپ پولنگ کے ایک آپشن میں سے بہت زیادہ درخواست کرتے ہیں، تو پورا سیشن شروع نہیں ہوگا جب تک کہ آپ کسی آپشن کا نام نہیں بتاتے۔

یہ کتابچہ دونوں کا احاطہ کرتا ہے۔ آپ NDEF ڈیکوڈر کو ہاتھ سے لکھنا ختم کریں گے، جو اس وقت تک اوور کِل لگتا ہے جب تک کہ آپ یہ نہیں پڑھتے کہ مشہور لائبریریوں کے ڈیکوڈر ایموجی کو کس طرح متاثر کرتے ہیں۔ جیسے ہی آپ اپنے ٹیگز لکھیں گے، آپ کو احساس ہوگا کہ آپ کا بزنس کارڈ فٹ نہیں ہے۔ آپ دوسرے کمرے میں جانے کے بغیر ایک نہ رکنے والا فوکس ٹائمر بنا سکتے ہیں۔ NFC انحصار کو مکمل طور پر ہٹاتا ہے اور اسے Swift کے مقامی ماڈیول سے بدل دیتا ہے۔ اور ٹیگ مستقل طور پر مقفل ہے، لہذا اسے کالعدم کرنے کا کوئی طریقہ نہیں ہے۔

اس تعمیر کے دوران میں نے جو نتیجہ اخذ کیا ان میں سے دو غلط نکلے، اور دونوں اب بھی "بدلائے گئے” بینر کے نیچے مخزن میں ہیں۔ وہ بھی یہاں ہیں۔ کیونکہ میں نے ان کو کس طرح غلط سمجھا اس سے زیادہ مفید ہے کہ ان کی جگہ کیا ہے۔

یہ iOS ہینڈ بک ہے۔ مین سیکشنز میں موجود ہر چیز کو اصلی آئی فونز پر بنایا، چلایا اور تصدیق کی گئی ہے۔ اینڈرائیڈ کی اپنی ہینڈ بک ہے، اور اگر آپ انتظار نہیں کر سکتے، تو آخر میں ایک پیش نظارہ ہے۔ یہ یہاں کی ہر چیز کے لیے کوٹلن ہم منصب ہے، اور یہاں تعمیراتی اختلافات ہیں جو دونوں پلیٹ فارمز کا موازنہ کرنے کے قابل ہیں۔

نیچے دیا گیا تمام مواد گٹ ہب پر ٹیپ کارڈ نامی ایک پروجیکٹ سے لیا گیا ہے۔ اس پروجیکٹ میں چیک پوائنٹس کو ٹیگ کیا گیا ہے لہذا آپ کسی بھی مرحلے پر ایپ کو چیک اور چلا سکتے ہیں۔

انڈیکس

شرطیں

پیروی کرنے کے لیے آپ کو ضرورت ہو گی:

  • اصلی آئی فون7 یا اس سے زیادہ۔ کور این ایف سی آئی فون کے لیے خصوصی ہے۔ ایپل کی دستاویزات میں آئی فون 7 اور اس کے بعد کے ورژن کی فہرست دی گئی ہے، اور ڈویلپر فورم پر ایک ایپل انجینئر اسے براہ راست رکھتا ہے: "فی الحال، CoreNFC فعالیت صرف NFC فعالیت والے iPhones پر دستیاب ہے۔” کسی بھی رکن پر تعاون یافتہ نہیں ہے۔

  • ادا شدہ ایپل ڈویلپر اکاؤنٹ۔ NFC مفت پروویژننگ پروفائل میں دستیاب نہیں ہے۔ یہ نرم ضرورت نہیں ہے اور اس کے ارد گرد کام کرنے کا کوئی طریقہ نہیں ہے۔

  • NTAG213 اسٹیکر۔ ان میں سے 20 کی قیمت چند پاؤنڈ ہے۔ کوئی بھی کوڈ لکھنے سے پہلے خرید لیں۔

  • نوڈ 20+ اور ایکس کوڈ۔ TypeScript اور Swift کے آخری تہائی کام کا علم۔

  • اختیاریصرف اینڈرائیڈ پیش نظارہ کے لیے: اینڈرائیڈ اسٹوڈیو اور API 36 SDK۔

میں نے جو ورژن استعمال کیے ہیں:

پیکیج یا ٹول ورژن
ایکسپو SDK 57.0.20
مقامی ردعمل 0.86.3
رد عمل 19.2.3
ٹائپ اسکرپٹ 6.0.3
react-native-nfc-manager 3.17.2 (بالآخر ہٹا دیا گیا)
ایکس کوڈ 26.6
جے ڈی کے 17 (زولو)، صرف اینڈرائیڈ کا پیش نظارہ

اس ٹیبل میں ایک لائن لوڈ بیئرنگ ہے، تو میں اس کی دوبارہ وضاحت کروں گا۔ NFC لائبریری درج ہے۔ کیونکہ اسے حذف کر دیا گیا ہے۔. مکمل شدہ ایپ میں کوئی تیسری پارٹی NFC انحصار نہیں ہے۔.

NFC ٹیگز صرف ایک چھوٹے اینٹینا کے ساتھ چپس ہیں اور کوئی بیٹری نہیں ہے۔ آپ کا فون وائرلیس طریقے سے پاور سپلائی کرتا ہے اور بدلے میں دسیوں بائٹس واپس کرتا ہے۔ یہ پوری ڈیوائس ہے۔

وہ بائٹس تقریبا ہمیشہ اس طرح فارمیٹ ہوتے ہیں: این ڈی ای ایفمتبادل طور پر، NFC ڈیٹا ایکسچینج فارمیٹ ایک ایپ کے لکھے ہوئے ٹیگز کو دوسری ایپ کے ذریعے پڑھنے کے قابل بناتا ہے۔ NDEF پیغامات ذیل میں درج ہیں: ریکارڈہر ریکارڈ کی ایک قسم اور پے لوڈ ہوتا ہے۔

اس ہینڈ بک کے ٹیگز یہ ہیں: NTAG213جب آپ آن لائن اسٹیکرز خریدتے ہیں تو آپ کو یہی ملتا ہے۔ یہ 144 بائٹس صارف کی میموری رکھتا ہے۔ کہ ~ نہیں یہ پتہ چلتا ہے کہ آپ کے پاس اصل میں دستیاب نمبر ناقابل یقین حد تک اہم ہیں۔

دو چیزیں جو ٹیگ نہیں ہیں:

  1. یہ ٹریفک لائٹ نہیں ہے۔ اس کی اپنی کوئی طاقت نہیں ہے اور یہ اس وقت تک کچھ نہیں کرے گا جب تک کہ آپ کا فون چند سینٹی میٹر کے اندر نہ ہو۔

  2. یہ بطور ڈیفالٹ محفوظ نہیں ہے۔ اس شناخت کنندہ کو سستے ہارڈ ویئر کا استعمال کرنے والا کوئی بھی پڑھ اور کاپی کر سکتا ہے۔ اس پر بعد میں ایک سیکشن ہوگا۔ کیونکہ کلیدوں کے بطور ٹیگ کا واضح استعمال ناقص لکھا جانے کا امکان ہے۔

ایک جگہ جو آپ پہلے ہی دیکھ چکے ہیں۔

NFC پہلے ہی آپ کی جیب میں ہے۔ آپ کیا بنا سکتے ہیں اور کیا نہیں بنا سکتے کے درمیان فرق کرنا اچھا خیال ہے کیونکہ یہ آپ کے صارفین جیسا ہی نظر آتا ہے۔

یہاں استعمال کے پانچ کیسز ہیں جو آپ چیک کر سکتے ہیں: ہر کیس کو پروڈکٹ ڈیلیور کرنے والی کمپنی کے ذریعے دستاویز کیا جاتا ہے۔

میں نے یہ پہلے کہاں دیکھا ہے؟ کیا ہوتا ہے ذریعہ
اپنے فون سے براہ راست جائیں۔ ذاتی آٹومیشن کو متحرک کرنے کے لیے ٹیگز کو اسکین کریں۔ شارٹ کٹس میں محرکات مرتب کریں۔
کھوئے ہوئے ایئر ٹیگ جو بھی اسے اپنے NFC فون سے ٹیپ کرتا ہے وہ مالک کی تفصیلات کے ساتھ ایک صفحہ کھولے گا۔ فائنڈ مائی میں کسی آئٹم کو کھوئے ہوئے کے بطور نشان زد کریں۔
نینٹینڈو امیبو تصویر کو کنٹرولر پر ٹیپ کیا گیا ہے۔ کچھ گیمز اسے پڑھتے ہیں، کچھ اس کے اوپر حروف کو دوبارہ لکھتے ہیں۔ Amiibo FAQ
یو کے ویزا کے لیے درخواست دیں۔ "یو کے امیگریشن: آئی ڈی کی تصدیق” ایپ آپ کے پاسپورٹ کے اندر موجود چپ کو پڑھتی ہے۔ ایپ استعمال کریں۔
آئی فون پر ادائیگی کرنے کے لیے تھپتھپائیں۔ وہ اسٹور جو بغیر ٹرمینل کے کنٹیکٹ لیس کارڈ کی ادائیگی قبول کرتے ہیں۔ آئی فون پر ادائیگی کرنے کے لیے تھپتھپائیں۔

پہلے تین وہ ہیں جن پر یہ ہینڈ بک شامل ہے۔ چپ چند بائٹس رکھتی ہے، قاری انہیں پڑھتا ہے، اور سافٹ ویئر چلتا ہے۔ امیبو سب سے بہترین مثال ہے۔ کیونکہ کچھ کھیل لکھنا یہ اس کے دوسرے نصف حصے پر بھی لاگو ہوتا ہے جو آپ بنانے کی کوشش کر رہے ہیں: تصویر۔

پہلی قطار کے بارے میں تفصیلات میں سے کسی ایک کو دیکھنا توقف کے قابل ہے، کیونکہ یہ بعد میں دوبارہ سامنے آتا ہے۔ ایپل کا اپنا این ایف سی آٹومیشن، جو ہر آئی فون میں بنایا گیا ہے، اسکین شدہ ٹیگز کے بارے میں یہ کہتا ہے:

"منفرد شناخت کنندہ کے علاوہ NFC ٹیگ کے مواد کو نظر انداز کر دیا جاتا ہے۔”

ایپل کا فنکشن ہر اس چیز کو نظر انداز کرتا ہے جو یہ ہینڈ بک آپ کو لکھنے کا طریقہ سکھاتی ہے، اور صرف سیریل نمبر کی کلید کو نظر انداز کرتی ہے۔ بعد میں ایک سیکشن ہے کہ یہ کیا کرتا ہے اور کیا نہیں خریدتا۔

آئیے اس ٹیبل کے بارے میں دو انتباہات کو دیکھیں۔ پاسپورٹ کی قطار NFC ہے۔ ~ نہیں NDEF: بائیو میٹرک چپ اسی ریڈیو پر ISO 7816 پاس کرتی ہے بذریعہ: NFCISO7816Tag اور اس کے اوپر، ایک اور اجازت دی جاتی ہے جس میں اس کی اپنی خفیہ کاری شامل ہوتی ہے۔ ایک ہی اینٹینا، مختلف دنیا، اور یہاں کی حد سے باہر۔ اور آخری قطار اس حصے کے باقی حصے کا ناقابل تعمیر نصف ہے۔

ان پانچ استعمال کے معاملات کے علاوہ، پیٹرن کو کہیں بھی دہرایا جاتا ہے جہاں کسی جسمانی چیز کو فون میں ایک مختصر جملہ بولنے کی ضرورت ہوتی ہے: میوزیم کے لیبل جو نمائش کے صفحات کھولتے ہیں، کانفرنس کے بیجز، بوتلوں پر مصنوعات کی تصدیق کی مہریں، ٹرانسپورٹیشن پوسٹرز، ریستوراں کے ٹیبل مارکر، اور چھوٹے اسٹیکرز جو لوگ اپنے روزمرہ کے معمولات کو شروع کرنے کے لیے اپنی میزوں پر لگاتے ہیں۔

جو آپ iOS پر نہیں بنا سکتے وہ دوسرا نصف ہے: آپ کا فون۔ ہونے کا بہانہ کرو کارڈ Apple Pay، Google Wallet میں ایک بینک کارڈ، یا Apple Wallet میں ہوٹل کی کلید۔ اسے چلائیں سیکورٹی عنصرایک الگ چھیڑ چھاڑ واضح چپ جو کارڈ کی اسناد کو ذخیرہ کرتی ہے اور خود ہی ٹرمینل کا جواب دیتی ہے۔ iOS کے پاس اس کے لیے کوئی تھرڈ پارٹی API نہیں ہے۔ کوئی پابندی نہیں: کوئی نہیں۔ بعد میں ایک سیکشن ہے کہ یہ کتنا بند تھا۔

لہذا جب کوئی "NFC” کہتا ہے، تو اس کا مطلب دو چیزوں میں سے ایک ہو سکتا ہے۔ یہ ہینڈ بک نصف کے بارے میں ہے جو آپ کو اصل میں کوڈ لکھنے کی اجازت دیتی ہے، اور یہ بتاتی ہے کہ باقی آدھا کیوں بند ہے۔

کوئی سمیلیٹر راستہ کیوں نہیں ہے؟

اس سیکشن کو مت چھوڑیں۔ کیونکہ اس سے ہمارے کام کرنے کا طریقہ بدل جاتا ہے۔

NFC iOS سمیلیٹر یا اینڈرائیڈ ایمولیٹر میں موجود نہیں ہے۔ جزوی طور پر فرسودہ اور جھنڈے کے پیچھے بھی نہیں۔ ہارڈ ویئر غائب ہے اور API اسے غیر دستیاب کے طور پر رپورٹ کرتا ہے۔ آپ جو کچھ بھی بناتے ہیں اسے اصلی فونز میں اصلی چپس کے خلاف جانچا جاتا ہے۔

اس کے نتائج تکلیف سے زیادہ ہیں۔ میں ایسا ٹیسٹ نہیں لکھ سکتا جس سے ثابت ہو کہ ٹیگ پڑھا گیا تھا۔ آپ CI میں ڈیمو نہیں کر سکتے۔ اگر آپ کا فون دوسرے کمرے میں ہے تو اسے بلاک کر دیا جائے گا۔ پوسٹ میں میری چپ غائب تھی اور پروجیکٹ دو ہفتوں کے لیے روک دیا گیا تھا۔

ایپ مستقل طور پر ایسا کہتی ہے کیونکہ سوالات پاپ اپ ہوتے رہتے ہیں۔

import * as Device from 'expo-device';

// NFC hardware does not exist on the iOS Simulator or the Android emulator,
// and isSupported() is not reliable there. Bail out early and explicitly.
if (!Device.isDevice) return false;

تو ہم نے کوڈ کو دو حصوں میں تقسیم کیا۔

ایک حصہ NFC ہارڈویئر کے ساتھ بات چیت کرتا ہے۔ سیشن شروع کریں، ٹیگ پڑھیں، ٹیگ پر لکھیں، اور سیشن بند کریں۔ اس حصے کو جانچنے کا واحد طریقہ چپ کو اپنے فون کے خلاف پکڑنا ہے۔

باقی سب کچھ صرف ڈیٹا پروسیسنگ ہے۔ ٹیگ کے بائٹس کو یو آر ایل میں تبدیل کرنا، کسی رابطے کو بائٹس میں تبدیل کرنا جس پر صارف واپس لکھتا ہے، اس بات کی تصدیق کرنا کہ کوئی پیغام مناسب ہے، بنیادی ایرر کوڈ کو انسانی پڑھنے کے قابل جملے میں تبدیل کرنا، یا اس بات کا تعین کرنا کہ آیا ٹیب کو فوکس سیشن شروع یا ختم کرنا چاہیے۔

اس میں سے کسی کو بھی NFC کی ضرورت نہیں ہے۔ ان میں سے بیشتر کو React Native کی ضرورت نہیں ہے۔ یہ ایک سادہ خصوصیت ہے۔ قدر آتی ہے، قدر نکلتی ہے۔

اگر آپ اسے اس طرح لکھتے ہیں، تو آپ اسے اپنے لیپ ٹاپ پر ٹیسٹ کر سکتے ہیں چاہے آپ کے پاس کمرے میں فون نہ ہو۔ اس پروجیکٹ میں TypeScript کی تقریباً 2,240 لائنیں استعمال کی گئی ہیں۔ 293 ٹیسٹ تقریباً 1 سیکنڈ میں مکمل ہوئے۔. کوڈ جو اصل میں CoreNFC کو کال کرتا ہے اتنا چھوٹا رکھا جاتا ہے جتنا میں اسے بنا سکتا ہوں۔

ہارڈ ویئر کے مسائل کی وجہ سے پروجیکٹ کو تین بار روک دیا گیا تھا، جس میں سائٹ پر دو ہفتوں کا انتظار بھی شامل تھا۔ ان میں سے اکثر کو ٹیگز کی ضرورت نہیں تھی، اس لیے ہر بار بنانے کے لیے بہت کچھ باقی تھا۔ یہ کوڈبیس کا بہترین فیصلہ ہے، اور میں نے یہ فیصلہ جان بوجھ کر نہیں کیا۔ دواسازی نے اسے میرے لئے بنایا۔

چوکی: git checkout step-0-scaffold. ایپ دونوں پلیٹ فارمز پر بوٹ ہو جائے گی اور کوئی دوسری کارروائی نہیں کی جائے گی۔

iOS معاہدے کیسے کام کرتے ہیں۔

ایپل کی تین شرائط یہاں تمام کام کرتی ہیں، اور وہ قدموں سے پہلے پن کرنے کے قابل ہیں کیونکہ غلطی کا پیغام یہ فرض کرتا ہے کہ آپ انہیں پہلے سے جانتے ہیں۔

نہیں ایپ آئی ڈی وہ ID جس کے ساتھ آپ کی ایپ ایپل سرورز پر رجسٹرڈ ہے، bundleIdentifier آپ کی ترتیب میں نہیں صحیح ایپ میں ایک لائن ہے جو کہتی ہے "آپ اس فیچر کو استعمال کریں گے” اور NFC ان میں سے ایک ہے۔ کوئی راستہ نہیں پروویژننگ پروفائل ایک دستخط شدہ دستاویز ہے جو دونوں کو آپ کے ڈویلپر اکاؤنٹ سے جوڑتی ہے، اور Xcode اسے ہر تعمیر میں شامل کرتا ہے۔ تینوں کو متفق ہونا چاہیے۔ بصورت دیگر، آپ کے آلے پر کچھ نہیں چلے گا۔

اصل ترتیب اس طرح ہے: ہر قدم اہم ہے۔

  1. کوئی راستہ نہیں ادا کیا ایپل ڈویلپر اکاؤنٹ۔

  2. نہیں واضح ایپ ID developer.apple.com پر رجسٹرڈ، وائلڈ کارڈ نہیں۔

  3. NFC ٹیگز پڑھنا ایپ کی شناخت چیک کی گئی ہے۔

  4. خصوصیت کو شامل کرنے کے لیے پروویژننگ پروفائل کو دوبارہ بنایا گیا۔

پھر app.json:

{
  "expo": {
    "ios": {
      "bundleIdentifier": "com.yourname.tapcard",
      "infoPlist": {
        "NFCReaderUsageDescription": "TapCard uses NFC to read and write your card to a tag."
      },
      "entitlements": {
        "com.apple.developer.nfc.readersession.formats": ["NDEF", "TAG"]
      }
    }
  }
}

اگر آپ مرحلہ 2 یا 3 چھوٹتے ہیں، تو آپ کی تعمیر مندرجہ ذیل طور پر ناکام ہو جائے گی:

Provisioning Profile "iOS Team Provisioning Profile: *" does not support
the NFC Tag Reading capability.

خرابی غلط نظام کی طرف اشارہ کرتی ہے۔ ایپل نے اپنے کمپیوٹرز پر خصوصی فیچرز پر پابندی لگا دی ہے۔ وائلڈ کارڈ اگر کوئی واضح مماثلت نہیں ہے تو ایپ آئی ڈی اور ایکس کوڈ کو خود بخود ایک سے بدل دیا جاتا ہے۔

پیغام مقامی پروویژننگ پروفائل کو مورد الزام ٹھہراتا ہے، لیکن گمشدہ نصف ایپل سرورز اور ویب فارم میں ہے جسے صارف نے پُر نہیں کیا۔ اس میں آپ کو براؤزر کھولنے کے لیے کہنے کے لیے کچھ نہیں ہے۔

جب آپ وہاں ہوں تو ثانوی جال: App IDs تمام Apple اکاؤنٹس میں عالمی سطح پر منفرد ہیں۔ٹیم کی طرف سے نہیں**.** پہلی پسند کا انتخاب ایک اجنبی نے کیا تھا، اور اسی طرح دوسرا انتخاب بھی تھا۔ میں نے ایپ شناخت کنندہ کا نام دو بار تبدیل کیا۔

نام کی یہ تبدیلی مشکل نہیں تھی اور اس پراجیکٹ کو کیسے ترتیب دیا گیا اس کے بارے میں ایک لفظ کہنے کے قابل ہے۔ ایکسپو مسلسل طے شدہ تخلیق مطلب ios/ اور android/ فولڈرز کو اسٹوریج میں بالکل بھی محفوظ نہیں کیا جاتا ہے۔ وہ اس سے دوبارہ پیدا ہوتے ہیں: app.json کی طرف سے expo prebuild آپ کو اس کی کب اور کیسے ضرورت ہے۔ node_modules سے دوبارہ تخلیق کیا گیا ہے۔ package.json. لہذا ایپ کا نام تبدیل کرنا JSON کی دو لائنیں اور ایک لائن تھی۔ prebuild --cleanہم نے iOS پروجیکٹ، اینڈرائیڈ پیکجز، اور پورے کوٹلن سورس ٹری کو دوبارہ بنایا۔ کوئی ایکس کوڈ سرجری نہیں ہے۔

پیمانے پر، Android پر یہ مینی فیسٹ میں صرف ایک لائن ہے، جس میں کوئی اکاؤنٹ، کوئی پورٹل اور کوئی لاگت نہیں ہے۔


اس کے برعکس شکایت نہیں ہے۔ یہ ابتدائی طور پر اندرونی بنانے کے قابل ہے کیونکہ اس سے آپ کو اندازہ ہوگا کہ اس پلیٹ فارم پر آپ کا وقت کہاں گزرے گا۔ مختصر کوڈ میں نہیں، لیکن کاغذی کارروائی میں شامل ہے۔

اینڈروئیڈ iOS
ایک ٹیگ پڑھنے کے لیے 1 مینی فیسٹ لائن ایپ ID + خصوصیات + ادا شدہ اکاؤنٹ + پروفائل
خرچ مفت $99/سال یا مقامی مساوی
ناکامی موڈ آپ کو اجازت نہیں ہے۔ کوڈ پر دستخط کرنے میں غلطی جہاں یہ "NFC” نہیں کہتا ہے

پہلا ٹیگ کیسے پڑھیں

پڑھنے کا کوڈ مختصر ہے۔ یہ ہے:

import NfcManager, { NfcTech, type TagEvent } from 'react-native-nfc-manager';

export async function readTagOnce(): Promise {
  await NfcManager.requestTechnology(NfcTech.Ndef, {
    alertMessage: 'Hold your iPhone near the NFC tag.',
  });

  try {
    return await NfcManager.getTag();
  } finally {
    // throwOnError: false because we are already unwinding. A failure to
    // close the session must not mask the original error.
    await NfcManager.cancelTechnologyRequest({ throwOnError: false });
  }
}

دو کالیں ہیں اور وہ دونوں پلیٹ فارمز پر ایک جیسی ہیں۔ اور صارفین جو دیکھتے ہیں اس سے زیادہ مختلف نہیں ہو سکتا۔

کو iOS، requestTechnology یہ کنٹرول CoreNFC کو دے دیتا ہے، جو سسٹم کی موڈل شیٹ کھینچتا ہے۔ آپ اسے دوبارہ ترتیب نہیں دے سکتے۔ ایپ اسکرین پر ظاہر نہیں ہوتی ہے۔

کو اینڈروئیڈکچھ بھی نہیں کھینچا جاتا۔ ڈسپیچ خاموش ہے۔ اگر آپ کی ایپ صارفین کو ٹیگ کو تھپتھپانے کے لیے نہیں کہتی ہے، تو کوئی نہیں کرے گا۔

لہذا، اسکیننگ UI مشروط ہے اور اس پیٹرن کو پورے پروجیکٹ میں دہرایا جاتا ہے۔

{
  scanning && (
    
      
      
        {Platform.OS === 'android'
          ? 'Hold a tag against the back of the phone.'
          : 'Waiting for the system NFC sheet…'}
      
      {/* Android draws no system UI, so the app must offer its own way out. */}
      {Platform.OS === 'android' && 

وہ کینسل بٹن صرف اینڈرائیڈ پر موجود ہے۔ کیونکہ iOS کے پاس سسٹم شیٹ میں پہلے سے ہی کینسل بٹن موجود ہے۔

تین چیزیں جو آپ کو مسحور کر دیں گی۔

1. اینٹینا مختلف جگہ پر ہے۔

آئی فون کے لیے: سب سے اوپر کنارےکیمرے کے قریب۔ Android: پیچھے درمیانی. "اپنے فون کے قریب ٹیگ لگائیں” ممکن نہیں ہے اور کوئی غلط سرے پر یہ نتیجہ اخذ کرے گا کہ ایپ ٹوٹ گئی ہے۔ میں نے ہر پلیٹ فارم کے لیے صحیح جگہوں پر نقطوں کے ساتھ فون کی چھوٹی سی خاکہ تیار کی۔

2. شیٹ اس سٹرنگ کو ظاہر نہیں کرتی جو آپ کے خیال میں یہ کرے گی۔

میں نے فرض کیا کہ یہ نشان زد ہے۔ NFCReaderUsageDescription سے app.json. یہ سچ نہیں ہے۔ یہ ظاہر کرتا ہے alertMessage ہر ایک کو منتقل کریں requestTechnology() کال استعمال کا بیان ایک سٹرنگ ہے جو رازداری کے تحفظات کو بیان کرتی ہے۔ اس کی ضرورت ہے اور اس سٹرنگ کے بغیر سیشن شروع نہیں ہوگا اور صارف کو نظر نہیں آئے گا۔

دونوں سٹرنگز درست طریقے سے بنتے ہیں اور ہجے درست ہوتے ہیں، اور جس سٹرنگ کے ظاہر ہوتے ہیں اس کے بارے میں میرے قیاس اب بھی غلط ہیں۔ میں نے فون اٹھایا تو پتہ چلا۔ اس کا مطلب نقل بھی ہے۔ اسکین سے اسکین تک مختلف ہو سکتے ہیں۔. "لکھنے کے لیے اپنے آئی فون کو ٹیگ کے قریب رکھیں” پڑھنے والی کاپی کو دوبارہ استعمال کرنے سے بہتر ہے۔

وہ دوسری لائن ہے۔ alertMessage پر requestTechnology براہ کرم اوپر سے انہیں لفظ بہ لفظ پکاریں۔ استعمال کرنے کے طریقے کے بارے میں ہدایات app.json یہ اسکرین پر کہیں نہیں ہے۔

3. iOS پر، خالی ٹیگز کو غلطی کے طور پر پڑھا جاتا ہے۔

فیکٹری سے تازہ، NTAG213 NDEF فارمیٹ میں ہے لیکن خالی ہے۔ readNDEF یہ مندرجہ ذیل رپورٹ کرتا ہے: ناکامی خالی پیغام نہیں۔ امتیاز ٹیگ کے NDEF سے آنا چاہیے۔ صورت حالیہ پڑھنے کی غلطی نہیں ہے۔ آپ جو بھی ٹیگ خریدتے ہیں وہ اس طرح شروع ہوتا ہے، لہذا یہ پہلا ٹیگ ہے جسے آپ ماریں گے۔

کیا واپس آتا ہے؟

آئی فون 13 پرو پر NTAG213 کا اصل آؤٹ پٹ یہ ہے:

{
  "id": "04C4FC91DF2A81",
  "tech": "mifare"
}

دو میدان۔ یہ وہ سب کچھ ہے جو iOS پڑھنے کے ذریعے پیش کرتا ہے۔ کوئی سائز، کوئی مہارت کی فہرست، اور کوئی NDEF اقسام نہیں ہیں۔ اینڈرائیڈ ایک ہی چپ سے سب کچھ واپس کرتا ہے۔

میں نے اس سے غلط نتیجہ اخذ کیا۔: ہم نے اسے تین دستاویزات میں لکھا اور ان کے ارد گرد کام کے تمام مراحل کی منصوبہ بندی کی۔ وہ غلطی بعد میں آتی ہے کیونکہ یہ حقیقت سے زیادہ مفید ہے۔ اگر آپ اسے ابھی ٹھیک کرنا چاہتے ہیں تو چھوڑ دیں۔

کہ id یہ ٹیگ میں ہے۔ UIDیہ فیکٹری میں چپ پر کندہ ایک منفرد سیریل نمبر ہے اور جو بھی پوچھتا ہے اسے پڑھ سکتا ہے۔ کہ 04 سابقہ ​​NXP کا مینوفیکچرر کوڈ ہے اور 7-بائٹ UID NTAG21x دستخط ہے، لہذا ٹیگ کا دعویٰ یہی ہے۔

اپنے آئی فون 13 پرو پر پہلے اسکین کے بعد ایپ میں ٹیب پڑھیں۔ ٹیگ کارڈ میں ID 04C4FC91DF2A81، قسم (کوئی نہیں)، ٹیکنالوجی کی قسم (کوئی نہیں)، زیادہ سے زیادہ سائز (نامعلوم)، اور NDEF ریکارڈ 0 کو RAW بلاک پر درج کیا گیا ہے جس میں صرف ID اور ٹیکنالوجی فیلڈز ہیں۔

کہ Max size قطار دیکھنے کی قطار ہے۔ (unknown) یہی وجہ ہے کہ میں غلط نتیجے پر پہنچا اور یہ وہ نہیں ہے جو پلیٹ فارم آپ کو بتا سکتا ہے۔

چوکی: git checkout step-1-first-read. استحقاق کو ترتیب دیا گیا ہے اور اسکرین ایک خام NDEF ڈمپ دکھاتی ہے۔

NDEF ریکارڈز کا واقعی کیا مطلب ہے۔

ٹیگز URLs کو ذخیرہ نہیں کرتے ہیں۔ یہ بائٹس کو اسٹور کرتا ہے، اور بائٹس وہی ہیں جو ایپ وصول کرتی ہے۔ یہ پورا حصہ ان بائٹس کو بطور بیان کرتا ہے۔ https://example.com اور یہ اس کی ساکھ سے کہیں زیادہ چھوٹا معاملہ ہے۔

وہ یونٹ جس میں آپ کام کرتے ہیں۔ ریکارڈتین ریکارڈ ہیں۔

  • کوئی راستہ نہیں پے لوڈ: مواد کے خام بائٹس

  • کوئی راستہ نہیں زمرہ: وہ پے لوڈ کیا ہے (جیسے URI یا کچھ متن)

  • کوئی راستہ نہیں ٹی این ایفیا ٹائپ نام کی شکل: 3 بٹس جو ٹائپ فیلڈ کو خود پڑھنے کا طریقہ بتاتے ہیں۔

تیسرا وہ ہے جہاں لوگ اسے استعمال کرتے ہیں۔ قسموں کو لیبل کے طور پر اور TNF کو لیبل پڑھنے کے اصول کے طور پر سوچیں۔ بائٹ ٹائپ کریں۔ U اس کا مطلب ہے "URI”، لیکن چونکہ TNF نے کہا کہ "یہ ایک معروف NFC فورم کی قسم ہے”۔ اس کے بجائے، دوسرے TNF کے تحت وہی بائٹ MIME سٹرنگ کا آغاز بن جاتا ہے۔

دو ریکارڈ لے آؤٹ تقریباً تمام حقیقی ٹریفک لے جاتے ہیں، اور دونوں چھوٹے ہیں۔

URI ریکارڈ

04 65 78 61 6d 70 6c 65 2e 63 6f 6d
│  └──────── "example.com" ────────┘
└─ prefix index → "https://"

→ https://example.com

نیچے دیئے گئے تبصرے آپ کو بتاتے ہیں کہ کون سے بائٹس کیا کرتے ہیں۔ پہلے بائٹ کے بعد سب کچھ سادہ متن ہے۔ example.com. پہلا بائٹ، 04این ایف سی فورم کی تفصیلات کے 36 آئٹم ٹیبل میں ایک اشاریہ ہے، اور آئٹم 4 ہے https://.

تو اس اسکیم کی قیمت 8 بائٹس کے بجائے 1 بائٹ ہے۔ 137 قابل استعمال بائٹس کے ساتھ غیر مائیکرو آپٹمائزڈ ٹیگ پر، یہ بجٹ کا 5% ہے۔

متن کی تاریخ

متن کو URIs سے دو مختلف چیزوں کی ضرورت ہوتی ہے: وہ زبان جس میں متن موجود ہے اور ایک انکوڈنگ کا طریقہ۔ دونوں پہلے کاٹنے پر نچوڑے جاتے ہیں۔

02 65 6e 48 69
│  └─┬─┘ └─┬─┘
│   "en"  "Hi"
└─ status byte

پہلے بائٹ کو بطور نمبر پڑھیں۔ یہاں یہ 2 ہے اور یہ زبان کے کوڈ کی لمبائی ہے۔ تو اگلے دو بائٹس زبان ہیں۔ 65 6e"n”۔ اس کے بعد سب کچھ یہ ہے: 48 69"ہیلو”

انکوڈنگ اسی بائٹ میں پوشیدہ ہے۔ اگر قدر 128 یا اس سے زیادہ ہے تو متن UTF-16 ہے، UTF-8 نہیں۔ "اسٹیٹس بائٹ” کا مطلب یہی ہے۔

یہ مکمل فارمیٹ ہے۔ اگر آپ خود ڈیکوڈر لکھتے ہیں، تو لمبائی کے لیے کم آرڈر والے 6 بٹس کو ماسک کریں اور انکوڈنگ کے لیے سب سے اہم بٹ کی جانچ کریں۔

میں نے اپنا ڈیکوڈر کیوں لکھا

آپ دو وجوہات میں سے ایک وجہ سے لائبریری کے پاس سے گزرتے ہیں۔ میں ایسی جگہ کام کرتا ہوں جو یا تو آپ کی ضرورت کی ہر چیز فراہم نہیں کرتا ہے، یا گھر میں اس قسم کی چیز پہلے بناتا ہوں اور انحصار کو دوسرا سمجھتا ہوں۔

دوسرا اوپن سورس ڈیفالٹ سے زیادہ عام ہے، اور NDEF کے لیے مختصر جواب ہے: ہاں، آپ اسے خود لکھ سکتے ہیں۔ یہ خالص فنکشن کی چند سو لائنیں ہیں جس میں کوئی پلیٹ فارم کال نہیں ہے، اور پوری تفصیلات کے لیے اس فارمیٹ کی ضرورت ہوتی ہے جسے آپ ابھی پڑھتے ہیں۔

پہلی وجہ یہ ہے کہ اصل میں یہاں کیا ہوا۔ لائبریری کو ڈیکوڈر کے ساتھ بنڈل کیا گیا تھا اور استعمال سے پہلے پڑھا گیا تھا، 20 منٹ میں ایپ کے فن تعمیر کو تبدیل کر دیا گیا تھا۔

زبان کے کوڈ کو مسترد کریں۔ میں ndef-lib/ndef-text.js:

var languageCodeLength = data[0] & 0x3f; // 6 LSBs
// languageCode = data.slice(1, 1 + languageCodeLength),
// utf16 = (data[0] & 0x80) !== 0; // assuming UTF-16BE

// TODO need to deal with UTF in the future

زبان کے کوڈ کی لمبائی کی پیمائش کریں اور اسے کوڈ کو چھوڑنے اور اگلی لائن پر جانے کے لیے استعمال کریں۔ برقرار رکھنا اس پر تبصرہ کیا جاتا ہے۔ decodePayload یہ ایک خالص تار لوٹاتا ہے، اس لیے کال کرنے والا زبان کو بالکل بھی بحال نہیں کر سکتا۔ "یہ کس زبان میں ہے؟” یہ وہ سوال ہے جس کے جواب کے لیے زبان کے فیلڈز کے ریکارڈ موجود ہیں۔

کہ TODO یہ بوجھ برداشت کرنے والا ہے۔ UTF-16 ٹیکسٹ ریکارڈز کو UTF-8 کے طور پر ڈی کوڈ کیا جاتا ہے قطع نظر اس سے کہ ایک دوسرے کے ساتھ NUL حروف پیدا ہوتے ہیں۔

اور مشترکہ بائٹ سٹرنگ مددگار کو چھوٹا کر دیا گیا ہے۔ میں ndef-lib/util.js:

str += String.fromCharCode(ch);

String.fromCharCode یہ صرف نچلے 16 بٹس کو برقرار رکھتا ہے اور ایموجیز 16 بٹس میں فٹ نہیں ہوتے ہیں۔ تو میں نے اسے ایک کھلایا:

bytes    : 68 69 20 f0 9f 98 80
expected : hi 😀
library  : "hi " codepoints: 68 69 20 f600     ← U+F600, Private Use Area

U+1F600 U+F600 بن گیا، ایک شفاف کردار۔ عربی اور CJK جیسے 3 بائٹ کے سلسلے ٹھیک ہیں، اس لیے بگ اس وقت تک چھپا رہتا ہے جب تک کوئی ایموجی استعمال نہ کرے۔

دریں اثنا، URI ڈیکوڈر 8 لائنوں پر مکمل طور پر درست ہے۔ وہ توازن وہی ہے جو دلچسپ ہے۔ یہ کوئی بری لائبریری نہیں ہے۔ یہ ایک لائبریری ہے جس کے دو پرانے کونے ہیں۔ یہ جاننے کا واحد طریقہ کون سا تھا اسے پڑھنا تھا۔

لہذا میں نے ڈیکوڈر لکھا اور ان حصوں کے لئے ایک لائبریری کو برقرار رکھا جو حقیقت میں ہارڈ ویئر کے ساتھ بات چیت کرتے ہیں۔ تقریباً 530 لائنیں، تمام سادہ ٹائپ اسکرپٹ جس میں کوئی رد عمل مقامی درآمدات نہیں ہیں۔ اس کا مطلب یہ ہے کہ یہ نوڈ پر چلتا ہے اور اسے ملی سیکنڈ میں ٹیسٹ کیا جاتا ہے۔

اس کا کام ریکارڈ کو کئی معلوم شکلوں میں سے ایک میں تبدیل کرنا ہے، جسے یہ قسم بیان کرتی ہے۔

export type NdefView =
  | { kind: 'empty' }
  | { kind: 'uri'; uri: string }
  | { kind: 'text'; text: string; lang: string; encoding: TextEncodingName }
  | { kind: 'mime'; mime: string; text?: string; bytes: number[] }
  | { kind: 'aar'; packageName: string }
  | { kind: 'unknown'; tnf: number; type: string; payload: number[] };

کئی سلیکشن فیلڈز کے ساتھ ایک آبجیکٹ کے بجائے متعدد شکلوں کا مجموعہ کیوں استعمال کریں؟ اختیاری فیلڈز آپ کو یہ اندازہ لگانے پر مجبور کرتے ہیں کہ ہر اسکرین پر کون سے فیلڈز آباد ہیں۔ اسے یہاں چیک کریں۔ kind بس ایک بار کریں اور TypeScript باقی جانتا ہے۔ کس ریکارڈ پر kind ہے 'text'، .uri یہ موجود نہیں ہے۔ لہذا کوئی بھی اسکرین جو اسے پڑھنے کی کوشش کرتی ہے رینڈرنگ کے بجائے مرتب کرنے میں ناکام ہوجائے گی۔ undefined کسی کے پاس فون ہے

کہ unknown اصل معاملہ اب بھی باقی ہے۔ tnf، typeاور payloadلہذا ایک ریکارڈ جو کسی بھی چیز کو نہیں پہچانتا ہے کم از کم ہیکساڈیسیمل ڈمپ کے طور پر ظاہر ہوسکتا ہے۔ ایک قاری جو خاموشی سے کسی ایسی چیز کو پھینک دیتا ہے جسے وہ سمجھ نہیں پاتا ہے وہ اس قاری سے بدتر ہے جو کہتا ہے، "میں نہیں جانتا کہ یہ کیا ہے۔ یہ ہیں بائٹس۔”

ایک پلیٹ فارم کا فرق ڈیکوڈر کے اندر ہی دفن ہے۔ ریکارڈ کے type فیلڈز اینڈرائیڈ پر خام بائٹس کے طور پر آتے ہیں اور بعض اوقات iOS پر پہلے سے ڈی کوڈ شدہ تاروں کی طرح۔ تو وہی URI ریکارڈ اس طرح ظاہر ہوگا: [85] ایک پلیٹ فارم پر اور 'U' دوسری طرف، 85 حرف U کا بائٹ ہے۔

اس لیے یہ ضروری ہے۔ [85] === 'U' یہ صرف جھوٹ ہے۔ کوئی غلطیاں یا انتباہات نہیں ہیں۔ موازنہ خاموشی سے میل نہیں کھاتے ہیں اور بالکل اچھے URI ریکارڈز کو "نامعلوم ریکارڈز” کے طور پر درجہ بندی کیا جاتا ہے۔ دونوں پلیٹ فارمز پر، موازنہ کرنے سے پہلے قسم کو سٹرنگ میں تبدیل کریں۔

تبدیل شدہ شے کی جانچ کریں۔

یہ وہ مہارت ہے جو میں سب سے زیادہ چاہتا ہوں کہ لوگ چوری کریں۔ ٹیسٹ کو تین گروپوں میں تقسیم کیا گیا ہے:

نتیجہ: ہاتھ سے تیار کردہ پے لوڈز کے لیے ایک ڈیکوڈر۔

معاہدہ: جہاں لائبریری واقع ہے۔ صحیحثابت کریں کہ ہم بالکل ایک جیسے ہیں۔ اس میں تمام 12 اصل URIs اور 36 سابقہ ​​اشاریے شامل ہیں جو لائبریری کے ذریعے انکوڈ کیے گئے ہیں اور ہمارے ذریعے ڈی کوڈ کیے گئے ہیں۔ یہ آپ کے ہاتھ سے آباد تلاش میزوں کے بارے میں پراعتماد ہونے کا سب سے سستا طریقہ ہے۔

شاخ یہ ایک عجیب بات ہے۔ اگر کوئی لائبریری غلط ہے تو اس بات کا تعین کرنے کے لیے ایک ٹیسٹ لکھیں کہ یہ کیسے غلط ہوا۔

✓ the library discards the language code; we keep it
✓ the library truncates 4-byte UTF-8; we do not
✓ both handle 3-byte sequences, so only characters above U+FFFF break
✓ the library ignores the UTF-16 flag; we honour it

یہ پیچھے کی طرف دیکھتا ہے۔ میں ایک امتحان لکھ رہا ہوں جو پاس ہوتا ہے۔ کیونکہ ایک انحصار ٹوٹ گیا ہے، جو عام طور پر ایک بو ہے.

دو چیزیں اپنی جگہ ہیں۔ ہر ایک اس بات کا تحریری ریکارڈ ہے کہ آپ کا کوڈ کیوں موجود ہے، اس کے بالکل ساتھ، ایک کمٹ میسج کی بجائے جسے کوئی نہیں پڑھتا ہے۔ اور اس لیے کہ وہ لائبریری کے موجودہ رویے پر اصرار کرتے ہیں۔ یہ اس دن ناکام ہونا شروع ہو جاتا ہے جب کوئی اوپر والا مسئلہ حل کرتا ہے۔

یہی ناکامی نقطہ ہے۔ یہ ایک اطلاع ہے، ٹوٹا ہوا امتحان نہیں۔ آپ نے اپنا ڈیکوڈر لکھنے کی وجہ شاید ابھی غائب ہو گئی ہے، لہذا آپ جا کر اسے چیک کر سکتے ہیں۔ "لائبریری میں کیڑے ہیں” تبصرے خاموشی سے سڑ جاتے ہیں جب کہ لائبریریاں بدل جاتی ہیں۔ امتحان یہ ہے کہ آپ ایسا نہیں کر سکتے۔

ایک تفصیل سے یہ طے ہوتا ہے کہ آیا یہ ٹیسٹ مفید ہیں یا بیکار۔ ایموجی ٹیسٹ کے دعوے: درست غلط جواب، کوڈ پوائنٹ 0xf600یہ صرف "لائبریری ہم سے متفق نہیں ہے۔”

اگر آپ صرف تضادات کی جانچ کرتے ہیں تو اگلا ورژن ہے۔ مختلف کیڑے اب بھی گزریں گے اور آپ کبھی نہیں دیکھیں گے کہ سلوک بدل گیا ہے۔ کسی مخصوص غلط قدر کو پن کرنے کا مطلب ہے کہ تمام تبدیلیاں نظر آئیں گی، قطع نظر اس کے کہ بگ کو اوپر کی طرف ٹھیک کر دیا گیا ہے یا کسی نئے بگ سے بدل دیا گیا ہے۔

چوکی: git checkout step-2-decode. اپنا ڈیکوڈر، ٹیگ انفارمیشن اسکرین جو تمام فیلڈز اور خام بائٹس دکھا رہی ہے۔

ٹیگ کیسے لکھیں۔

اب یہ دوسری طرف ہے۔ دو اختیارات ہیں، اور وہ جوابی تجارت ہیں، تبدیلی نہیں۔

URL ریکارڈ یہ بہت چھوٹا ہے اور اسے کسی بھی فون پر ایپ انسٹال کیے بغیر کھولا جا سکتا ہے۔ یہ بالکل وہی ہے جو زیادہ تر تجارتی NFC کاروباری کارڈ کرتے ہیں۔ اس کے علاوہ دوسرے سرے پر آپ کو ایک تجدید شدہ ڈومین، ایک مسلسل کام کرنے والا سرور، یا کسی کے ٹیپ کرنے کے وقت نیٹ ورک کنکشن کی ضرورت ہوتی ہے۔

وی کارڈ یہ پورا کارڈ ہے۔ text/vcard MIME ریکارڈ کے طور پر، یہ سرور لیس ہے اور فلیٹ میں کام کرتا ہے۔ یہ بھی بہت بڑا ہے۔

میں نے دونوں بنائے اور صارفین کو انتخاب کرنے دیں۔ کیونکہ نمبرز کسی بھی چیز سے بہتر دلیل بناتے ہیں جو آپ کاپی کر سکتے ہیں۔

ایپ میں لکھیں ٹیب۔ عنوان کے نیچے ایک دوسرے کے ساتھ دو بٹن: 17 بائٹس کی نمائندگی کرنے والا URL اور 184 بائٹس کی نمائندگی کرنے والا vCard۔

یہ ایک ہی شخص کی رابطہ کی معلومات کے 184 بائٹس کے مقابلے میں 17 بائٹس ہے۔ یہ فرق پوری ڈیل ہے، اور کیوں انتخاب صارف کے سامنے ہے بجائے کہ ان کے لیے۔

وی کارڈ کو انکوڈ کرنے کا طریقہ

وی کارڈ صرف متن ہے۔ ایپ اصل میں ٹیگ پر کیا لکھتی ہے وہ یہ ہے:

BEGIN:VCARD
VERSION:3.0
N:Doe;Jane;;;
FN:Jane Doe
ORG:Example Ltd
TITLE:Full-stack engineer
TEL;TYPE=CELL:+15550100
EMAIL;TYPE=INTERNET:jane@example.com
URL:https://example.com
END:VCARD

ایک فیلڈ فی لائن: نام، بڑی آنت، قدر، گاڑی کی واپسی، اور ہر چیز کے آخر میں ایک نئی لائن کریکٹر۔ وہ سٹرنگ بنائیں اور آپ کے پاس ورکنگ کارڈ ہے۔

فارمیٹ بہت 1990 کا ہے اور یہ ظاہر کرتا ہے، لیکن تین اصولوں کو غلط کرنا آسان ہے۔ انکوڈر کو تینوں کو ہینڈل کرنا چاہیے۔

1. حروف کے بجائے لمبی لائنوں کو آکٹٹس میں فولڈ کریں۔

75 بائٹس سے زیادہ لمبی لائنوں کو توڑنا ضروری ہے اور ایک جگہ سے شروع ہونا چاہئے اور اگلی لائن تک جاری رہنا چاہئے۔ ایسا کرنے کا ایک یقینی طریقہ ہے۔ line.slice(0, 75)حروف کو شمار کرتا ہے، بائٹس نہیں، لہذا یہ ڈبل بائٹ حروف کو نصف میں کاٹ سکتا ہے اور ٹیگ میں غلط UTF-8 چھوڑ سکتا ہے۔ اس کے بجائے، بائٹ کی قیمت کو ٹریک کریں جب آپ کوڈ پوائنٹ کے ذریعے سٹرنگ کو عبور کریں۔

2. رہائی Nآپ جو اندازہ لگا رہے ہیں اس کے بارے میں ایماندار رہیں۔

اس کو دیکھو N: لائن vCard 3.0 ناموں کو اس طرح تقسیم کرنے کی کوشش کرتا ہے: Family;Given;Additional;Prefix;Suffixتو خارج کریں۔ FN خود سے یہ کافی نہیں ہے۔ ڈسپلے نام کو ان حصوں میں تقسیم کرنا ایک اندازہ ہے، اور چینی اور ہنگری کے ناموں کے لیے، دو آخری ناموں کے ساتھ ہسپانوی نام، اور کسی ایک نام کے ساتھ، یہ اندازہ غلط ہے۔ آخری ٹوکن لیں، اسے بطور اندازہ دستاویز کریں، اور FNوہ نام ہے جسے درآمد کنندہ درحقیقت دکھاتا ہے، اور جیسا کہ آپ اسے ٹائپ کرتے ہیں بالکل اسی نام کو ظاہر کرتا ہے۔

3. قدر کے اندر تمام سیمکولنز سے فرار۔

وہاں سیمی کالون N: لکیریں ساختی ہیں۔ اگر کسی کی ملازمت کا عنوان "انجینئر؛ لاگوس” ہے، تو اسے براہ راست لکھنے سے ایک فیلڈ کو دو میں تبدیل کر دیا جاتا ہے اور درآمد کنندہ باقی کو نام کے حصے کے طور پر پڑھتا ہے۔ آپ کو اس طرح ٹیگ تک پہنچنا چاہئے: Engineer; Lagos.

ان تین چیزوں کو صحیح طریقے سے ترتیب دینے کے ساتھ، پورا انکوڈر خالص سٹرنگ پروسیسنگ کی تقریباً 170 لائنوں کی صلاحیت رکھتا ہے اور اسے بغیر کسی ٹیگ کے قریبی ٹیسٹ کیا جا سکتا ہے۔

اسکیپ بگ جس نے ٹیسٹنگ پاس کی۔

تیسرا اصول وہ ہے جہاں میرے بدترین کیڑے رہتے تھے۔ میرے فرار کے پاس اس طرح کی لائنیں تھیں:

.replace(/;/g, ';')   // ← this escapes nothing

vCard کو قدر کے اندر سیمکولن سے پہلے لفظی بیک سلیش کی ضرورت ہوتی ہے۔ ';' ایسا لگتا ہے کہ وہ ایک تیار کر رہے ہیں۔ یہ سچ نہیں ہے۔ جاوا اسکرپٹ میں نہیں۔ ; بیک سلیش کو خاموشی سے حذف کرنے اور ایک باقاعدہ کردار واپس کرنے کے لیے فرار کی ترتیب کا استعمال کریں۔ ';'. اس لائن نے تمام سیمکولنز کو اپنے ساتھ بدل دیا۔

یہاں اصلاحات ہیں: '\;'یہاں پہلی بیک سلیش دوسری بیک سلیش سے بچ جاتی ہے۔

پھر حالات بگڑ گئے۔ میں نے فرار ہونے والے کے لیے ایک ٹیسٹ لکھا اور درج ذیل پر زور دیا: غیر محفوظ آؤٹ پٹ، کیونکہ مجھے اب بھی یقین ہے کہ لائن کام کرتی ہے۔ جانچ نے اتفاق کیا کہ یہ ایک بگ تھا۔ اس کا مطلب ہے کہ یہ درست کوڈ میں ناکام ہو گیا۔

پھر تیسرے ٹیسٹ میں یہ ثابت کرنے کی کوشش کی کہ کوئی میدان نہیں ہے۔ not.toContain('N:'). یہ کبھی نہیں گزر سکتا۔ تمام وی کارڈز اس سے شروع ہوتے ہیں: BEGIN:VCARDاور BEGIN: کے ساتھ ختم ہوتا ہے N:.

10 منٹ میں تین غلطیاں، سب ایک جیسی غلط فہمی۔

پہلے ٹیسٹ کرنے سے مجھے بچایا نہیں جاتا۔ ٹیسٹ اور کوڈ مشترکہ مفروضے۔ اسٹرنگ ایسکیپنگ وہ ڈومین ہے جس میں اسے عام طور پر انجام دیا جاتا ہے۔

ٹیگز لکھنے سے پہلے ان سے پوچھیں۔

لکھنا چپ پر موجود چیزوں کی جگہ لے لیتا ہے۔ آرڈر اہم ہے:

1. Query the tag:      is it writable, how big is it really?
2. Refuse early:       read-only, or genuinely too small
3. Write
4. Read it back:       compare with what you sent

لیول 2 حفاظتی وصف ہے۔ انکار پہلے تحریر ٹیگ کو برقرار رکھتی ہے لیکن ناکام ہوجاتی ہے۔ جبکہ آپ اسے آدھا استعمال چھوڑ سکتے ہیں۔

مرحلہ 4 موجود ہے کیونکہ بدترین نتیجہ ایک تحریر ہے جس نے کامیابی کی اطلاع دی لیکن واقع نہیں ہوئی۔ اسی سیشن میں دوبارہ پڑھیں اور موازنہ کریں۔ خام بائٹس کے بجائے مواد کو ریکارڈ کریں۔. ایک ٹیگ قانونی طور پر ایک ہی ڈیٹا والے پیغام کو واپس کر سکتا ہے لیکن بھیجے گئے فریم سے مختلف فریم کے ساتھ۔

تمام 4 شامل ہیں۔ ایک سیشنچار نہیں۔ بالترتیب iOS پر requestTechnology چونکہ ہم سسٹم شیٹ کو صارف کے سامنے رکھ رہے ہیں، اس کو الگ کرنے کا مطلب ہے ایک منطقی کام کے لیے چار شیٹس اور چار ٹیبز۔ Android فرق محسوس نہیں کرے گا۔ یہ بالکل اسی قسم کی چیز ہے جو iOS نظر آنے والے ڈیزائنوں کو من مانی لگتی ہے جب تک کہ آپ انہیں دوسرے پلیٹ فارم پر نہ دیکھیں۔

یہ کامیاب تحریر کے بعد ایپ رائٹنگ اسکرین ہے۔ بائٹ تجزیہ NDEF پیغام کے 27 بائٹس، ٹیگ فریم (TLV) کے 3 بائٹس، کل 27 بائٹس کی ضرورت، اور 137 بائٹس کی اطلاع شدہ صلاحیت کو پڑھتا ہے۔ اس کے نیچے گرین کارڈ کی سرخی ہے۔

ایک اسکرین پر چاروں مراحل۔ ٹیگز کی درخواست کرکے، مفروضوں کی بجائے ناپے گئے نمبرز واپس کرکے، تحریروں پر عمل کرکے، اور واپس پڑھ کر بائٹ بائٹ چیک کریں۔

چوکی: git checkout step-3-write. پروفائل ایڈیٹر، وی کارڈ انکوڈنگ، صلاحیت چیک فنکشن کے ساتھ لکھیں۔

کیا یہ فٹ ہو گا؟ 137، 144 نہیں۔

یہ وہ جگہ ہے جہاں پراجیکٹ نے مجھے کچھ سکھایا۔

NTAG213 کے پاس ہے۔ 144 بائٹس صارف کی یادداشت کا۔ وہ نمبر ہر مخصوص شیٹ پر ہیں: 4 بائٹس کا صفحہ 36، صفحہ 4 سے 39۔ میں نے اس کے ارد گرد صلاحیت کی جانچ کا فنکشن بنایا۔

آپ کو ایک حقیقت پسندانہ وی کارڈ ملے گا (نام، عنوان، کمپنی، فون، ای میل اور 1 لنک)۔ 184 بائٹس متن اور 202 بائٹس NDEF پیغام میں لپیٹے جانے پر، یہ ایک ایسی تصویر ہے جو کچھ حصوں کو واپس کر دیتی ہے۔

پھر ایک باقاعدہ کاروباری کارڈ ریگولر ٹیگز کے مطابق نہیں ہے۔. یہ ایک حقیقی مصنوعات کی حد ہے، کوئی بگ نہیں، اور ایپس کو پراسرار طور پر ناکام ہونے کے بجائے ایسا کہنا چاہیے۔

سوائے میرا فون نمبر غلط ہے۔ جب میں نے آخر میں پوچھا کہ یہ اصل ٹیگ پر کتنا بڑا ہے، تو اس نے کہا: 137.

144 چپ ہے۔ صارف کی یادداشت. مصنفین کے لیے اہم نمبر زیادہ سے زیادہ NDEF ہے۔ پیغامیہ ٹیگ کے اپنے کوگ سے چھوٹا ہے۔ میں تھا 7 بائٹس بہت زیادہ ہے۔کسی کو یہ بتانے کی سمت میں کہ ان کا کارڈ فٹ بیٹھتا ہے جب یہ نہیں ہے۔

غلطی نے دوسری غلطی کو چھپا دیا ہے۔ ٹیگز پیغامات کو لفظی طور پر محفوظ نہیں کرتے ہیں۔ ایک ٹیگ ایک پیغام کو اپنی بک کیپنگ کے چند بائٹس میں لپیٹتا ہے۔ TLV فریمنگقسم، لمبائی اور قدر۔ میں ان بائٹس کو میسج میں شامل کر رہا تھا۔ اور صارف کی میموری سے موازنہ کریں۔ ڈبل گنتی۔ تمام فی الحال استعمال شدہ صلاحیت کے اعداد و شمار (Android پر getMaxSize()iOS میں اسٹیٹس کے سوالات، (معقول مفروضے) ہیں۔ پہلے ہی فریمنگ کو چھوڑ کر پیغام کا سائز۔

بڑی غلطی

نمبروں سے بھی بدتر وہ نتائج تھے جو میں نے پلیٹ فارم کے بارے میں نکالے تھے۔

کیونکہ iOS getTag() صرف لوٹتا ہے۔ { id, tech }میں نے نتیجہ اخذ کیا۔ iOS ٹیگ کی گنجائش کی اطلاع نہیں دے سکتا۔. میں نے اسے کوڈ، پلیٹ فارم کے موازنہ، ایپ کے اپنے UI، اور خلا کو پر کرنے کے لیے منصوبہ بند مقامی ماڈیولز میں لکھا ہے۔ اسے یہاں پہنچایا گیا:

ایپ کو پڑھنے کے دوران ریڈ ایرر کارڈ

یہ ترچھی لکیریں غلط نتائج ہیں جو صارف کو حقائق کے طور پر بیان کی گئی ہیں۔ اس کے اوپر والے کارڈز پر موجود تمام نمبرز اس اندازے پر منحصر ہیں کہ یہ کس پر مجبور کرتا ہے۔

یہ جھوٹ ہے۔ ndefHandler.getNdefStatus()یہ CoreNFC کی طرف سے ہے۔ queryNDEFStatusپڑھنے/لکھنے کی حیثیت اور اصل صلاحیت دونوں کو لوٹاتا ہے۔ ایک سیشن میں میں نے پہلے ہی کھلا تھا۔. اس فیچر نے کوڈ میں صرف ایک کال لی جو کئی ہفتوں سے چل رہی تھی۔

دیکھو غلطی کیسی لگتی ہے۔

  • میں نے کیا دیکھا: ایک فنکشن، getTag()یہ دو فیلڈز اور کوئی سائز نہیں لوٹاتا ہے۔ سچائی

  • میں نے کیا فیصلہ کیا: iOS آپ کو یہ نہیں بتا سکتا کہ ایک ٹیگ میں کتنے بائٹس ہیں۔ یہ پیروی نہیں کرتا ہے۔

صرف اس وجہ سے کہ خصوصیات میں سے ایک سوال کا جواب نہیں دیتی ہے اس کا مطلب یہ نہیں ہے کہ پلیٹ فارم اس کا جواب نہیں دے سکتا۔ میں نے ایک دروازہ آزمایا، اسے بند پایا، اور یہ نتیجہ اخذ کیا کہ عمارت میں داخل ہونے کا کوئی راستہ نہیں تھا۔

اس پروجیکٹ کے لیے میرا قاعدہ یہ ہے کہ جب تک ہم اسے ڈیوائس پر نہ دیکھ لیں حقیقت کے طور پر کچھ بھی ریکارڈ نہیں کیا جاتا۔ میں نے اس کی پیروی کی جس کی میں نے پیمائش کی۔ ہم بھول گئے کہ ہم نے اپنی پیمائش سے کیا نتیجہ اخذ کیا ہے۔

غیر چیک شدہ نتائج اتنے ہی خطرناک ہوتے ہیں جتنے غیر چیک شدہ نمبر اور سمجھنا زیادہ مشکل۔ کیونکہ یہ نیچے کی اصل پیمائش کو ساکھ دیتا ہے۔

لہذا ایپ اب ٹیگ کی درخواست کرتی ہے اور صرف اس صورت میں فرض کرتی ہے جب ٹیگ نے ابھی تک جواب نہیں دیا ہے۔ ہر بار جب آپ کوئی قیاس کرتے ہیں، آپ کہتے ہیں:

Too big for this tag
202 bytes, assuming an NTAG213's 137. It is 65 bytes over.
Shorten the profile or write a link instead.

No tag has reported its size yet, so this assumes an NTAG213.
Tags state their real capacity when you write to them.

جب بھی کوئی عدد فرض کیا جاتا ہے تو لفظ "مفروضہ” ظاہر ہوتا ہے۔ یہ جان بوجھ کر دہرایا گیا ہے۔ جس لمحے ایپ بولنا بند کر دیتی ہے، قاری کو یقین ہونے لگتا ہے کہ ایپ نے کچھ ناپا ہے۔

ٹیگ کے جواب دینے کے بعد، وہی کارڈ اس طرح نظر آتا ہے:

ریڈ ایرر کارڈ پڑھیں

"NTAG213 فرض کریں” کے بجائے، "اس ٹیگ کی اطلاع دیں”۔ ایک جیسے کارڈز، وہی ترتیب، اور ایک لفظ جو آپ کو یہ بتانے کے لیے بدلتا ہے کہ نمبرز چپس سے آئے ہیں یا آپ کی طرف سے۔

ایک ایسا بگ جس نے تلاش کرنا مشکل بنا دیا۔

یہ ہیں میرے پری فلائٹ چیکس: لائبریری خود TagSizeTooSmall جب پیغام درست نہیں ہے۔ لہذا، اگر لکھنا ناکام ہوجاتا ہے تو، ایک خرابی واقع ہوئی ہے. TagSizeTooSmallبالکل وہی جو CoreNFC پیدا کرتا ہے۔ کہ میں نے لکھنے سے انکار کر دیا۔

یہ ایپ کی تحریری اسکرین ہے۔ بائٹ تجزیہ NDEF پیغام کے 202 بائٹس، ٹیگ فریمنگ (TLV) کے 3 بائٹس، کل 205 بائٹس کی ضرورت، اور تخمینہ صلاحیت کے 144 بائٹس پڑھتا ہے۔ اس کے نیچے سرخ کارڈ کا عنوان تھا۔

ڈویلپر پینل میں دو چیزیں ہیں: NfcError.TagSizeTooSmall یہ ایک لائبریری کلاس ہے جو ٹیگ کا حوالہ دینے سے پہلے میرے کوڈ میں واقع ہوئی تھی۔ اور message: "" (empty) اس کے پیچھے خامی یہ ہے کہ کلاس پورا معنی رکھتی ہے اور سکرین پر چھپی ہوئی تار میں وہ معنی بالکل نہیں ہوتے۔

ہمارا مسترد اور ٹیگ کا رد ایک ہی تار تھا۔ جس سوال کا میں جواب دینے کی کوشش کر رہا تھا (کیا پلیٹ فارم کی رپورٹ کی گنجائش تھی؟) وہی تھا جس نے غلطی کو صاف کیا۔

اپنی منطق میں انحصار میں اس قسم کی غلطی کو بڑھانے سے گریز کریں۔ یہ "ہم نے نہیں کہا” اور "انہوں نے نہیں کہا” کو ایک سگنل میں کم کر دیا، اور جب کچھ غلط ہو جائے تو آپ ان کے درمیان درست طریقے سے فرق کرنے کے قابل ہونا چاہتے ہیں۔

ٹیگ کے اپنے نمبر کے ساتھ ایک وقف شدہ غلطی کی قسم کا استعمال کرتے ہوئے، جواب فوری تھا۔

WritePreflightError: too-big
tag reported status 2, 137 bytes
needed 202 bytes

یہ وہاں تھا۔ پلیٹ فارم صلاحیت کی اطلاع دیتا رہا۔

ایک ہی اسکرین، ایک ہی چپ پہلے اور بعد:

ترمیم کرنے سے پہلے ایپ کی معلومات کی سکرین کو ٹیگ کریں۔ پڑھنے کی صلاحیت

ایپ کی ٹیگ انفارمیشن اسکرین۔ صلاحیت: 137 بائٹس پڑھی اور تشریح کی گئی۔

پہلے شاٹ میں "Capacity” کے تحت تمام الفاظ میرے ہیں، پراعتماد شخص غلط ہے۔ اس کے نیچے کی نیلی لکیر بدتر ہے۔ یعنی، زمینی کام کا ایک پورا مرحلہ اس خلا کو پُر کرنے کے لیے مقرر کیا گیا ہے جو کبھی موجود نہیں تھا۔

دوسرا تشریحی نمبر پڑھتا ہے۔ ٹیگ سے ہی اطلاع دی گئی۔اس دوران، پلیٹ فارم میں کچھ بھی شامل نہیں کیا گیا ہے۔ لیکن نوٹ کریں کہ کیا تبدیل نہیں ہوا ہے۔ "NDEF قسم” کو اب بھی "رپورٹ نہیں کیا گیا” کے طور پر نشان زد کیا گیا ہے کیونکہ یہ اصل میں دستیاب نہیں ہے۔ ان سوالوں میں سے ایک جس کا پلیٹ فارم جواب نہیں دے سکتا ان سوالات کے بالکل اوپر ہے جن کا وہ ہمیشہ جواب دینے میں کامیاب رہے ہیں۔ یہی وجہ ہے کہ میں نے اتنی دیر تک غلط چیزوں پر یقین کیا۔

ایک فوکسڈ سیشن جو ٹیگز کے بغیر ختم نہیں ہو سکتا۔

بزنس کارڈز ایک بہترین ڈیمو ہیں، لیکن وہ ٹیگز کے آدھے مقصد کو پورا کرتے ہیں۔ چپس کا دوسرا آدھا حصہ جسمانی حالت: ایسی چیز جو حقیقی دنیا میں اس سے پہلے کہ سافٹ ویئر کچھ بھی کر سکے۔

لہذا ایپ کا دوسرا فنکشن ہے۔ یہ ایک فوکسڈ ٹائمر ہے جسے سیدھے ٹیگ پر جانے کے بغیر نہیں روکا جا سکتا۔

اپنے چپس کو تکلیف دہ جگہوں پر چھوڑ دیں۔ نیچے کی دراز میں، الماری کے پچھلے حصے میں۔ سیشن شروع کرنے کے لیے تھپتھپائیں۔ کسی سیشن کو ختم کرنے کے لیے، آپ کو اس پر واپس جانا چاہیے۔

یہ خیال میرا نہیں ہے۔ Foqos (App Store پر اوپن سورس)، TapBlok، nfcGuard، اور Focusaur سبھی یہاں اکٹھے ہو جاتے ہیں، اور وہ اکٹھے ہو جاتے ہیں کیونکہ Insight بالکل NFC کے بارے میں نہیں ہے۔

رگڑ کوئی اشارہ نہیں ہے، یہ ایک خطہ ہے۔ ٹیپ کرنے کی لاگت 1 سیکنڈ ہے۔ پیسے کی قیمت یہ ہے کہ ٹیگز نیچے ہیں۔ ٹیگ کا مقام یہ ایک پروڈکٹ ہے۔ NFC صرف مقام کو قابل نفاذ بناتا ہے۔

یہ تین اصولوں کی پیروی کرتا ہے، جن میں سے ہر ایک کوڈ کی ایک لائن ہے۔

1. ایک ٹیگ، دو معنی۔

سیشن اس وقت شروع ہوتا ہے جب آپ اسی ٹیب کے ساتھ بیکار ہوتے ہیں اور جب آپ توجہ مرکوز کرتے ہیں تو ختم ہوتا ہے۔ دو ٹیگ کھونے کے لیے دو اشیاء اور دو عادات بنانے کے لیے ہوں گے۔ تمام فیصلے ایک واحد خالص فعل کے طور پر کیے جاتے ہیں۔

export function verdictForTap(
  scannedTagId: string,
  boundTagId: string | null,
  isFocused: boolean
): TapVerdict {
  if (!boundTagId) return { action: 'bind' };

  if (normaliseTagId(scannedTagId) !== normaliseTagId(boundTagId)) {
    return { action: 'wrong-tag', expected: boundTagId };
  }

  return isFocused ? { action: 'end' } : { action: 'start' };
}

کہ wrong-tag برانچ ایک اصول ہے جس پر ہر چیز کی بنیاد ہے۔ ٹیگ کو قبول کرنا "جہاں اسٹیکر رہتا ہے وہاں جانے” کے بجائے "اسٹیکر کا مالک ہونا” کی رسم بن جاتی ہے۔

نارملائزیشن اس سے کہیں زیادہ اہم ہے۔ اسی جسمانی چپ کی اطلاع دی گئی ہے: 04C4FC91DF2A81 ایک پڑھنے والے راستے کے ساتھ 04:c4:fc:91:df:2a:81 کسی اور کی طرف سے. اسے دوسرے ٹیگ کے طور پر سمجھنا ایک پاگل کیڑا ہے۔ آپ کے ہاتھ میں درست چپ خاموشی سے رد کر دی جاتی ہے۔

سیشن کے دوران ایپ پر ٹیب پر فوکس کریں۔ ایک بڑا کاؤنٹر پڑھتا ہے۔

سبز بٹن کچھ بھی نہیں چھوڑتا ہے۔ اسکین شروع ہوتا ہے اور اسکین سیشن کو ختم کرتا ہے۔ اس کے نیچے ہوائی اڈے تک جانے کے لیے جان بوجھ کر پرسکون راستہ ہے۔

2. ٹائمر اوپر شمار ہوتا ہے اور گنتی نہیں کرتا۔

الٹی گنتی آپ کو صوفے پر بیٹھ کر انتظار کرنے کی دعوت دیتی ہے۔ کیونکہ سیشن ختم ہوجاتا ہے قطع نظر اس کے کہ آپ نے کچھ کیا یا نہیں۔ گنتی کی تعداد اس بات کی پیمائش کرتی ہے کہ اصل میں کیا ہوا ہے۔

3. منسوخ شدہ سیشنز کو روکا نہیں جاتا بلکہ لاگ ان کیا جاتا ہے۔

اور یہیں سے ڈیزائن دلچسپ ہو جاتا ہے۔

آپ اصل میں کیا کر سکتے ہیں۔

آپ TikTok کو بلاک نہیں کر سکتے۔ دراصل iOS پر کسی اور ایپ کو بلاک کرنے کے لیے، آپ کو ضرورت ہوگی: com.apple.developer.family-controls، مراعات یافتہ حیثیت ایپل انفرادی طور پر ان کا جائزہ لیتا ہے اور انہیں صرف ان ایپس کو دیتا ہے جن کا بنیادی مقصد ڈیجیٹل فلاح و بہبود یا والدین کے کنٹرول ہے، اور TestFlight کو بھی ان کی ضرورت ہوتی ہے۔ فوقوس ہے۔ اگر آپ اس ہینڈ بک کی پیروی کرتے ہیں، تو ایک اچھا موقع ہے کہ آپ اس پر عمل نہیں کریں گے، یا آپ اپنے وعدوں کو پورا نہیں کر پائیں گے۔

تو آئیے ایک چیز کو نافذ کریں جو آپ واقعی کر سکتے ہیں۔ ریکارڈ.

اس کی وجہ یہ ہے کہ یہ ایک وعدہ آلہ ہے جس میں کوئی فرار نہیں ہے، ایک ایسا آلہ جسے پہلی بار جب آپ ہوائی اڈے پر پھنس جائیں تو اسے ہٹا دینا چاہیے۔ خوراک کے لیے ایک مستقل اور نظر آنے والی علامت کی ضرورت ہوتی ہے۔ اس سیشن کو جلد ختم ہونے کے طور پر ریکارڈ کیا جائے گا۔ نشان دائمی ہے اور جب بھی آپ اس ٹیب کو کھولیں گے ظاہر ہوگا۔

اور تاریخ محفوظ ہے۔یہ کوئی نوٹ یا سند نہیں ہے، یہ خود ریکارڈ ہے۔ کیونکہ ایپ میں تاریخ ہی واحد چیز ہے جو صارفین سے محفوظ رکھتی ہے۔ تحفظ غیر متناسب ہے۔

تاریخ پڑھیں یہ ہمیشہ مفت ہے۔ بات یہ ہے کہ آپ اسے دیکھتے ہیں۔
اس میں شامل کریں صرف سیشنوں کے ذریعے زندگی گزار کر
صاف ٹیگز کی ضرورت ہے۔

آپ کے ریکارڈ پر کچھ بھی درج نہیں ہوتا ہے جسے آپ رات 11 بجے اپنے صوفے سے مٹا سکتے ہیں۔ اسے صاف کرنے میں بالکل وہی لاگت آتی ہے جو پیسہ کمانے میں خرچ ہوتی ہے۔ بس چلنا ہے۔

سیشن کے درمیان ٹیب پر فوکس کریں۔ اوپر والے تین نمبرز 1m فوکسڈ، 2 اسٹریک اور 0 اینڈڈیئرلی کی نمائندگی کرتے ہیں۔ ذیل میں ایک فہرست ہے۔

اس سے قطع نظر کہ یہ "ابتدائی ختم” کہتا ہے یا نہیں، یہ بات ہے۔ چونکہ یہ مستقل طور پر تسلسل کے ساتھ واقع ہے، استعمال سے پہلے باہر نکلنے کی قیمت دیکھی جا سکتی ہے۔ اور "کلیئر ہسٹری” نیچے ایک منہدم کنٹرول ہے۔ آپ کی ایپ میں سے ایک عمل ٹیگز کی درخواست کرنا ہے۔

یہاں دو چھوٹے فیصلے ہیں جو اہم نکلے۔ رننگ سیشن دوبارہ شروع ہونے پر برقرار رہتے ہیں۔چونکہ یہ برقرار رہتا ہے، زبردستی چھوڑنا خودکار شٹ ڈاؤن طریقہ نہیں ہے۔ صرف راستہ ٹیگ اور ہیچز ہیں، جن میں سے ایک پگڈنڈی چھوڑتا ہے۔

اور مداخلت شدہ سیشنز اب بھی آپ کے کل فوکس ٹائم میں شمار ہوتے ہیں۔کیونکہ آپ تھا جب تک کہ آپ توجہ مرکوز نہ کریں۔ اسے صفر کرنا درست سے زیادہ سزاوار ہوگا۔

اس کے برعکس، لکیریں جان بوجھ کر سخت ہیں۔ اگر کسی سیشن میں خلل پڑتا ہے، تو آپ کا سلسلہ 0 پر دوبارہ ترتیب دیا جائے گا۔ جس نمبر کو آپ کھو نہیں سکتے وہ دیکھنے کے قابل نہیں ہے۔

مرتب کرنے والے کے ذریعہ دریافت ہونے والے دو رد عمل کیڑے

دونوں عام رد عمل کیڑے ہیں، NFC کیڑے نہیں، اور نہ ہی مجھے دریافت کیا گیا ہے۔ ری ایکٹ کمپائلر لنٹ کے اصول فراہم کرتا ہے: eslint-plugin-react-hooks اس فلیگ کوڈ کو محفوظ طریقے سے بہتر نہیں کیا جا سکتا، اور ان میں سے دو کو یہاں نافذ کیا گیا تھا۔ اسے حاصل کرنے کے لیے آپ کو کمپائلر کو اپنانے کی ضرورت نہیں ہے۔

const [now, setNow] = useState(Date.now()); // ✗ impure during render

بس purity قواعد کے مطابق صحیح مقدمات کے نام بتائیں۔ Date.now() اس کے آگے درج ہے۔ Math.random() اور crypto.randomUUID() ایک API جو "ایک ہی ان پٹ کے لیے مختلف اقدار لوٹاتا ہے”۔ رینڈرنگ کے دوران گھڑی کو پڑھنے سے جزو ہر بار مختلف آؤٹ پٹ پیدا کرے گا۔

واضح ترمیم (اثر کے اوپری حصے میں سیٹ) دوسرے اصول کی خلاف ورزی کرتی ہے۔ set-state-in-effect سیدھے الفاظ میں: "اثر کے اندر فوری طور پر حالت کو ترتیب دینے سے رد عمل پورے رینڈرنگ سائیکل کو دوبارہ شروع کرنے کا سبب بنتا ہے”، "اضافی رینڈرنگ پاسز جن سے بچا جا سکتا تھا” پیدا ہوتا ہے۔

کہ purity صفحہ میں ترمیم کرنا ہی سست ابتدا ہے۔ useState(() => Date.now())ایک گھڑی کے لیے جو ایک حصہ انسٹال ہونے پر شروع ہوتی ہے، یہ جواب ہے۔ یہ ٹائمر ماؤنٹ ٹائم پر شروع نہیں ہوتا ہے، بلکہ جب سیشن شروع ہوتا ہے، تو اس وقت تک ماؤنٹ ٹائم اسٹیمپ پہلے سے ہی غلط ہو جائے گا۔ elapsed فریم کے لیے منفی نمبر پیش کرتا ہے۔

وقت شروع 0 یہ ایک خالص اور قابل استعمال واچ ڈاگ ہے۔ falsy کا مطلب ہے "ابھی تک کوئی ٹک نہیں”، لہذا لیبل بکواس کے سوا کچھ نہیں کہتا۔

درست اور صاف ورژن ایک کام کے لیے ملتوی کر دیا جاتا ہے۔

useEffect(() => {
  if (!session) return;

  // Deferred rather than called straight away: a synchronous setState inside
  // an effect cascades a second render pass. A zero timeout hands it to the
  // next task, which updates just as promptly without the cascade.
  const first = setTimeout(() => setNow(Date.now()), 0);
  const id = setInterval(() => setNow(Date.now()), 1000);

  return () => {
    clearTimeout(first);
    clearInterval(id);
  };
}, [session]);

NFC تالے کیوں محفوظ نہیں ہیں۔

فوکس فنکشن ٹیگ کے شناخت کنندہ کو کلید کے طور پر استعمال کرتا ہے۔ زیادہ تر NFC "لاک” ایپس کے لیے بھی یہی ہے۔ یہ ایماندار ہونے کے قابل ہے کہ یہ کیا ہے اور کیا نہیں ہے۔

ٹیگ کی UID ہر کسی کے پڑھنے کے قابل ہے اور اسے آسانی سے کاپی کیا جا سکتا ہے۔ یہ کوئی راز نہیں ہے۔ یہ ایک سیریل نمبر ہے، اور جو بھی پوچھتا ہے اسے نشر کیا جاتا ہے۔

اس میں ایپل کی اپنی شارٹ کٹ آٹومیشن کیز بھی آن ہیں، جیسا کہ پہلے سیکشن میں بتایا گیا ہے۔ یہ آپ کو بتاتا ہے کہ پلیٹ فارم خود ضمانتوں کا اندازہ کیسے کرتا ہے۔ آپ کو "میرا ڈیسک لیمپ آن کرنے” پر جرمانہ عائد کیا جائے گا اور یہ ایک سند کے طور پر کام نہیں کرے گا۔ 20 پاؤنڈ کا آلہ سیکنڈوں میں ایک کلون کر سکتا ہے، اور آپ کا فون ان میں سے کچھ کو مکمل طور پر نقل کر سکتا ہے۔ "کیا یہ صحیح UID ہے؟” پر ایک رسائی سسٹم بنایا گیا ہے؟ یہ ایک تھیٹر ہے۔

فوکس ٹائمر کے لیے یہ بالکل ٹھیک اور کہنے کے قابل ہے: خطرے کا نمونہ آپ ہیں، اپنے ہی گھر میں سست۔ چہل قدمی کو چھوڑنے کے لیے اپنے ٹیگز کو ڈپلیکیٹ کرنا کوشش کی ایک سطح ہے جو مشق کے نقطہ کو شکست دیتی ہے۔ رگڑ ایک مصنوعات ہے، سیکورٹی نہیں ہے.

تاہم، اگر آپ اصل اسناد (دروازہ، ادائیگی، یا ڈیوائس کی جوڑی) کے ساتھ ٹیگ تک پہنچ جاتے ہیں، تو UID ایک خراب پرائمٹیو ہے اور آپ کو ایک چپ کی ضرورت ہے جو انکرپشن کر سکے۔

نہیں NTAG424DNA یہ ایک عمومی جواب ہے۔ ایک مقررہ نمبر پیش کرنے کے بجائے، یہ ایک ایسی کلید کا استعمال کرتا ہے جو کسی کاؤنٹر کے ذریعے پیغام کے تصدیقی کوڈ کا حساب لگانے کے لیے چپ کو کبھی نہیں چھوڑتی ہے جو ہر بار ٹیپ کرنے پر بڑھ جاتی ہے۔ ہر نل ایک مختلف دستخط شدہ قدر پیدا کرتا ہے، لہذا کیپچر کی گئی قدر ایک سیکنڈ کے بعد بیکار ہے۔ یہ شناخت کنندہ اور تصدیق کنندہ کے درمیان فرق ہے۔

تو یہاں کیا لینا ہے: UID جواب دیتا ہے "یہ کون سا ٹیگ ہے؟” اور کچھ نہیں. اگر آپ کی سیکیورٹی ناقابل معافی جوابات پر منحصر ہے، تو آپ کو ایک سائننگ چپ کی ضرورت ہے، نہ کہ اعلان کرنے والی چپ۔

چار مسائل جو ہر رات وقت ضائع کرتے ہیں۔

ان میں سے ہر ایک میرے کوڈ میں کیڑے کی طرح لگتا تھا اور درحقیقت پلیٹ فارم کا محاورہ تھا۔

مسئلہ 1: سسٹم شیٹ غلطی کے بغیر غائب ہو جاتی ہے۔

اسکیننگ شروع کریں۔ پرچہ مختصر طور پر ظاہر ہوتا ہے اور پھر غائب ہوجاتا ہے۔ کنسول میں کوئی غلطیاں نہیں، کوئی مسترد نہیں، کچھ بھی نہیں۔

اس کا مطلب ہے کہ CoreNFC سیشن ڈیلوکیٹڈ. سوئفٹ جیسے ہی کسی چیز کو جاری کرتا ہے جیسے ہی اس میں کوئی حوالہ نہیں ہوتا ہے۔ خودکار حوالہ گنتی (ARC) یہی کرتی ہے۔ لہذا اگر آپ سیشن کو اس فنکشن کے اندر مقامی متغیر میں رکھتے ہیں جس نے سیشن شروع کیا تھا، جب فنکشن واپس آجائے گا تو متغیر ختم ہو جائے گا اور سیشن اسے اپنے ساتھ لے جائے گا۔

اس مسئلے کو حل کرنے کے لیے، کال سے زیادہ دیر تک چلنے والے سیشنز رکھیں۔ ایکسپو ماڈیول میں خصوصیات یہ ہیں:

// Held for the life of the module, not the scan.
private var readSession: Any?

CoreNFC انضمام میں غلطی کا یہ سب سے آسان طریقہ ہے، لیکن یہ آپ کو کچھ نہیں بتاتا۔

مسئلہ 2: سیشن ختم ہونے پر نتائج کو اوور رائٹ کر دیا جاتا ہے۔

اگر آپ ٹیگ کو کامیابی سے پڑھتے ہیں اور وعدے کو حل کرتے ہیں، تو JavaScript کو اس کی بجائے ایک غلطی موصول ہوگی۔

ایسا کیوں ہوتا ہے؟ ایک کامیاب پڑھنا سیشن کو بھی باطل کر دیتا ہے۔تو didInvalidateWithError آگ ~ بعد آپ کی تکمیل کا ہینڈلر۔ اگر دونوں راستے ایک ہی وعدے کی تصدیق کرتے ہیں، تو بعد میں منتخب کردہ راستہ جیت جاتا ہے۔

اسے ٹھیک کرنے کے لیے، گارڈ کو بالکل ایک بار فائر کرنے کے لیے سیٹ کریں۔ ایک تالا، ایک جگہ:

private func settle(resolving value: [String: Any]) {
  lock.lock()
  defer { lock.unlock() }

  guard let promise else { return }   // already settled: do nothing
  self.promise = nil
  promise.resolve(value)
}

چونکہ 4 نیسٹڈ غیر مطابقت پذیر اقدامات اور 5 ناکامی کے راستے ہیں، اس کو فرض کرنے کے بجائے نافذ کیا جانا چاہئے۔

پکڑا 3: Missing required entitlement اپنی قابلیت کے بارے میں

تم ہو NDEF اور TAG آپ اہل ہیں اور سیشن ابھی بھی شروع ہونے سے انکار کرتا ہے۔

ایسا کیوں ہوتا ہے؟ ووٹنگ کے اختیاراتوائرلیس معیارات کی فہرست جو CoreNFC کو سیشن کھولتے وقت سننے کو کہتے ہیں۔ ہر ایک اپنے طور پر حکومت کرتا ہے۔ میں نے درخواست کی [.iso14443, .iso15693, .iso18092]آخری FeliCa ہے، ایک معیاری جو بنیادی طور پر جاپان میں استعمال ہوتا ہے۔ com.apple.developer.nfc.readersession.felica.systemcodes. اس کلید کے بغیر درخواستیں ناکام ہو جائیں گی۔ مکمل سیشنیہ غلطی کے ساتھ ساتھ پولنگ موڈ میں "FeliCa” نہیں کہتا ہے۔

اس مسئلے کو حل کرنے کے لیے، صرف ان چیزوں کے لیے پوچھیں جن پر آپ دستخط کر سکتے ہیں۔

pollingOption: [.iso14443, .iso15693],

.iso14443 NTAG اور MIFARE کا احاطہ کرتا ہے، ہر وہ چیز جو آپ کو اپنے ٹیگنگ پروجیکٹ کے لیے درکار ہے۔ میں نے تیسرا شامل کیا "تاکہ غیر متوقع ٹیگز بہتر غلطیاں پیدا کریں”۔ ایک سیشن بنایا گیا ہے جسے شروع نہیں کیا جا سکتا۔

یہ وہی سبق ہے جو پہلے وائلڈ کارڈ پروفائل کی خرابی ہے، لیکن مخالف سمت میں۔ چلا گیا استحقاق کے نتیجے میں کوڈ پر دستخط کرنے میں ناکامی ہوئی۔ یہاں، ایک مکمل طور پر غیر ضروری اہلیت رن ٹائم اہلیت دکھائی دیتی ہے۔

پکڑا 4: cannot find 'YourClass' in scope موجودہ فائلوں کے لیے

جب میں مقامی ایکسپو ماڈیول میں سوئفٹ فائل شامل کرتا ہوں اور اسے بناتا ہوں، تو مرتب کرنے والا دعوی کرتا ہے کہ کلاس موجود نہیں ہے۔

ایسا اس وجہ سے ہوتا ہے جس طرح سے iOS پر انحصار جکڑا جاتا ہے۔ CocoaPods ایک پیکیج مینیجر ہے جو CocoaPods بناتا ہے، ہر ایک ذیلی تفصیلاتفائلوں کی ایک چھوٹی سی فہرست جس کا ماخذ ہے۔ آپ جو کہتے ہیں وہ ہے "ہر بار .swift "اس فولڈر میں فائلیں”، لکھا ہوا ہے: **/*.swift.

پکڑو: CocoaPods اس پیٹرن کو ایک بار بڑھاتا ہے جب: pod install دوڑو۔ یہ ایک فہرست ہے، اصل اصول نہیں۔ مرتب کرنے والا سچ کہہ رہا ہے، کیونکہ بعد میں جو فائلیں تیار ہوتی ہیں وہ بالکل بھی Xcode کی تعمیر میں شامل نہیں ہیں۔ جہاں تک میں جانتا ہوں، آپ کی کلاس موجود نہیں ہے۔

اس مسئلے کو حل کرنے کے لیے، اصول کو یاد رکھیں اور ہر بار 10 منٹ ضائع نہ کریں۔

اضافہ فنکشن → موجودہ فائلوں سے دوبارہ بنائیں۔ اضافہ فائل → pod install، پھر تعمیر نو

نہ ہی غلطی کے پیغام میں ذکر کیا گیا ہے۔

میں ادائیگی کے لیے نل کیوں نہیں بنا سکتا؟

یہاں دو پلیٹ فارمز کے درمیان فرق ڈگری کی بات نہیں ہے۔ اپنے پروڈکٹ مینیجر سے کوئی وعدہ کرنے سے پہلے یہ جان لیں۔

‘ادائیگی کے لیے تھپتھپائیں’ کے دو مختلف معنی ہیں۔

سب سے پہلے، وہاں ہے. اپنے موبائل فون سے ادائیگی کریں۔: Apple Pay یا Google Wallet سے بینک کارڈ۔ iOS پر، محفوظ عنصر بند ہے۔ کوئی تھرڈ پارٹی APIs نہیں ہیں۔ محدود نہیں، اہل نہیں: کوئی نہیں۔

دوسرا، وہاں ہے اپنے فون سے ادائیگیاں قبول کریں۔: آئی فون پر ادائیگی کرنے کے لیے تھپتھپائیں۔یا ProximityReader کنکال یہ موجود ہے، لیکن اب بھی تعمیر نہیں کیا جا سکتا.

  • نہیں تنظیمی سطح ڈویلپر اکاؤنٹ سے درخواست کی گئی۔ اکاؤنٹ ہولڈر

  • الگ الگ ٹیسٹ اور لائیو کوالیفیکیشن دی گئی۔انفرادی طور پر درخواست دیں۔

  • پہلے سے طے شدہ معیار اور اصل وقت کی منظوری پر مبنی Apple کے جائزوں میں کچھ وقت لگ سکتا ہے۔ اہم

  • آپ کو ایک منظور شدہ ادائیگی فراہم کنندہ (سٹرائپ، ایڈین، اسکوائر) کے ذریعے ضم ہونا چاہیے۔

اب اینڈرائیڈ۔ HostApduService چلو یہ کرتے ہیں تمام ایپس ایک کارڈ کی تقلید کرتی ہیں۔ کوئی ایکریڈیشن، کوئی قابلیت، کوئی پی ایس پی نہیں۔ نافذ کرنا processCommandApdu()رجسٹر کریں۔ بیک اپپھر آپ کا کام ہو گیا۔ AID ایپلیکیشن شناخت کنندہ ہے، ایک نمبر جس کی درخواست ادائیگی کے ٹرمینل سے کی گئی ہے تاکہ یہ تعین کیا جا سکے کہ آپ کے فون پر کون سی ایپ جواب دے۔

صرف ایک حقیقی گیٹ وے ہے۔ AID ذیل میں رجسٹرڈ ہے۔ CATEGORY_PAYMENT یہ صرف اس صورت میں کام کرتا ہے جب آپ کی ایپ ڈیفالٹ والیٹ ہے (یا Android 15+ میں والیٹ رول ہولڈر) یا پیش منظر میں ہے اور کال کرتی ہے۔ setPreferredService. لیکن CATEGORY_OTHERبند لوپ کارڈز، وفاداری، رسائی کنٹرول اور ذخیرہ شدہ قیمت کا پتہ دیتا ہے۔ کھلا اور ہمیشہ فعال.

iOS اینڈروئیڈ
کارڈ ایمولیشن ناممکن HostApduServiceکوئی منظوری نہیں
ادائیگی کی حمایت قابل اطلاق نہیں۔ پہلے سے طے شدہ والیٹ گیٹ
بلا معاوضہ امداد قابل اطلاق نہیں۔ کھلا
ادائیگی قبول کریں۔ اہلیت + PSP + ریاست کھلا

اس ہینڈ بک میں دیگر تمام اختلافات کے برعکس، یہ ڈگری یا ظاہری شکل کا فرق نہیں ہے۔ ایک پلیٹ فارم صرف یہ خصوصیات پیش نہیں کرتا ہے۔ اگر آپ کے پروڈکٹ پلان میں ایک ایسا فون شامل ہے جو کارڈ کے طور پر ڈھونگ کرتا ہے، تو وہ پلان صرف اینڈرائیڈ کے لیے ہے، اس لیے اسپرنٹ کے بعد اسے ابھی سیکھنا بہتر ہے۔

آپ کو اپنا مقامی ماڈیول کیوں لکھنا چاہئے۔

اب تک سب کچھ کام کر چکا ہے۔ react-native-nfc-manager. اس منصوبے کے آخری تیسرے حصے نے اس کی جگہ لے لی اور اس کی وجوہات درمیان میں بدل گئیں۔

اصل جواز صلاحیت کا فرق تھا۔ iOS صلاحیت کی اطلاع نہیں دے سکتا، لہذا اسے پڑھنے کے لیے آپ کو اپنے مقامی کوڈ کی ضرورت ہوگی۔ جیسا کہ آپ دیکھ سکتے ہیں، وہ دلیل ختم ہو گئی ہے۔ یہ ایک اندازہ تھا، مشاہدہ نہیں تھا۔

لہذا، آپ کی حوصلہ افزائی کے ساتھ خاموشی سے کام پر رہنے کے بجائے، یہاں اصل ورژن ہے. کچھ ٹیمیں تیسری پارٹی کے انحصار کو استعمال کرنے کے قابل نہیں ہوسکتی ہیں۔ یہ ایک سادہ پیکج ہے جس کی تبدیلیوں کو صرف داخلی پالیسیوں، آڈٹ کی ضروریات، یا مفید نظام الاوقات کے مطابق ضم نہیں کیا جا سکتا۔ "میں اسے خود کیسے بنا سکتا ہوں؟” یہ اپنے آپ میں جواب کا مستحق ہے۔

اور یہ خاص طور پر انحصار کے ثبوت پہلے ہی پڑھ کر جمع کیے جا چکے ہیں:

تلاش کریں کہاں
ٹیکسٹ ڈیکوڈر اس زبان کے کوڈ کو مسترد کرتا ہے جسے اس نے ابھی ماپا ہے۔ ndef-lib/ndef-text.js
UTF-16 پرچم کو نظر انداز کر کے کھلا چھوڑ دیا گیا ہے۔ TODO ndef-lib/ndef-text.js
String.fromCharCode U+FFFF کے اوپر چھوٹا ndef-lib/util.js
index.d.ts TypeScript غلط ہے۔ یہ مندرجہ ذیل وجوہات کی بناء پر مرتب کرتا ہے: skipLibCheck یہ آن ہے۔ index.d.ts
پیکیج روٹ مین رن ٹائم سے باہر ہوتا ہے۔ src/NativeNfcManager.js
تمام ایرر کلاسز ایک خالی قدر پاس کرتی ہیں۔ message src/NfcError.js

آخری مسئلہ مرحلہ 1 میں ایک حقیقی خرابی کا باعث بنا۔ ایک ناکام سکین پیش کیا گیا ہے۔ بالکل کچھ نہیںکیونکہ سکرین ایسی تھی۔ setError(err.message)پیغام یہ ہے: ''رد عمل خالی تاروں کو غلط سمجھتا ہے۔ مطلب صرف کلاس میں رہتا تھا۔

ان میں سے کوئی بھی جاوا اسکرپٹ کے ساتھ تبدیل نہیں کیا جا سکتا۔

سہاروں اب مشکل حصہ نہیں ہے.

npx create-expo-module@latest --local --name NfcNative 
  --package com.you.nfcnative -p apple android --features Function

چار فائلیں ہیں اور وہ خود بخود تعمیر سے منسلک ہوجاتی ہیں۔ pod install. کوئی ایکس کوڈ پروجیکٹ سرجری نہیں ہے۔ RCT_EXPORT_METHOD ایک C++ پرت جو میکروز یا ہاتھ سے لکھے JSI یا JavaScript کو مقامی کوڈ کو براہ راست کال کرنے کی اجازت دیتی ہے۔ اگر آپ نے پل کے دور میں React Native میں آخری ماڈیول لکھا تھا، تو یہ سرخی ہے۔

دو snags ہیں، جو دونوں غیر دستاویزی ہیں۔ --name سیٹ اپ مقامی ماڈیول نام، جبکہ ڈائریکٹری پوزیشنل پاتھ دلیل سے آتا ہے (لہذا اگر کوئی دلیل نہیں ہے، modules/my-module)۔ اور تیار کردہ پوڈسپیک ایک iOS تعیناتی ہدف کا اعلان کرتا ہے جو خود بخود آپ کی ایپ کے لیے کم از کم اضافہ کر سکتا ہے۔

ٹائپ شدہ غلطی جو اصل میں پیغام پہنچاتی ہے۔

internal final class NoNfcSettingsException: Exception {
  override var reason: String {
    "iOS has no NFC setting to open. NFC is available whenever the hardware supports it."
  }
}

ایکسپو Exception ہر فرد کو ایک کوڈ دیں۔ اور ایک پیغام جسے JavaScript کے ذریعے پڑھا جا سکتا ہے۔ یہ اوپر کی خاموش ناکامی کے پیچھے خامی کا براہ راست حل ہے۔

اور یہ ہے جس نے مجھے حیران کیا: مقامی طرف کا مالک ہونا آپ کو پلمبنگ کی غلطیوں سے محفوظ نہیں رکھتا ہے۔ ایکسپو مستثنیات کو لپیٹتا ہے۔

FunctionCallException: Calling the 'openNfcSettings' function has failed
  → Caused by: NoNfcSettingsException: iOS has no NFC setting to open. …

err.message اب کنکال خود پلمبنگ کی وضاحت کرتا ہے۔ آپ کا جملہ وسیلہ سلسلہ کے آخر میں ہے۔ یہ لائبریری کے مسئلے کی آئینہ دار تصویر ہے۔ وہاں پیغام خالی تھا، یہاں پیغام دفن ہوا، اور دونوں نے ایک ہی عکس کو توڑا۔

یہ سلسلہ ہے، ایپ میں بالکل اسی طرح پیش کیا گیا ہے جیسا کہ JavaScript کو موصول ہوا ہے۔

ایپس کے لیے ڈیولپر پینل ارغوانی ایرر بلاکس دکھا رہا ہے:

ایک لفظ سے پہلے ایک تین سطری فریم ورک ہے جسے کوئی شخص استعمال کر سکتا ہے۔ حل سوئفٹ میں نہیں ہوتا، یہ اسکرین پر ہوتا ہے۔ وجوہات کی زنجیر کو دیکھیں، سب سے پہلے گہرے پیغامات کو منظر عام پر لائیں، اور باقی کو عوام کے سامنے ان لوگوں کے لیے چھوڑ دیں جو حقیقت میں یہ چاہتے ہیں۔

ترمیم کرنے کے بعد، صرف وہی پینل ظاہر ہوتا ہے۔

وہی ناکامیاں، وہی معلومات، کچھ بھی نہیں پھینکا۔ یہ سوئفٹ میں لکھا ہوا ایک مسلسل جملہ ہے، RAW ERROR CHAIN جب آپ کو ضرورت ہو تو صرف ایک تھپتھپائیں۔

بنیادی پہلوؤں کا مالک ہونا بدل جائے گا کہ کون سی تہہ آپ کو حیران کر دے گی۔

بگ 272 ٹیسٹ پاس نہیں پکڑا گیا۔

ایپس کو تبدیل کرنے کے بعد اسکین کو منسوخ کرنے سے کچھ نہیں کے بجائے سرخ "ٹیگ نہیں پڑھا جا سکتا” کارڈ بن گیا۔

ہمارے سوئفٹ تھرو UserCancelledException. نقشہ سازی کی میز درج کی گئی ہے۔ UserCancelledException. میل نہیں کھاتا۔ کیونکہ ایکسپو کوڈ اخذ کرتا ہے۔: پیچھے آنے والے حروف کو ہٹاتا ہے۔ Exceptionتقسیم اونٹ کیس، بڑے حروف، سابقہ ERR_:

UserCancelledException  →  ERR_USER_CANCELLED

تمام ٹیسٹ پاس ہوئے کیونکہ:

const wrapped = (code, message) =>
  new Error(`Calling the 'readTag' function has failed → Caused by: ${code}: ${message}`);

موجود نہیں ہے code کیونکہ میں ایکسپو سیٹ 1 کے بارے میں نہیں جانتا تھا۔ کوڈ اور ٹیسٹوں نے ایک غلط مفروضہ کا اشتراک کیا اور ایک دوسرے سے بالکل میل کھایا۔

آپ کی ایجاد کردہ فکسچر صرف یہ ثابت کر سکتی ہے کہ آپ کا کوڈ مطابقت رکھتا ہے۔ مجھے کینسل بٹن دبانے میں کچھ وقت لگا۔

حل یہ ہے کہ ٹیبل کو سوئفٹ کلاس کے ناموں کے ساتھ منسلک رکھا جائے۔ اخذ کہ ERR_ لہذا دو بہتی فہرستوں کے بجائے، آپ کے پاس سچائی کا ایک ذریعہ ہے۔ رجعت کو اب لفظی ڈیوائس کی غلطیوں کے ساتھ جانچ کر کے ٹھیک کر دیا گیا ہے۔ code جائیداد اور سب کچھ۔

چوکی: git checkout step-4-own-module. یہ لائبریری کے ساتھ والا ماڈیول ہے۔

تبدیل کرنے سے پہلے برابری کیسے ثابت کریں۔

عقیدے پر عمل کو تبدیل نہ کریں۔ دونوں ایک ہی جسمانی ٹیگ پڑھتے ہیں اور نتائج کا موازنہ کرتے ہیں۔

یہاں وہ ڈیزائن فیصلے ہیں جنہوں نے اسے کارآمد بنایا: "مختلف” ہونا نتیجہ نہیں ہے۔ ہماری پڑھی ہوئی رپورٹیں صلاحیت اور تحریری صلاحیت کی اطلاع دیتی ہیں جو لائبریری کے پڑھنے کے راستے فراہم نہیں کرتے ہیں، اور اس کو مماثلت کے طور پر درجہ بندی کرنا گمراہ کن ہو سکتا ہے۔

صورت حال معنی
same دونوں نے اطلاع دی اور اتفاق کیا۔
differs دونوں نے اس کی اطلاع دی لیکن اختلاف کیا۔ صرف بری چیز
native-only ہم زیادہ جانتے ہیں۔ سوئچ کرنے کی وجوہات
library-only ہم نے کچھ کھو دیا ہے۔ یہ تبادلہ کو بھی روکتا ہے۔
neither نتیجہ اخذ کرنے کے لیے کچھ نہیں۔

library-only تبادلہ کے مسائل کو مسدود کرنا کوئی تضاد نہیں ہو سکتا، لیکن معلومات کا کھو جانا ایک حقیقی مسئلہ ہے۔

حقیقی NTAG213 نتائج: چار فیلڈز ایک جیسے ہیں، دو صرف ہمارے ماڈیول میں رپورٹ کیے گئے ہیں، اور کوئی تنازعہ نہیں ہے۔ یہ احساس نہیں ہے کہ نیا کوڈ صحیح لگ رہا ہے، بلکہ اس بات کا ثبوت ہے کہ سوئچ پلٹ گیا ہے۔

کنفیگریشن پلگ ان آپ کے لیے کیا کر رہا ہے؟

انحصار کو حذف کرنے کا سب سے خطرناک حصہ کوڈ نہیں تھا۔

react-native-nfc-manager ترسیل کنفیگریشن پلگ انپلگ ان iOS NFC اجازتیں تیار کر رہا تھا۔ NFCReaderUsageDescription. اگر میں پیکیج کو ان انسٹال کرتا ہوں تو دونوں غائب ہوجاتے ہیں۔ ایپ بغیر کسی غلطی کے NFC کھو دیتی ہے۔ تعمیر کرتے وقت کوئی چیز ناکام نہیں ہوتی۔ پرچہ دوبارہ کبھی ظاہر نہیں ہوگا۔

چنانچہ حکم ہے: app.jsonپہلے سے بنائیں اور یقینی بنائیں کہ آؤٹ پٹ اس طرح نظر آئے: بائٹس ایک جیسے ہیں پلگ ان کے ذریعہ تیار کردہ مواد؛ پھر پلگ ان کو ان انسٹال کریں اور دوبارہ چیک کریں۔ پھر پیکیج کو ہٹا دیں۔

انحصار کو ہٹانے کا مطلب ہے بلڈ کنفیگریشن کو وراثت میں ملنا۔ آپ جو کوڈ برآمد کرتے ہیں وہ دکھائی دینے والا نصف ہے۔

انحصار کو حذف کرنے کے بعد ثبوت کو برقرار رکھیں

یہ دعویٰ کہ لائبریری کو تبدیل کرنے کی ضرورت ہے اس پیکیج میں موجود خرابی پر مبنی ہے جو اب موجود نہیں ہے۔ اسے حذف کرنے سے ان ٹیسٹوں کو روک دیا جائے گا جو چلنے سے نقص ثابت کرتے ہیں۔ معاہدہ ٹیسٹنگ بھی ہوتی ہے، لہذا آپ کے ہاتھ سے داخل کردہ 36-انٹری لوک اپ ٹیبل کو چیک نہیں کیا جاتا ہے۔

لہذا، ذخیرہ مندرجہ ذیل طور پر ایک پن شدہ کاپی رکھتا ہے: vendor/یہ MIT لائسنس استعمال کرتا ہے، صرف ایک ٹیسٹ فائل کے ساتھ درآمد کرتا ہے، اور ESLint اور Prettier سے خارج ہے۔ کیونکہ جس طرح سے اس کی دستاویز کی گئی ہے وہ اقدار غلط ہیں اور دوبارہ فارمیٹ کرنے سے وہ تباہ ہو جاتا ہے جو آپ دکھا رہے ہیں۔

✓ every error class is constructed with an empty message
✓ turns U+1F600 into U+F600, a Private Use Area character
✓ discards the language code it just measured
✓ ignores the UTF-16 flag in the status byte

یہ ناکام ہو جائے گا اگر ان میں سے کسی کو مستقبل کے ورژن میں تبدیل کیا جاتا ہے۔ یہ کوئی پریشانی نہیں ہے، یہ دوبارہ غور کرنے کا اشارہ ہے۔

چوکی: git checkout step-5-no-dependency

ٹیگ کو ہمیشہ کے لیے کیسے لاک کریں۔

اس پورے فیلڈ میں ایک کارروائی کو کالعدم نہیں کیا جا سکتا۔ یہ وہ واحد جگہ ہے جہاں جسمانی چیزیں تباہ ہو جاتی ہیں اگر آپ کے تعامل کا ڈیزائن غلط ہو جاتا ہے، تو یہ سب سے آخر میں آتا ہے۔

NFCNDEFTag.writeLock iOS پر، Ndef.makeReadOnly() اینڈرائیڈ پر۔ دونوں چپ پر لاک بٹس کو جلا دیتے ہیں۔ ٹیگز ہمیشہ کے لیے پڑھنے کے قابل ہیں اور اسے دوبارہ کبھی نہیں لکھا جا سکتا۔ اسے آپ کی ایپ میں، کسی دوسری ایپ میں، یا آپ کے فون پر استعمال نہیں کیا جا سکتا۔ کوئی کالعدم اور کوئی فیکٹری ری سیٹ نہیں۔

ایک حقیقی تعیناتی میں، یہ مسلسل ہوتا رہے گا۔ چاہے وہ ایونٹ کا بیج ہو، پروڈکٹ کی توثیق کی مہر ہو، یا میوزیم کا لیبل، ہر وہ چیز جو آپ عوام کو دیتے ہیں مقفل ہے۔ اس کی وجہ یہ ہے کہ دوبارہ قابل استعمال ٹیگ ایک ایسا ٹیگ ہے جسے کوئی بھی دوبارہ استعمال کر سکتا ہے۔

ایک گیٹ کی خصوصیات

پہلے سے طے شدہ کال 4 لائنوں پر مشتمل ہے۔ اس سے پہلے سب کچھ دلچسپ ہوتا ہے۔

اس ایپ میں دو ٹیپس تحریر کی حفاظت کرتے ہیں، جو لکھنے کے لیے ٹھیک ہے۔ تحریر الٹ سکتی ہے، لہذا آپ آسانی سے ایک اور لکھ سکتے ہیں۔ واضح طور پر یہاں کافی نہیں ہے۔ اس لیے گیٹ اس پیٹرن کو ادھار لیتا ہے جو GitHub ذخیروں کو حذف کرنے کے لیے استعمال کرتا ہے۔ آبجیکٹ کا نام درج کریں تاکہ ہم جان سکیں کہ آپ کس چیز کو تباہ کر رہے ہیں۔

کہ status آپ کو جس چیز کی ضرورت ہے وہ خود ٹیگ کی NDEF حیثیت ہے۔ یہ وہی قدر ہے جو لکھنے کے راستے کے لیے درکار ہے۔ یا تو یہ بالکل بھی NDEF نہیں ہے، یہ پڑھنے کے لیے ہے، یا یہ پہلے سے ہی صرف پڑھنے کے لیے ہے۔

export function lockGate(tagId, status, typed): LockGate {
  if (!tagId) return { state: 'no-tag' };
  if (status === NDEF_STATUS.READ_ONLY) return { state: 'already-locked' };
  if (status === NDEF_STATUS.NOT_SUPPORTED) return { state: 'not-lockable' };

  return normaliseTagId(typed) === normaliseTagId(tagId)
    ? { state: 'armed', tagId }
    : { state: 'needs-confirmation', expected: tagId };
}

تصدیقی ڈائیلاگ رضامندی کی پیمائش کرتا ہے۔ شناخت کنندہ کی پیمائش کی قدر درج کریں۔ توجہ. ڈیزائن کرنے کے قابل واحد ناکامی موڈ کوئی نہیں ہے جو ٹیگ کو لاک آؤٹ کرنا چاہتا ہو۔ آپ ٹیگ کو لاک کرنا چاہتے ہیں، لیکن آپ غلط ٹیگ کو تھامے ہوئے ہیں۔

یہی وجہ ہے کہ اسکرین اس وقت تک آن نہیں ہوتی جب تک یہ فعال نہ ہو جائے۔ پہلے ٹیگز پڑھیںموجودہ مواد دکھاتا ہے۔ غیر ارادی چپس استعمال ہونے سے پہلے خود کا اعلان کرتے ہیں۔

یہ ایپ کی ٹیگ لاک اسکرین ہے۔ سرخ کارڈ جا رہا ہے۔

شناخت کنندہ اسکرین پر ظاہر ہوگا اور اسے دستی طور پر درج کرنا ہوگا۔ یہ بے کار لگتا ہے جب تک کہ آپ صحیح شخص، غلط چپ کی ناکامی کا تصور نہ کریں۔

براہ کرم افعال کی ترتیب کو دیکھیں۔ already-locked تصدیق شدہ پہلے تصدیق درج کرنے کے بعد، کوئی بھی یہ نہیں بتا سکے گا کہ پہلے سے مقفل ٹیگ نے اسے "لاک” کے طور پر درج کرکے کام کیا ہے۔ یہ کام نہیں کیا. کرنے کو کچھ نہیں تھا۔

"کرنے کو کچھ نہیں ہے” کا مطلب یہ نہیں ہے کہ "کچھ غلط ہے”

AlreadyLockedException جان بوجھ کر الگ LockFailedExceptionUI اسے پیش کرتا ہے۔ سبزکوئی لاک بٹن نہیں ہے۔ ٹیگ مطلوبہ حالت سے بالکل مماثل ہے۔ اسے ناکامی کے طور پر رپورٹ کرنا کسی کو بالکل اچھی چپ سے آگاہ کر دے گا۔

لاک کرنے کے بعد بھی یہ وہی اسکرین ہے۔ حالت پڑھیں

"کچھ نہیں کرنا، کچھ نہیں بدلا” کا مطلب ہے کہ اس جملے میں اصل کام کیا جا رہا ہے۔ یہ وہ حصہ ہے جو ایپ کو بتاتا ہے کہ اس نے کچھ بھی کرنے کی کوشش نہیں کی، اور یہی وہ چیز ہے جو آپ ناقابل دہرائی جانے والی کارروائیوں کے بارے میں جاننا چاہتے ہیں۔

یہ آپ کی اپنی منطق میں انحصار کی غلطی کی قسموں کا سبب نہ بننے کا وہی اصول ہے۔ دو مختلف حالات کو ایک سگنل کے طور پر نہیں آنا چاہئے، اور جس لمحے آپ انہیں الگ کرنے کی کوشش کرتے ہیں وہ لمحہ کچھ غلط ہو جاتا ہے۔

براہ کرم چیک کریں کیونکہ آپ تصدیق کرنے کی دوبارہ کوشش نہیں کر سکتے۔

دونوں نفاذ ریاست کو بعد میں پڑھتے ہیں۔ وہ چیک لکھنے کے راستے میں بھی موجود ہے، لیکن یہاں اس کا وزن مختلف ہے۔

ناکام تحریریں قابل بازیافت ہیں۔ دوبارہ لکھیں۔ وہ تالے جو کامیابی کی اطلاع دیتے ہیں لیکن فائر نہیں کرتے یقین کریں گے کہ وہ محفوظ ہیں، دنیا کو ایک ٹیگ بھیجیں، اور یہ جاننے کے لیے دوبارہ کوشش نہیں کی جا سکتی۔ دوبارہ کوشش خود ہی تباہ کن ہے۔

لہذا، غیر تسلیم شدہ تالے کو غیر تسلیم شدہ تحریروں کی طرح نرم انتباہات کے طور پر رپورٹ نہیں کیا جاتا ہے۔ کاپی میں کہا گیا ہے کہ چپ کی حالت معلوم نہیں ہے اور انحصار کرنے سے پہلے اسے پڑھ لینا چاہیے۔

سب سے مضبوط توثیق ایپس کے بجائے بعد کے ٹیگز سے آتی ہے۔ اگر میں دوبارہ لکھنے کی کوشش کرتا ہوں تو CoreNFC خود کوڈ کے بولنے سے پہلے سسٹم شیٹ میں اسے مسترد کر دیتا ہے۔

541fc3c0-a92a-45e1-8c0e-31e38c7663e2

وہ جملہ iOS پر لکھا گیا تھا، اس ایپ پر نہیں۔ یہ واحد ثبوت ہے جو واقعی اہمیت رکھتا ہے، اور یہ وہ ثبوت ہے جو کبھی بھی دو بار جمع نہیں کیا جا سکتا۔

جھنڈوں کی بجائے الگ کلاس

NfcLockSession یہ لکھنے کے سیشنز (سیٹ اپ، ڈیلیگیشن، اور ایک بار حل کرنے کے قواعد) کی ایک قابل ذکر مقدار کو نقل کرتا ہے۔ یہ جان بوجھ کر ہے۔

متبادل یہ ہے۔ lock: Bool تحریری نشست میں۔ بعض اوقات ٹیگ کو تباہ کرنے والا بولین پیرامیٹر وہ ہوتا ہے جو غلطی سے ٹھیک 3 ماہ بعد ریفیکٹر میں گزر جاتا ہے۔کسی ایسے شخص کے ذریعہ لکھا گیا جس نے کبھی فائل نہیں پڑھی۔ دو کال سائٹس، دو ارادے، کوئی مشترکہ برانچیں نہیں جو غلط جگہ پر جڑ سکیں۔

بعض اوقات "یہ تقریبا ایک ہی کوڈ ہے” کا صحیح جواب یہ ہے کہ اسے تقریباً ایک ہی کوڈ بنایا جائے۔

اور کوڈ غلط ہے، لیکن ایک ٹیسٹ ہے جو درست ہے۔

it('refuses a tag that is not NDEF at all', () => {
  expect(lockGate(TAG, NDEF_STATUS.NOT_SUPPORTED, TAG).state).toBe('armed');
});

نام کہتا ہے انکار. دلیل کہتی ہے۔ مسلح. یہ گزر گیا کیونکہ کوڈ نے بازو کیا۔ writeLock یہاں کے لئے ایک طریقہ ہے NFCNDEFTagلہذا، غیر NDEF چپس فراہم نہیں کی جانی چاہئے.

نام درست ہے اور کوڈ غلط ہے۔ میں اسے پڑھتے ہوئے پکڑا گیا۔ گزرنا اسے پکڑنے کا یہی واحد طریقہ ہے۔ وہ ٹیسٹ جو خراب کوڈ سے متفق ہوں ٹیسٹ رن میں نظر نہیں آتے۔

آپ اصل میں اسے کیسے بھیجنے جا رہے ہیں؟

مندرجہ بالا تمام مقامی طور پر بنائے گئے ہیں۔ expo run:iosXcode، CocoaPods، اور دو بار، مکمل طور پر مکمل ڈسک۔ ایک متبادل EAS Build ہے، جس کے لیے سفارش کی بجائے عملی موازنہ کی ضرورت ہے۔

ذیل میں سب کچھ لاگو کیا گیا ہے. EAS پر مبنی پروڈکشن کی تعمیر اور ہیڈ لائن کے دعووں کو فرض کرنے کے بجائے جانچنے کے لیے جان بوجھ کر دھاندلی کا تجربہ۔ میرے پاس صرف ایک ہی چیز ہے۔ ~ نہیں مکمل نتیجہ انسٹال کریں۔ .ipa. چونکہ یہ ایک App Store کی تعمیر ہے، اس کو سائیڈ لوڈ نہیں کیا جا سکتا، اور اس ہینڈ بک میں موجود تمام NFC دعوے اب بھی اصل فون پر مقامی طور پر بنائے گئے بائنریز میں ہیں۔

اقدامات EAS آپ کو بچا سکتے ہیں۔

اس منصوبے کی بدترین دوپہر مندرجہ ذیل خرابی تھی:

Provisioning Profile "iOS Team Provisioning Profile: *" does not support
the NFC Tag Reading capability.

درستگی دستی طور پر کی گئی تھی اور پیغام میں نہیں مل سکتی۔ ایپل پورٹل میں ایک واضح ایپ آئی ڈی رجسٹر کریں اور اسے چیک کریں۔ NFC ٹیگز پڑھنااور اپنا پروفائل دوبارہ بنائیں۔ براؤزر کھولنے کا مشورہ دینے میں کوئی غلطی نہیں ہے۔

EAS ان اقدامات کو خود بخود انجام دیتا ہے۔ اگر تعاون یافتہ اہلیت آپ کی اہلیت کی فائل میں ہے۔ eas build Apple Developer Console میں Match کی خصوصیت کو فعال کریں اور اگر یہ پہلے سے آن ہے تو اسے چھوڑ دیں۔ اور com.apple.developer.nfc.readersession.formatsیہ ایپ جن کلیدوں کا اعلان کرتی ہے وہ معاون فہرست میں نام کے ساتھ درج ہیں۔

لہذا پوری ہینڈ بک میں سب سے زیادہ تکلیف دہ دستی مرحلہ کسی ایسی چیز کے ذریعہ خودکار تھا جسے میں نے استعمال نہیں کیا تھا۔

یقین کرنے کے بجائے ثابت کیسے کیا جائے۔

چل رہا ہے eas build میں آپ کو TapCard کے اصل بنڈل شناخت کنندہ کے بارے میں یہ نہیں دکھا سکتا، اور کام کرنے والے اسکرین شاٹ پر بھروسہ کرنے سے پہلے یہ سمجھنا بہتر ہے کہ کیوں۔

✔ Bundle identifier registered com.nfccard.tap
✔ Synced capabilities: No updates

No updatesاس کی وجہ یہ ہے کہ اس ایپ ID کے لیے NFC ٹیگ ریڈنگ پہلے سے ہی فعال ہے۔ ہم نے اسے اس سیکشن کے باب میں اپنے براؤزر میں دستی طور پر فعال کیا ہے۔ یہ سب ثابت کرتا ہے کہ EAS اس سے متفق ہے جو میں نے پہلے ہی کیا ہے۔ "EAS یہ آپ کے لیے کرتا ہے” کا دعویٰ اس آؤٹ پٹ پر منحصر ہے۔

حقیقی ٹیسٹوں کے لیے ایسے بنڈل شناخت کنندگان کی ضرورت ہوتی ہے جو کبھی موجود نہیں تھے۔ تو: یک طرفہ منصوبہ؛ com.nfccard.tap.eastestجو کہ بنیادی طور پر صرف اسناد پر مشتمل ہے، بنڈل ID کا ایک عارضی نام ہے، لیکن جان بوجھ کر اصل ایپ سے الگ رکھا گیا ہے اور ذخیرہ شدہ اسناد کو الجھانے کا خطرہ ہے۔

✔ Bundle identifier registered com.nfccard.tap.eastest
✔ Synced capabilities: Enabled: NFC Tag Reading

یہ مشاہدہ شدہ دعویٰ ہے۔ ایک ایپ ID جو براؤزر یا پورٹل کے بغیر موجود نہیں ہے، لیکن رجسٹرڈ ہے اور اسے صرف ایک حقدار فائل میں NFC فعالیت فراہم کی گئی ہے۔ اور چونکہ مطابقت پذیری اسناد کے مرحلے میں چلتی ہے، اس لیے وہ کمانڈ ہو گی۔ eas credentials:configure-buildاور اس نے کوئی تعمیر استعمال نہیں کی۔

ایک عملی نوٹ اگر آپ اسے دہراتے ہیں: واقعی پہلے اسے بنائیں۔ ڈسٹری بیوشن سرٹیفکیٹس پورے اکاؤنٹ میں ہوتے ہیں اور ایپل آپ کے پاس موجود سرٹیفکیٹس کی تعداد کو محدود کرتا ہے، لہذا اگر آپ انہیں پہلے منسوخ کرتے ہیں، تو وہ اس ایپ میں بیک ہو جائیں گے جسے آپ حذف کرنا چاہتے ہیں۔ ایک بار جب یہ ترتیب مکمل ہو گئی، سکریچ ایپ نے اصل سرٹیفکیٹ کو دوبارہ استعمال کرنے کا مشورہ دیا اور فی بنڈل ID کے لیے صرف اپنا پروویژننگ پروفائل بنایا۔

CLI اصل میں کیا کرتا ہے

نقشہ سازی جادو نہیں ہے اور یہ دفن نہیں ہے. یہ ایک تلاش کی میز ہے اور اس میں این ایف سی کے اندراجات ہیں (eas-cli/build/credentials/ios/appstore/capabilityList.js):

{
  name: 'NFC Tag Reading',
  entitlement: 'com.apple.developer.nfc.readersession.formats',
  capability: CapabilityType.NFC_TAG_READING,
  // Technically it seems only `TAG` is allowed, but many apps and packages tell users to add `NDEF` as well.
  validateOptions: createValidateStringArrayOptions(['NDEF', 'TAG']),
  getSyncOperation: getDefinedValueSyncOperation,
}

براہ کرم وہ تبصرہ دوبارہ پڑھیں۔ کیونکہ یہ آپ کے بارے میں خاموشی سے ہے۔ NDEF یہ اصل قیمت نہیں ہوسکتی ہے۔ تمام سبق آپ کو لکھنے کی ہدایت کرتے ہیں۔ ["NDEF", "TAG"]اس ہینڈ بک میں app.json لکھنا ["NDEF", "TAG"]مجھے یقینی طور پر شبہ ہے کہ جو بھی میپنگ ٹیبل کو برقرار رکھتا ہے۔ TAG اس کا مطلب کچھ بھی ہے، لیکن یہ دونوں کی اجازت دیتا ہے۔ کیونکہ جوڑی کو مسترد کرنا سب کو برباد کر سکتا ہے۔ یہاں اصول ہے جب کوئی چشمی کی جانچ نہیں کرتا ہے:

getDefinedValueSyncOperation یہ دوسرا نصف ہے۔ ایکشن کیز کو آف کر دیا جاتا ہے قطع نظر اس کے کہ وہ اہل ہیں یا نہیں۔ تعریفاس لیے ہم وقت سازی دونوں سمتوں میں کام کرتی ہے، بجائے اس کے کہ صرف آئٹمز شامل کریں۔

اور ایک عملی تفصیل جو دستاویزات آپ کو نہیں بتاتی ہیں وہ یہ ہے کہ ہم آہنگی ہے۔ اسناد یہ ایک غیر تعمیراتی قدم ہے۔

SetUpTargetBuildCredentials.runAsync()
  └─ ensureBundleIdExistsAsync({ entitlements, … })
       └─ syncCapabilitiesAsync()
            → "Synced capabilities: Enabled: NFC Tag Reading"    (or "No updates")

تو eas credentials:configure-build --platform ios اپنی ایپ آئی ڈی اور مطابقت پذیری کی خصوصیات کو رجسٹر کریں۔ تعمیرات استعمال کیے بغیر. اگر آپ چاہتے ہیں کہ ایپل کا سیٹ اپ ٹھیک ہو جائے، تو آپ کو اسے حاصل کرنے کے لیے تعمیر کے لیے ادائیگی کرنے کی ضرورت نہیں ہے۔

اس کے ساتھ آنے والے نقصانات

ہم آہنگی دونوں سمتوں میں چلتی ہے۔ اگر آپ کی ایپ میں فیچر دور سے فعال ہے، لیکن پہلے سے طے شدہ اجازت فائل میں نہیں ہے، تو چلائیں: eas build خود بخود معذور کہ

پورٹل سے براہ راست ٹیم کا انتظام فیچرز اور وہ عمارتیں جو EAS استعمال کرتی ہیں EAS کو بند ہوتے دیکھیں گی۔ اہلیت کی فائل سچائی کا ذریعہ بن جاتی ہے، چاہے ارادہ ہو یا نہ ہو۔

EXPO_NO_CAPABILITY_SYNC=1 انتباہ یہ ہے کہ آپٹ آؤٹ کرنے سے ریموٹ تبدیلیاں مطابقت پذیری کو روک دیں گی، جس سے بعد میں پروویژننگ پروفائل میں تضادات پیدا ہوں گے۔ خصوصیت کے لیے ایک مالک کا انتخاب کریں اور اس مالک کو اس کا مالک بنائیں۔

کیا EAS نے مدد نہیں کی۔

"ای اے ایس کا استعمال” اس پروجیکٹ میں زیادہ تر درد کا جواب نہیں ہے، اور دوسری صورت میں دکھاوا کرنا کچھ بیچنا ہے۔

مسئلہ کیا EAS مدد کرے گا؟
ایپ ID کی NFC ٹیگ پڑھنے کی خصوصیت آٹومیشن
مکمل ڈسک، دو بار عمارتیں کہیں اور ہوتی ہیں۔
گریڈل ڈیمون جو تعمیر کے بعد میموری رکھتا ہے۔ مقامی طور پر کچھ نہیں چلتا
pod install Swift فائلیں شامل کرنے کے بعد درکار ہے۔ تمام تعمیرات صاف ہیں۔
CoreNFC سیشن ڈیلوکیٹ ہو گیا۔ کوڈ کیڑے
دو ملاقاتیں کریں کوڈ کیڑے
FeliCa پولنگ کی اہلیت یہ کوئی خصوصیت نہیں ہے اور اس کا انتظام بنیادی EAS کے ذریعے نہیں کیا جاتا ہے۔
String.fromCharCode ایموجی کو تراشیں۔ انحصار کے کیڑے
ایکسپو مشتق ERR_USER_CANCELLED غلط مفروضے۔
ٹیگز پڑھیں چپ کو تبدیل کرنے کے لیے کوئی بادل نہیں ہے۔

EAS میکانی مسائل کو ختم کرتا ہے، NFC کے مسائل کو نہیں۔ حقیقت میں، NFC پر اس ہینڈ بک میں تمام دریافتیں یکساں طور پر ہوئی ہوں گی۔

تجارت

مقامی تعمیرات میں ڈسک، میموری اور سیٹ اپ کی ضرورت ہوتی ہے۔ پروجیکٹ نے ہماری 460GB ڈسک کو دو بار بھرا، میموری ختم ہونے کی وجہ سے بیک گراؤنڈ کے تین عمل کو ختم کر دیا، اور پرانے گریڈل ڈیمون کی دوبارہ تعمیر سے محروم ہو گیا۔

EAS قطار کے اوقات اور کلاؤڈ پروجیکٹ کی فیس اور ایکسپو سرورز پر دستخط کرنے والے اسناد کی ادائیگی کرتا ہے۔ جس چیز کو آپ چھوٹا نہیں کر سکتے وہ لوپ ہے جو کہ یہاں واقعی اہم ہے۔ آپ کو ابھی بھی فون پر چلنا ہے اور فون پر چپ کو سوائپ کرنا ہے۔ کلاؤڈ بلڈ کا سبز ہونا آپ کو اس بارے میں کچھ نہیں بتاتا کہ آیا ٹیگ پڑھا گیا ہے یا نہیں۔

کام کرنے والے مقامی ٹول چین کے ساتھ اسٹینڈ اسٹون پروجیکٹس کے لیے، تکرار کی رفتار میں مقامی جیت۔ کسی بھی شخص کے لیے جس نے ابھی ٹیم، CI پائپ لائن، یا ڈسک کو 100% مڈ-بلڈ حاصل کیا ہے، صرف فیچر سنکرونائزیشن ایک مضبوط دلیل ہے۔

اینڈرائیڈ سائیڈ پِیک

اینڈرائیڈ اپنی ہینڈ بک کا مستحق ہے، اور اب اس کے پاس ایک ہے۔ یہ سیکشن ان لوگوں کے لیے پیش نظارہ ہے جو انتظار نہیں کرنا چاہتے۔ یہ اوپر کوٹلن کے سوئفٹ ہم منصب اور دونوں پلیٹ فارمز پر NFC کے درمیان ایک آرکیٹیکچرل فرق ہے جو ایک ہی کام کو دو بار انجام دینے کے بجائے اسے بالکل مختلف کام بنا دیتا ہے۔

براہ کرم اسے ڈیزائن کے پیش نظارہ کے طور پر پڑھیں، نہ کہ تصدیق شدہ نفاذ کے۔ کوٹلن ایک دستاویزی API کے خلاف مرتب کرتا ہے اور سوئفٹ کو آئینہ دیتا ہے۔ ہے اس کی تصدیق ہارڈ ویئر پر کی گئی ہے، اس لیے شکل فٹ بیٹھتی ہے، ڈیوائس ہاتھ میں ہے اور سارا علاج اس ہینڈ بک کی پیروی کرتا ہے۔

اہم فرق ڈیوائس کے بجائے API کی سطح پر نظر آتے ہیں، اور وہ اختلافات ہیں جو اس بات کا تعین کرتے ہیں کہ آپ کے کوڈ کی ساخت کس طرح ہے۔

اینڈرائیڈ پر کوئی سیشن نہیں ہے۔

iOS صارف کو ایک سیشن پاس کرتا ہے، اور سیشن ایک ماڈل ہے۔ جب صارف سیشن شروع کرتا ہے، OS ایک شیٹ کھینچتا ہے، صارف کو ٹیگ دیتا ہے، اور خود کو باطل کر دیتا ہے۔ اینڈرائیڈ آپ کے لیے ہے۔ لیڈر موڈ: پیش منظر کی سرگرمی سے منسلک کال بیک جو ٹیگ کے قریب آنے پر چلتا ہے۔

adapter.enableReaderMode(activity, ::onTagDiscovered, flags, Bundle())

آپ کے iOS سیشن نے آپ کے لیے جو کچھ بھی کیا وہ آپ کا بن جاتا ہے۔

iOS اینڈروئیڈ
اسکین UI OS شیٹ کھینچتا ہے۔ ایپ ہر چیز کو کھینچتی ہے۔
سیشن ختم 1 ٹیگ کے بعد خود بخود disableReaderMode تمام خارجی راستوں پر
تقاضے سکرین پر کچھ بھی نظر نہیں آتا پیش منظر کی سرگرمیسیاق و سباق نہیں۔
کال بیک تھریڈ بنیادی بائنڈر دھاگے
منسوخ کرنا سسٹم شیٹ میں فراہم کی گئی ہے۔ اسے خود بنائیں

آخری لائن جاوا اسکرپٹ سے لنک کرتی ہے۔ کراس پلیٹ فارم cancelScan() یہ اینڈرائیڈ پر اصل عمل درآمد ہے۔ دستاویزی iOS کی غیرفعالیتسسٹم شیٹ کینسل کی ملکیت ہے، اور Swift ماڈیول جان بوجھ کر اس خصوصیت کو بالکل بھی نافذ نہیں کرتا ہے۔

export async function cancelScanNative(): Promise {
  if (Platform.OS !== 'android') return;
  await NfcNative.cancelScan();
}

نیز: پاس FLAG_READER_NO_PLATFORM_SOUNDSیا، OS ایپس کے لیے اپنی دریافت کی آواز چلاتا ہے جو پہلے ہی صارف کو بتاتی ہے کہ کیا کرنا ہے۔

کوٹلن اور ایک ڈیزائن نوٹ

private fun onTagDiscovered(tag: Tag) {
  val ndef = Ndef.get(tag) ?: run {
    stopReaderMode(); rejectOnce(NotNdefException()); return
  }

  try {
    ndef.connect()

    val status = NfcTagInfo.status(ndef)
    val capacity = ndef.maxSize

    messageToWrite?.let { message ->
      // Ask before acting, same order as the Swift: refusing leaves the tag
      // untouched, failing partway through a write may not.
      if (!ndef.isWritable) { … }
      if (message.toByteArray().size > capacity) { … }
      ndef.writeNdefMessage(message)
    }

    // Read back in the same connection. For a write this is verification,
    // for a read it is simply the result.
    val onTag = ndef.ndefMessage
    …
  } finally {
    runCatching { ndef.close() }
  }
}

اینڈرائیڈ کا iOS کے برابر نہیں ہے۔ NFCNDEFStatusتو حیثیت ہے۔ ماخوذ رپورٹ کرنے کے بجائے۔

fun status(ndef: Ndef?): Int =
  when {
    ndef == null -> 1     // not NDEF: signalled by Ndef.get() returning null
    ndef.isWritable -> 2  // read-write
    else -> 3             // read-only
  }

iOS اس سوال کا براہ راست جواب دیتا ہے۔ اینڈرائیڈ "NDEF نہیں” سگنل بھیجتا ہے۔ Ndef.get() null واپس کرتا ہے اور ظاہر کرتا ہے۔ isWritable متعلقہ ٹیگ میں نمبروں کے دو سے ایک سیٹ کو میپ کرنے سے، TypeScript کو یہ جاننے کی ضرورت نہیں ہے کہ آپ کس پلیٹ فارم سے بات کر رہے ہیں۔ یہ بیس ماڈیول کا پورا کام ہے۔

اگر آپ اسے پورٹ کرتے ہیں تو اہم اختلافات ہیں۔

iOS اینڈروئیڈ
اجازت ماڈل ایپ آئی ڈی + فیچر + ادا شدہ اکاؤنٹ 1 مینی فیسٹ لائن، مفت
اگر غلط طریقے سے ترتیب دیا گیا ہے تو ناکام ہوجاتا ہے۔ کوڈ پر دستخط کرنے میں غلطی جہاں یہ "NFC” نہیں کہتا ہے آپ کو اجازت نہیں ہے۔
کوالیفکیشن گرانورٹی پولنگ آپشن کے ذریعے ایک اتھارٹی سب کا احاطہ کرتی ہے۔
اسکین UI سسٹم شیٹ جس کا انداز تبدیل نہیں کیا جا سکتا موجود نہیں ہے. آپ سب کچھ کھینچتے ہیں۔
پڑھنے کی صلاحیت (رابطے کی حیثیت) getMaxSize()
پڑھنا لکھنا (رابطے کی حیثیت) isWritable
اینٹینا سب سے اوپر کنارے مرکز واپس
کارڈ ایمولیشن ناممکن HostApduServiceکھلا
مستقل تالا writeLockناقابل واپسی makeReadOnly()ناقابل واپسی

اس میز سے دو نمونے نکلتے ہیں۔

iOS درد کو فرنٹ لوڈ کرتا ہے اور اینڈرائیڈ اسے بیک لوڈ کرتا ہے۔ بائٹس کو پڑھنے سے پہلے پورٹل، اجازت اور دستخط کرنا اور ریڈر موڈ، ایکٹیویٹی لائف سائیکل اور خود ساختہ عمل درآمد کے بعد منسوخ کر دیا جاتا ہے۔

اور صلاحیت کا فرق جتنا لگتا ہے اس سے کم ہے۔ iOS آپ کو کم نہیں بتاتا۔ اینڈرائیڈ اسے عام پڑھنے میں رضاکارانہ طور پر پیش کرتا ہے، جبکہ iOS آپ کو سیشن کے اندر مخصوص سوالات پوچھنے دیتا ہے۔ ایک ہی ڈیٹا، مختلف داخلہ فیس۔ جیسا کہ آپ دیکھ سکتے ہیں کہ میں تین دستاویزات کے بارے میں غلط تھا۔

ڈیمو ذخیرہ

مندرجہ بالا سب ایک پروجیکٹ ہے، ٹیب کارڈیہ ایک ہی ایپ ہے، اسنیپٹ ڈمپ نہیں۔

فرش کہاں وہاں کیا ہے؟
ایپ app/(tabs)/ پڑھنا، لکھنا، فوکس کرنا، پروفائل اسکرین اور ٹیگ معلومات کا راستہ
خالص منطق lib/ این ڈی ای ایف ڈیکوڈر اور انکوڈر، وی کارڈ، صلاحیت، ایرر میپنگ، فوکس رولز۔ ~2,240 لائنیں، کوئی رد عمل مقامی درآمدات نہیں۔
مقامی ماڈیول modules/nfc-native/ سوئفٹ میں ~1,010 لائنیں اور کوٹلن میں ~475 لائنیں: سیشن، ٹائپ شدہ استثناء، ٹیگ کی تبدیلی
صورت حال store/ State + AsyncStorage: پروفائل، آخری ٹیگ، فوکس ریکارڈ
ثبوت vendor/ ہٹائے گئے انحصار کو ایسے ٹیسٹوں کے ساتھ منجمد کریں جو ہٹانے کا جواز پیش کریں۔
میمو DEVLOG.md، GOTCHAS.md، PLATFORM-NOTES.md تمام احکامات اور غلطیاں برقرار ہیں، 75 ٹریپس، عملدرآمد کا موازنہ

293 ٹیسٹ، 15 خاندان، تقریباً 1 سیکنڈ، کوئی ہارڈ ویئر نہیں۔ یہ ضابطہ کشائی کو خالص رکھنے کی قیمت ہے۔

اور ٹیگ شدہ چوکیاں آپ کو ہر قدم پر اپنی ایپ کو پڑھنے کی اجازت دیتی ہیں، نہ صرف آخر میں۔

git checkout step-0-scaffold        # boots, no NFC
git checkout step-1-first-read      # entitlements + raw dump
git checkout step-2-decode          # own decoder, Tag Info
git checkout step-3-write           # vCard, capacity checks
git checkout step-4-own-module      # native module alongside the library
git checkout step-5-no-dependency   # library removed
git checkout step-6-android         # Kotlin reader mode

اسے کلون کریں، اسٹیکر پیک خریدیں، اور اسے چیک کریں۔ step-1-first-readپھر چپ کو اپنے فون پر رکھیں۔ وہ لوپ ہر چیز کو ٹھوس بنانے کا تیز ترین طریقہ ہے۔

شروع کرنے سے پہلے آپ کو کیا جاننے کی ضرورت ہے۔

براہ کرم پہلے ٹیگز خریدیں۔ کوئی سمیلیٹر نہیں ہے۔ جب میری چپ پوسٹ سے غائب ہو گئی تو پروجیکٹ دو ہفتوں کے لیے رکا ہوا تھا اور اس کو بدلنے کے لیے کوئی ہوشیار فن تعمیر نہیں تھا، چاہے وہ کتنے ہی کیوں نہ ہوں۔

کسی بھی انحصار پر بھروسہ کرنے سے پہلے اسے پڑھیں۔ 20 منٹ کے لئے ndef-lib ہم نے حقیقی دنیا کے تین نقائص دریافت کیے اور ایپ کے فن تعمیر میں تبدیلیاں کیں۔ ان میں سے کوئی بھی ایشو ٹریکر پر نہیں تھا جہاں میں نے سوچا کہ میں تلاش کروں گا۔

فرض کریں کہ ناکامی خاموش ہو جائے گی۔ میں نے جو 75 ٹریپس ریکارڈ کیے ان میں سے تقریباً 12 تیار کیے گئے۔ کوئی غلطی نہیں: ڈی ایلوکیٹڈ سیشنز، ہٹائے گئے کنفیگریشن پلگ انز، غیر محفوظ شدہ سیمیکولنز، تراشے ہوئے ایموٹیکنز، خالی ایرر میسیجز، اور gitigned مقامی ماڈیولز۔ NFC آپریشن میں "کچھ نہیں ہوا” سب سے عام علامت ہے، لہذا واپسی کی قیمت پر بھروسہ کرنے کے بجائے، اس کے مطابق آلہ بنائیں اور حقیقی سطح پر چیک کریں۔

پلیٹ فارم کے فرق کو اقسام میں رکھیں، تبصروں میں نہیں۔ ہم ایک فرسٹ کلاس ریاست کے طور پر "یہ پلیٹ فارم ہمیں نہیں بتاتا” کا ماڈل بناتے ہیں۔

type Fact = {
  label: string;
  value: string | null; // null = the platform did not report it
  unavailable?: string; // why, in plain language
};

ایک UI جو غائب اور صفر دونوں اقدار کے لیے ڈیش پیش کرتا ہے آپ کو کچھ نہیں سکھاتا ہے۔

اور اپنے نتائج کو ان کے نیچے مشاہدات کی وشوسنییتا کا وارث نہ ہونے دیں۔ یہ سب سے مہنگا تھا اور یہ NFC کے بارے میں بالکل بھی نہیں تھا۔

نتیجہ

اب آپ iOS پر مکمل تصویر دیکھ سکتے ہیں۔ انٹائٹلمنٹ میزز، ہاتھ سے لکھے ہوئے ڈیکوڈرز ہیں کیونکہ مقبول ڈیٹا ضائع ہو جاتا ہے، ایسے راستے لکھیں جو کام کرنے سے پہلے ٹیگز کی درخواست کرتے ہیں، جغرافیہ کے ذریعے مجبور فوکس ٹائمر، سوئفٹ میں مقامی ماڈیولز، محفوظ شدہ ثبوتوں کے ساتھ حذف شدہ انحصار، گیٹ کے پیچھے ہمیشہ کے لیے بند ٹیگز جو آپ کو نام درج کرنے پر مجبور کرتے ہیں، اور بہت کچھ۔

اگلا، تین چیزیں دیکھنے کے قابل ہیں۔

  1. پس منظر کا ٹیگ پڑھیں: ایپ بند ہونے کے ساتھ، ٹیگ کو تھپتھپائیں۔ iOS صرف مخصوص ریکارڈ کی اقسام کے لیے اطلاعات دکھاتا ہے جسے صارف کو ٹیپ کرنا چاہیے۔ یہ وہ خصوصیت ہے جو NFC کو بہت جادوئی محسوس کرتی ہے، اور ریکارڈ کرنے کے لیے صحیح اصولوں کا ہونا اپنے آپ میں قیمتی ہے۔

  2. کرپٹو ٹیگ: NTAG424 DNA ہر نل کے ساتھ ایک کاؤنٹر پر دستخط کرتا ہے۔ اگر آپ چاہتے ہیں کہ آپ کے ٹیگز لیبل کے بجائے اسناد بنیں تو یہاں سے شروع کریں۔

  3. اور اینڈرائیڈیہ اگلی ہینڈ بک ہے۔ مندرجہ بالا پیش نظارہ ایک نقشہ ہے، اصل ہارڈ ویئر پر مکمل واک تھرو اس پیش نظارہ کی پیروی کرے گا۔

دلچسپ حصہ کبھی نہیں ہے requestTechnology. یہ وہ سب کچھ تھا جب دونوں پلیٹ فارمز نے آپ کو یہ بتانے سے انکار کر دیا کہ آپ کب غلط تھے۔

ذرائع اور اضافی وسائل

Apple، CoreNFC، اور اہلیت:

android:

فارم:

ایکسپو اور مقامی ردعمل:

NFC پہنچا دیا گیا ہے لہذا آپ اسے چیک کر سکتے ہیں، اقتباس، "جہاں آپ اسے پہلے ہی دیکھ چکے ہیں۔”

فوکس فنکشنز کے لیے پیشگی آرٹ:

اس پروجیکٹ کی جگہ لائبریریاں:

  • react-native-nfc-manager: ایم آئی ٹی یہاں بیان کردہ خامی ماخذ کو پڑھ کر 3.17.2 میں دریافت ہوئی، جس کی ایک منجمد کاپی ڈیمو ریپوزٹری میں موجود ہے۔ vendor/ اسے ٹھیک کرنے کے لیے ٹیسٹنگ کے ذریعے۔
Scroll to Top