من المقبول عمومًا أن Wallet ليست الخدمة الأكثر شيوعًا في رابطة الدول المستقلة. ولكن بالفعل في المشروع الثاني على التوالي ، يعين العميل المهمة "جعل التكامل مع Wallet". لذلك ، قررت كتابة هذه المقالة للتحدث عن الخدمة ككل وإظهار كيفية دمج المنتج الخاص بي فيها.
ما هي المحفظة؟ يسمح لك بالاحتفاظ بأنواع مختلفة من البطاقات في هاتفك (التذاكر ، بطاقات الخصم ، إلخ) ، مما يجعل الحياة أسهل لمستخدمي المنتج. علاوة على ذلك ، من الممكن تحديث المعلومات حول الخريطة من خلال الإشعارات الفورية ، ولكن هذا موضوع لمقال منفصل. ولكن إذا كان لديك بطاقة / تذكرة / اشتراك يمكن دمجه في الهاتف ، فهناك حل! كيف نفعل ذلك - اقرأ أدناه.
كقاعدة عامة ، يكون خادمك مسؤولاً عن إنشاء الخريطة. يستقبل التطبيق البطاقة على شكل ملف .pkpass ويمكن للمستخدم من خلال التطبيق إضافة البطاقة إلى Wallet.
هيكل الخريطة
ما هي الخريطة من وجهة نظر المطور؟ الخريطة عبارة عن أرشيف بامتداد .pkpass. يحتوي على جميع البيانات اللازمة لعرض البطاقة وتشغيلها. محتويات الأرشيف في الجدول أدناه.
ملف | التعيين |
---|
background.png | صورة خلفية للبطاقة. |
footer.png | صورة بجانب الباركود |
icon.png | أيقونة الإخطارات والرسائل |
logo.png | شعار البطاقة. عرض أعلى اليسار |
البيان. json | تسجيل جميع الملفات المضمنة |
التوقيع | توقيع PKCS7 |
تمرير. json | المظهر ومعلومات الخريطة |
strip.png | الصورة الموجودة خلف الوصف الرئيسي للبطاقة |
thumbnail.png | صورة إضافية (حدد) |
تتوفر الأنواع التالية من البطاقات:
- تذكرة صعود الطائرة: بالطائرة أو بالقطار. عادة القسيمة تعمل لرحلة واحدة.
- الكوبون: للقسائم والعروض الخاصة.
- تذكرة الحدث: يمكن أن تعمل لحدث واحد ولموسم كامل ؛
- بطاقة الخصم: بطاقات الولاء أو بطاقات الخصم أو الهدايا ؛
- بطاقة العرض العامة: إذا لم ينطبق أي مما سبق على حالتك: على سبيل المثال ، بطاقة للسفر عن طريق مترو الأنفاق أو بطاقة دخول إلى صالة الألعاب الرياضية.
النظر بشكل تخطيطي في مظهر البطاقات المختلفة. من الأفضل تسمية الصور كما هو موضح في الجدول أعلاه.
بطاقة صعود الطائرة

قسيمة

تذكرة الحدث

بطاقة المجتمع

بطاقة خصم

هيكل Pass.json
الحقول المطلوبة. يحتوي على معرف نوع المرور ومعرف الفريق واسم المؤسسة وما إلى ذلك.
مفاتيح للتطبيقات ذات الصلة. مطلوب لعرض التطبيقات التي يجب أن تكون "مرتبطة" بالخريطة.
بطاقات مفاتيح "تاريخ انتهاء الصلاحية".
مفاتيح الصلة. على سبيل المثال ، إحداثيات المنطقة التي يمكن استخدام الخريطة فيها ، أو بداية الحدث المقصود.
المفتاح هو الأسلوب. في بداية المقال ، تم إدراج 5 أنواع من البطاقات للمحفظة. لكل منهم أسلوبه الخاص. يجب أن يكون مثل هذا المفتاح بصرامة.
مفاتيح التصميم المرئي للبطاقة. بالإضافة إلى ما هو واضح ، فهي تحتوي على معلومات حول الرمز الشريطي المعروض على الخريطة.
مفاتيح خدمة الويب. يمكنك استخدام خدمات الويب للتفاعل مع الخريطة ، على سبيل المثال ، تحديثها تلقائيًا.
مفاتيح NFC. تحتوي على معلومات إضافية لمعاملات Apple Pay.
الآن عن كل شيء بمزيد من التفصيل.
الحقول المطلوبة
أدخل JSON | نوع البيانات | الوصف |
---|
الوصف | سلسلة مترجمة | وصف موجز للخريطة. مترجمة. |
formatVersion | Int | إصدار تنسيق الملف. يجب أن تكون القيمة 1. |
اسم المنظمة | سلسلة مترجمة | اسم المنظمة التي تصدر البطاقات. |
passTypeIdentifier | سلسلة | معرف نوع المرور وحساب المطور. |
الرقم التسلسلي | سلسلة | الرقم التسلسلي للبطاقة الفردية |
teamIdentifier | سلسلة | معرف فريق فريق التطوير |
مفاتيح للتطبيقات ذات الصلة
أدخل JSON | نوع البيانات | الوصف |
---|
معرفات المتجر | [Int] | اختياريا. معرّف التطبيقات المرتبطة بالبطاقة. دائمًا ما يتم أخذ أول جهاز متوافق مع الجهاز الحالي. |
appLaunchURL | سلسلة | URL الذي يتم تمريره إلى التطبيق عند الفتح |
مفاتيح الاسلوب
أدخل JSON | نوع البيانات | الوصف |
---|
الحقول الأولية | [JSON] | معلومات أساسية عن الخريطة. |
المجالات الثانوية | [JSON] | معلومات الخلفية. |
الحقول المساعدة | [JSON] | الحقول للحصول على معلومات إضافية. اختياري |
headerFields | [JSON] | عنوان الخريطة. يتم عرضها حتى عندما تكون البطاقات مرئية في القائمة. |
الحقول المساعدة | [JSON] | معلومات أساسية عن الخريطة. |
نوع العبور | سلسلة | نوع النقل لبطاقات التذاكر. يمكن أن تأخذ القيم التالية: PKTransitTypeAir ، PKTransitType قارب ، PKTransitTypeBu` ، PKTransitType عام ، `PKTransitTypeTrain`. |
الحقول الخلفية | [JSON] | مجموعة من الحقول المسؤولة عن الجانب الخلفي للخريطة |
يحتوي JSON في هذه الحالة على النموذج التالي:
"key" : "value1", "label" : "value2", "value" : "value3"
يمكن أن تكون القيمة بمفتاح القيمة إما رقمية أو سلسلة. ومع ذلك ، لا يمكن استخدام CurrencyCode مع قيمة السلسلة. بالنسبة للحقول المساعدة والحقول الثانوية ، يمكن أن يكون هناك العديد منها ، ويجب عليك مراقبة طول الصفوف المستخدمة فيها.
مفاتيح التصميم المرئي
أدخل JSON | نوع البيانات | الوصف |
---|
الباركود | [JSON] | معلومات الباركود (انظر أدناه). |
خلفيةاللون | اللون كسلسلة | لون الخلفية. (# Fa32e4) |
اللون الأمامي | اللون كسلسلة | لون التصنيف مع القيم |
groupingIdentifier | سلسلة | اختياري لتذاكر الأحداث وتذاكر النقل. سيتم تجميع البطاقات ذات النمط نفسه - passTypeIdentifier و groupingIdentifier - |
تسميةاللون | اللون كسلسلة | نص التسمية مع أسماء الحقول |
logoText | سلسلة قابلة للترجمة | النص المعروض بجانب الشعار |
الباركود
أهم جزء من الخريطة. يتم خياطة رقم تعريف البطاقة فيه (على سبيل المثال ، رقم بطاقة فعلية أو رقم تذكرة). من المهم أن يتمكن الماسح الضوئي أو أي أداة أخرى من قراءة الرموز في الترميز الصحيح.
أدخل JSON | نوع البيانات | الوصف |
---|
نص بديل | سلسلة | يتم عرض نص اختياري بجوار الرمز الشريطي إذا لم تتم قراءة الرمز الشريطي. |
الشكل | سلسلة | تنسيق الباركود. قد يأخذ القيم: PKBarcodeFormatQR ، PKBarcodeFormatPDF417 ، PKBarcodeFormatAztec ، PKBarcodeFormatCode128 |
الرسالة | سلسلة | كود أو رقم البطاقة مشفر في الباركود. |
ترميز الرسالة | سلسلة | ترميز الرسائل. عادة ISO-8859-1 |
الموقع
هذه المفاتيح مسؤولة عن الموقع الذي يمكن فيه استخدام البطاقة.
أدخل JSON | نوع البيانات | الوصف |
---|
الإعتدال | سلسلة | يتم عرض نص اختياري بجوار الرمز الشريطي إذا لم تتم قراءة الرمز الشريطي. |
خط العرض | خط الطول | خط العرض |
خط الطول | مزدوج | خط العرض |
النص ذو الصلة | سلسلة | نص اختياري يظهر على شاشة القفل في الوقت الذي يدخل فيه المستخدم إلى نطاق البطاقة. |
الجانب الخلفي
يمكن وضع معلومات إضافية في جزء المعلومات العكسي: شروط الاستخدام وسياسة التحديث التلقائي وتفاصيل الاتصال ورابط إلى التطبيق الذي تنتمي إليه البطاقة. يوضح الشكل مراسلات الحقول في pass.json وظهور الجانب العكسي للخريطة. إذا كانت هناك روابط وأرقام هواتف وما إلى ذلك في حقل القيمة ، فسيتم تمييزها تلقائيًا.

إنشاء خريطة. الجزء 2
لذا ، فإن الصور جاهزة ، يتم تشكيل pass.json ، يبقى أن نجمعها معًا. للقيام بذلك ، املأ manifest.json (انظر الجدول 1) ، حيث تحتاج إلى تضمين جميع الصور و pass.json. اتضح شيء مثل هذا:
. . . . . . "pass.json" = 303c753abc39aa732ec74643d6db28348fe8a823; "strip.png" = 736d01f84cb73d06e8a9932e43076d68f19461ff; "strip@2x.png" = 468fa7bc93e6b55342b56fda09bdce7c829d7d46; . . . . . .
من الآن فصاعدًا ، لا يلزم تغيير أي شيء ، لأن SHA سيكون غير صحيح ؛ في حالة حدوث تغييرات ، من الضروري إعادة إنشاء SHA.
بعد ذلك ، تحتاج إلى إنشاء معرف نوع المرور في مكتب المطور وتقديم شهادة له. يجب أن يكون الإجراء مألوفًا إلى حد ما إذا كنت قد أنشأت مسبقًا ، على سبيل المثال ، ملفات تعريف التوفير.

بعد ذلك ، انتقل إلى Keychain وقم بالتصدير من هناك شهادة علاقة مطور Apple العالمية (WWDR) كـ .pem.

من هناك ، نقوم بتصدير معرف نوع المرور الذي تم إنشاؤه كـ p12. عند هذه النقطة ، سيطلب منك مدبرة المنزل إدخال كلمة المرور للشهادة. في هذه الحالة ، تكون كلمة المرور اختيارية.
يرجى ملاحظة أنه يجب تنفيذ جميع الإجراءات الإضافية في مجلد واحد ، حيث يجب أن يكون ملف manifest.json و pass.json والصور موجودًا بالفعل.
الآن تحتاج إلى إنشاء توقيع ، والذي سنوقع على الأرشيف. أولاً ، قم بتصدير معرف نوع المرور والمفتاح إليه باسم .pem.
openssl pkcs12 -in certificate.p12 -clcerts -nokeys -out passcertificate.pem -passin pass: your_password
و
openssl pkcs12 -in certificates.p12 -nocerts -out passkey.pem -passin pass: -passout pass:new_password
الآن نحن على استعداد لإنشاء توقيع. دعونا نجعلها أمرًا:
openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem -inkey passkey.pem -in manifest.json -out signature -outform DER -passin pass:___
لذلك ، كل شيء جاهز بالنسبة لنا ، يبقى فقط لجمع الأرشيف ، نقوم بذلك بالأمر:
zip -r nameOfPass.pkpass manifest.json pass.json signature logo.png logo@2x.png logo@3x.png icon.png icon@2x.png icon@3x.png
أود أن ألفت انتباهك إلى حقيقة أن جميع الملفات التي تريد تضمين أرشيف البيانات الخاص بها للبطاقة (.pkpass) يجب أن يتم سردها هنا.
ونتيجة لذلك ، نحصل على ملف .pkpass يمكن فتحه على جهاز الكمبيوتر. سنرى معاينة للبطاقة ، والتي قد يختلف مظهرها عن المظهر على الهاتف.
كل هذا يمكن القيام به أسهل قليلاً. توفر Apple أداة signpass
( نماذج Apple Wallet signpass
) ، والتي تهتم بجميع حسابات SHA (يمكن ترك ملف manifest.json
بمفرده) وعمل إنشاء التوقيعات. لاستخدامه ، تحتاج إلى بناء مشروع ووضع ملف signpass
في مجلد يحتوي على جميع الموارد اللازمة.

بشكل عام ، يجب أن يبدو الهيكل شيئًا مثل هذا:

بعد ذلك ، نفّذ الأمر:
./signpass -p wallet
Wallet هو اسم المجلد الذي توجد فيه جميع الموارد. الناتج هو wallet.pkpass. يمكن الاطلاع على محتوياته عن طريق فك ضغط wallet.pkpass.
unzip wallet.pkpass
من الممكن أن يتم إرسال إنشاء pkpass إلى الواجهة الخلفية ، وفي هذه الحالة سيكون من الضروري نقل شهادة مطوري WWDR إلى معرف نوع المرور في شكل .p12 وكلمة مرور لها.
تكامل التطبيق
لكي يتمكن التطبيق من إضافة بطاقات إلى Wallet ، يجب عليك تمكين هذه الميزة في معرف التطبيق وكذلك تمكين هذه الميزة في الإمكانيات في المشروع.


هذا ضروري للعمل الصحيح الكامل مع Wallet. خلاف ذلك ، لن يكون من الممكن قراءة البطاقات من Wallet ، على سبيل المثال ، لن يكون من الممكن فهم ما إذا كانت بطاقتنا مضافة أم لا. من المهم أيضًا ملاحظة أن معرف الفريق في pass.json يجب أن يتطابق مع معرف الفريق ، أو يجب عليك إضافته يدويًا إلى الاستحقاقات وهذا يمكن أن يصلح الموقف ، لكنني لم أتحقق من ذلك.

إضافة بطاقة
إن إضافة الخرائط أمر بسيط للغاية:
guard let passPath = Bundle.main.path(forResource: "wallet", ofType: "pkpass") else { return } let error: ErrorPointer = ErrorPointer(nilLiteral: ()) guard let passData = NSData(contentsOfFile: passPath) else { return } let pass = PKPass(data: passData as Data, error: error) let passLibrary = PKPassLibrary() passLibrary.addPasses([pass]) { (status) in print(passLibrary.containsPass(pass)) }
ومع ذلك ، مرة أخرى ، في كثير من الأحيان يجب تنزيل ملف .pkpass من الخادم الخاص بك.
تجدر الإشارة إلى أن PassKit ينتج أخطاء قابلة للقراءة إلى حد ما ، بحيث يمكنك بسهولة فهم ما تم فعله بشكل خاطئ.
للحصول على معلومات حول البطاقات المتوفرة في Wallet والمتعلقة بتطبيقك ، تحتاج إلى الانتقال إلى كائن PKPassLibrary.
let passLibrary = PKPassLibrary() let passes = passLibrary.passes()
وبالتالي ، يمكنك فهم ما إذا تم إضافة الخريطة أم لا ، بالإضافة إلى تحديث الواجهة. بالإضافة إلى ذلك ، من خلال خرائط PKPassLibrary يمكن تحديثها وحذفها. يمكن أيضًا تحديث الخرائط عبر خدمات الويب ، ولكن في هذه المقالة لن نعتبر مثل هذا الخيار.
الاختيار التفرد
نظرًا لأنه في خدمتك ، كقاعدة عامة ، ترتبط البطاقة بحساب ، في التطبيق على الأرجح ستضطر على نحو ما إلى تحديد ما إذا كانت البطاقة تنتمي إلى المستخدم الحالي. أقترح القيام بذلك من خلال serialNumber
. على سبيل المثال ، قم بتعيين serialNumber
التسلسلي serialNumber
المستخدم أو رقم البطاقة.
الاختبار
تقدم Apple أمثلة pkpass لأنواع مختلفة ، يمكنك التركيز عليها.
عينات محفظة التفاح
لمعرفة كيف تبدو الخريطة ، يمكنك إضافة pkpass إلى المشروع (انظر "إضافة خريطة"). تمت بالفعل مناقشة عملية الإضافة / الإزالة أعلاه ، ويبقى فقط التذكير بأن التطبيق لن يرى البطاقات المضافة بالفعل إذا تم إنشاء بطاقة المحفظة على حساب مطور واحد ، وتم إجراء التطوير نفسه من حساب آخر (ذو صلة بشركات الاستعانة بمصادر خارجية). في هذه الحالة ، يمكنك إضافة بطاقات دون مشاكل.
يمكنك التحقق مما إذا تم ترميز المعلومات الموجودة في الرمز الشريطي بشكل صحيح باستخدام أي ماسح ضوئي لرمز الاستجابة السريعة. ومن الضروري بالتأكيد التحقق من صحة العمل مع هذا الماسح الضوئي.
الخلاصة
تناولت المقالة عملية إنشاء وتصميم الخريطة ، وكذلك عملية التكامل مع التطبيق والمشكلات التي قد تنشأ. لم أتطرق عن قصد إلى قضايا التكامل مع خدمات الويب وتحديثات الخرائط ، وآمل أن أفعل ذلك في المقالة التالية.
المواد المستخدمة:
https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/Creating.html
https://developer.apple.com/library/archive/documentation/UserExperience/Reference/PassKit_Bundle/Chapters/TopLevel.html#//apple_ref/doc/uid/TP40012026-CH2-SW3
https://itechroof.wordpress.com/2015/11/30/apple-wallet-part-13/
https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/Updating.html
شكر خاص إلى mehdzor على حساب المطور للاختبارات.