- Seattle Public Library ve King County Library System’in plastik kartları azaltma hedefiyle, iPhone Wallet kartlarının JSON, görsel ve imza yapısıyla doğrudan uğraşmak gerekti
- Wallet yalnızca QR code, PDF417, Aztec Code ve Code 128’i desteklediği için kütüphane kartının Codabar barkodu yerel barkod olarak eklenemedi; fiilen taranacak barkod için görsel kullanılarak bir geçici çözüm uygulandı
- Kartın Apple’ın güvendiği bir anahtarla imzalanması gerekiyordu; ancak yıllık 99 dolarlık Apple Developer üyeliği yerine, çevrimdışı oluşturma yapabilen bir iOS kart uygulamasında sertifika ve anahtar bulunup kullanıldı
storeCardyerleşimi, çözünürlüğe göre logolar, Codabarstrip.pngve boş birPKBarcodeFormatCode128öğesi birleştirilerek ekranda görsel barkod gösterilirken iOS’un ekran parlaklığını artırma davranışı korundu- Tamamlanan
.pkpass, manifest oluşturma,openssl smimeile imzalama ve ZIP paketleme yoluyla üretilebildi; gerçek kütüphane testi henüz yapılmamış olsa da ayrı bir tarayıcı telefon ekranındaki barkodu okudu
Hedef: Plastik kart olmadan kütüphane barkodunu kullanmak
- Seattle Public Library ve King County Library System, ödünç alma hesabına bağlı üzerinde barkod basılı plastik kartlar veriyor
- 2023 itibarıyla Seattle kütüphanesindeki çoğu işlem self-servis ve genellikle kütüphane barkodu elle girilebiliyor
- Yine de barkodu hemen göstermek çok daha pratik olduğundan, hedef neredeyse hiç kullanılmayan plastik kartı cüzdanda taşımak yerine iPhone Wallet uygulamasına koymaktı
Wallet kartları JSON, görsel ve imzadan oluşur
- Wallet uygulaması bugün ödeme kartları, kimlikler, anahtarlar gibi şeyleri yönetiyor; ancak 2012’de Passbook ilk çıktığında yalnızca “kartları” yönetiyordu
- Apple’ın kart belgelerine göre kart, e-posta veya web üzerinden dağıtılabilen kendi kendine yeterli bir ZIP dosyasıdır ve içinde JSON ile PNG bulunur
.pkpassdosyasının temel yapısı basittirpass.json: Görsel olmayan kart içeriğini tanımlarmanifest.json: Diğer dosyaların SHA-1 sağlama toplamları listesisignature:manifest.jsoniçeriği için S/MIME imzası- Desteklenen görsel dosyaları
Codabar desteğinin olmaması ilk engeldi
- Wallet kartlarının desteklediği yalnızca dört barkod türü vardır
- QR code
- PDF417
- Aztec Code
- Code 128
- Kütüphane kartı, kütüphanelerde yaygın kullanılan Codabar biçimindeydi
- Kütüphane barkod tarayıcılarının başka doğrusal barkodları destekleme ihtimali olsa da tüm şubelerde kesin çalıştığı söylenebilecek tek biçim Codabar’dı
- Sonuçta Wallet’ın yerleşik barkod özelliği yerine, taranabilir bir Codabar görseli üretip kartın içine koymak gerekti
Kart imzalama sertifikası sorunu
- Wallet kartları kriptografik imza gerektirir ve Apple sertifika otoritelerinden birinin güvendiği bir anahtarla imzalanmalıdır
- Uçuş kapısı değişikliği veya koltuk değişikliği gibi satıcının kartı otomatik güncellemesi gereken durumlarda imza bir ölçüde makuldür
- Apple geliştiricisiyseniz kart imzalama anahtarını nispeten kolay alabilirsiniz; ancak bu iş için yılda 99 dolar ödemek istenmedi
Mevcut kart oluşturma uygulamalarının uygun olmama nedenleri
- Apple geliştiricisi olan kişiler tarafından yapılmış çeşitli kart tasarım uygulamaları vardı, ancak gereken düzeyde kontrol sunmuyorlardı
-
Logo boyutu kontrolü
- Apple, kartın sol üstündeki logo için en fazla 50 device-independent pixels yüksekliğe izin veriyor
- Metnin sağında yer alan kare logo için yaklaşık 40px yükseklik en uygun olandı
- Geliştiricinin ayrı ayrı
logo.png,logo@2x.png,logo@3x.pngsağlaması gerekir; ancak uygulamalar genellikle tek logo seçimine izin verip ölçek kontrolü sunmaz
-
Ekran parlaklığı davranışı
- Normal desteklenen barkodu olan bir kart açıldığında, tarayıcıyla kontrast için ekran parlaklaşır
- Gerçekte çalışmayan bir barkod göstermeden iOS’un ekranı parlaklaştırmasını sağlamak için
pass.jsondosyasını doğrudan düzenlemek gerekiyordu - Ücretsiz indirilebilen uygulamalarda bile Wallet’a kaydedilebilen kart sayısını sınırlayıp ödeme isteyenler olabiliyordu
Çevrimdışı oluşturma uygulamasında imzalama anahtarını bulmak
- Birkaç ücretsiz başlangıç seviyesinde kart oluşturma uygulaması indirildi ve çevrimdışıyken de kart oluşturup oluşturmadıkları kontrol edildi
- Uçak modu ve Wi‑Fi kapalıyken yapılan testte, en az bir uygulamanın çevrimdışı kart oluşturabildiği görüldü
- Anahtarın iptal edilmesini önlemek için söz konusu uygulamanın adı açıklanmıyor
- Süreç beklenenden daha basitti
- Apple silicon Mac’lerde iOS uygulamaları çalıştırılabildiği için uygulama Mac’e indirildi
- Paketlenmiş iOS uygulama bundle’ının içinde göze çarpan bir
.p12dosyası bulundu - PKCS#12 dosyası içe aktarma parolası gerektirdiğinden, ana ikili dosyada
stringsçalıştırılarak parola gibi görünen dizeler arandı
openssl pkcs12ile sertifika bilgileri kontrol edildiğinde issuer alanı Apple Worldwide Developer Relations Certification Authority olarak göründü- Sertifika zinciri de gereklidir; ara sertifika uygulama bundle’ının içinde olabilir ve X.509 uzantı alanındaki URL’den de indirilebilir
Kart yerleşiminin yapılandırılması
- Kart stili olarak
boarding pass,coupon,event ticket,generic,store cardseçeneklerinden biri seçilmelidir - Büyük yatay görsel eklemek için
stripgörselini destekleyen bir yerleşim gerekir- Adaylar
coupon,event ticket,store card - Fiziksel kütüphane kartına en çok benzeyen biçim olduğu için store card seçildi
- Adaylar
pass.jsondosyasında şu değerler bulunurpassTypeIdentifierteamIdentifierformatVersionserialNumberorganizationNamelogoTextdescriptionstoreCardbackgroundColorforegroundColorsharingProhibited
passTypeIdentifierveteamIdentifier, Apple sertifikası subject alanındaki sırasıylaUIDveOUalanlarıyla eşleşmelidir- Aynı
passTypeIdentifierile oluşturulan her kartın benzersiz birserialNumberdeğeri olmalıdır - Görseller kullanım amacına göre hazırlandı
icon.pngzorunludur ancak kartın kendisinde gösterilmezlogo.pngsol üstte gösterilen logodur- 40×40
logo.png, 80×80logo@2x.png, 120×120logo@3x.pngoluşturuldu logo@3x.png,icon.pngolarak kopyalandı- Önceden oluşturulan barkod
strip.pngiçine kondu
Codabar barkod görseli oluşturmak
- iOS,
strip.pngdosyasını cihaz ekranındaki kutuya uyacak şekilde ölçekleyip kırptığı içinstrip.pngiçin çözünürlüğe göre üç ayrı sürüm oluşturmak gerekmedi - İki kütüphane kartı başlangıç ve bitiş sembolleri olarak A ve D kullanıyor
- Başlangıç ve bitiş sembollerini doğrulamanın en kolay yolu bir barkod tarayıcı kullanmaktır; yoksa Wikipedia’nın Codabar kodlama tablosu ile gözle karşılaştırılabilir
- Çevrimiçi ve hemen kullanılabilecek Codabar oluşturucular çok fazla değildi; ancak biçimin kendisini doğrudan uygulamak kolaydı
- Prototipte Rust için Barcoders kütüphanesi ile SVG oluşturuldu, SVG ayarlandıktan sonra PNG’ye aktarıldı
- Son yerleşim taranabilirlik ve iOS’un küçültülmüş gösterimi dikkate alınarak belirlendi
- Barkod yüksekliği, başlangıç ve bitiş sembolleri dahil toplam sembol sayısının 2 katı birim olarak ayarlandı
- Örneğin 13 haneli barkod numarası 15 sembol olduğundan yükseklik 30 birim yapıldı
- Başlangıçtan önce ve bitişten sonra ayrı ayrı 15 birimlik quiet space bırakıldı
- Barkodun üstüne ve altına ayrı ayrı 50 birim padding kondu
- iOS’un görüntüyü her zaman küçültmesi için her birim 8 piksele büyütüldü
- Örnek 15 sembollü barkodda nihai görsel yüksekliği 1040 piksel, barkodun kendi yüksekliği ise 240 pikseldir
- Yukarıdaki yerleşimde Codabar BMP oluşturan ve bunu
sipsile PNG’ye dönüştüren 69 satırlık bir shell script yazıldı - Script çıktısı
strip.pngolarak kaydedildiğinde karta konacak barkod görseli hazır olur
Barkod numarasını gösterme ve ekran parlaklığı geçici çözümü
- Barkod numarası, barkodun altında
secondaryFieldsile gösterilirkey:numberlabel:CARD NUMBERvalue: kart numarası
- iOS, barkodu olan bir kart seçildiğinde tarayıcıya yardımcı olmak için ekranı parlaklaştırır
- Görsel olarak eklenen Codabar tek başına iOS’un barkod bulunduğunu düşünmesini sağlamaz
- Bu davranışı elde etmek için
pass.jsonüst seviyesinde boş bir barkod öğesi belirtildimessageboş dizedirformatPKBarcodeFormatCode128olurmessageEncodingiso-8859-1olur
- Bu yöntem, kartın alt kısmında barkod göstermeden iPhone’un ekranı barkodu olan bir karttaki gibi parlaklaştırmasını sağladı
İmzalama ve paketleme
- Tüm dosyalar hazırlandıktan sonra
manifest.jsonoluşturulmalıdır manifest.json, anahtar olarak dosya adlarını, değer olarak SHA-1 sağlama toplamlarını içeren bir nesnedirsha1sumvejqbirleştirilerek PNG dosyaları ilepass.jsoniçin manifest oluşturuldu- Manifest imzası
openssl smimekomutuyla yapıldı- imzalayan sertifikası
- private key
- Apple WWDR ara sertifikası
- girdi
manifest.json - çıktı
signature
openssl smimekomutunun-attimeseçeneğiyle istenen imzalama zamanı belirtilebilir- Seçenek değeri UNIX epoch’tur
- Apple’dan alınan veya bulunan sertifika süresi dolmuş olsa bile o zamanla imzalanabilir
- Son olarak aşağıdaki dosyalar ZIP içine konup
.pkpassoluşturulur- PNG görselleri
pass.jsonmanifest.jsonsignature
Test sonuçları ve eksikler
- macOS’ta kartın geçerli olduğunu ve genel olarak doğru göründüğünü kontrol etmeye yarayan bir kart önizleme aracı vardır
- Geçerli değilse hatalar
Console.appiçinde bulunabilir - Önizleme aracı %100 doğru değildir, ancak iCloud üzerinden iPhone’a gönderme düğmesi vardır
- Tamamlanan kart gerçek kütüphanede henüz test edilmedi
- Ayrı bir barkod tarayıcı, telefon ekranındaki barkodu gerçek plastik karttaki gibi okuyabildi
- Ancak ekran parlaklığı en yükseğe çıkarıldığında iyi okunuyordu
- Boş barkod geçici çözümüyle yükselen parlaklıktan daha parlak ayarlanmıştı
- Kart spesifikasyonunun 10 yıldır neredeyse hiç değişmemiş olması iyi; ancak PNG ve JSON’dan oluşan zararsız bir kartı imzalamak için yıllık 99 dolarlık Apple Developer üyeliği gerekmesi üzücü
- Bazı kart özellikleri için imza gerektiği söylenebilir; ancak bu işte yapılanlar için imza gerekmemeli
- Apple Wallet’a Codabar desteği eklerse, kütüphane sistemindeki tüm tarayıcıların Code 128 destekleyip desteklemediğini denetlemeye gerek kalmadan dijital kütüphane kartları desteklenebilir
1 yorum
Hacker News yorumları
Sırada ORCA kartını da ele alsalar iyi olur. Seattle, ABD’nin teknoloji merkezlerinden biri ama metro/toplu taşımanın kendisi zaten pek iyi olmadığı gibi, denediğim neredeyse tüm büyük şehirlerin toplu taşımasına kıyasla teknik olarak da geride kalıyor.
Avrupa’daki herhangi bir şehir, CDMX, Denver ile karşılaştırınca hepsi Seattle’dan çok daha ileride; kişisel olarak Denver’ın en iyisi olduğunu düşünüyorum.
ORCA’yı işleten kurumlardan biri Android uygulamasına NFC desteği ekleyeceğine dair bir blog yazısı bile yayımlamıştı, ama o yazı artık yok ve aradan birkaç yıl geçmiş olmasına rağmen bu özellik hâlâ yok.
Aynı kartı kullandığınız sürece aktarmalar ve birkaç günlük pass’ler gibi şeyleri sorunsuz hallediyor; belirli bir süre içinde belli sayının üzerinde biniş yaparsanız daha fazla ücret almamak gibi doğru ücreti otomatik uyguluyor.
Ofis kapım NFC kartla açıldığı için iOS’ta mümkün olup olmadığını araştırmıştım; hatırladığım kadarıyla Apple, NFC donanımını sıradan PassKit’ten daha sıkı kontrol ediyor, bu yüzden normal uygulamalarla zor görünüyor.
ORCA’ya 2023 içinde temassız ödemenin geleceği söylenmişti; bunun gerçek olması için artık yaklaşık iki ay kaldı.
Google, Google Wallet’ta ORCA’yı yakında destekleyeceğini yazdığı için iyimserim.
Google Wallet’ın Apple Passbook gibi herhangi bir barkodu eklemeye izin vermemesinden hoşlanmayan Android kullanıcıları için F-Droid’de Loyalty Card Keychain adlı harika bir uygulama var: https://f-droid.org/en/packages/protect.card_locker/
Numarayı elle girebilir ya da mevcut barkodu tarayabilir, Codabar dâhil çeşitli barkod biçimlerinden birini seçip kaydedebilirsiniz. Uygulamanın ana ekranında bir öğeye dokunduğunuzda oluşturulan barkodu gösteriyor ve ekran parlaklığını da artırıyor.
Barkodu göstermek dışında pek bir şey yapmadığı için olsa gerek, uygulama da çok hızlı açılıyor. Tek işlevi var ama belki de en sevdiğim uygulama.
Şimdilerde Catima kullanılması öneriliyor gibi; kısa süre denedim, benzer şekilde basit ve aynı kod tabanına dayanıyor gibi görünüyor.
Zahmetli ama amacına ulaşıyor, gizlilik politikası da iyi.
Pass’in kriptografik olarak imzalanması ve Apple sertifika otoritesinin bildiği bir anahtarla imzalanması gerektiğinin neden mantıklı olduğunu anlamıyorum. Bu tür güncellemeler için zaten iyi desteklenen HTTPS var.
Apple, pass’in yalnızca güncelleme anında değil, telefonda çevrimdışıyken de doğrulanmasını istiyor olabilir ama yine de garip. Kötü niyetli biri pass’i güncellemek yerine tamamen değiştirebilir.
Bunu Apple geliştirici hesabına bağlamanın güncelleme sorununa nasıl yardımcı olacağını hiç anlamıyorum.
Apple tarafından onaylanmış bir taraf olma şartı için aklıma gelen tek gerekçe sahte bilet satışı. “Konser X bileti” adlı pkpass dosyasının gerçek olup olmadığını, bu şart olsa da olmasa da bilmenin bir yolu yok.
Dolandırıcılık bildirimi gelirse ilgili geliştirici hesabını iptal ederek karşılık vermeye çalışıyor olabilirler, ama bu da çözüm gibi görünmüyor. Geliştirici hesabı ücreti, yakalanmadan önce dolandırıcılıkla kazanılabilecek paradan muhtemelen çok daha ucuzdur.
Ben sadece kütüphane kartı numaramın bulunduğu barkod PNG’sini kendime e-postayla gönderiyorum; kiosk önünde Photos ya da Gmail uygulamasıyla açıp kullanıyorum.
MakePass uygulamasıyla StarBucks üyelik kodumu içeren bir pass oluşturdum; sık gittiğim mağazanın yakınına geldiğimde telefon kilit ekranında StarBucks pass’ini otomatik öneriyor.
Etkinlik biletlerinde de aynı şekilde konum ve zaman aralığı belirlerseniz, mekâna vardığınızda pass’i aramanıza gerek kalmadan otomatik öneriliyor. Etkinlik bitince artık önerilmiyor ve ana ekranı kalabalıklaştırmamak için “Expired Passes” bölümüne taşınıyor.
MakePass: https://pvieito.com
Güzel bir blog yazısıydı ama sonu “bu pass’i gerçek kütüphanede henüz test etmedim” diye bitiyor.
Eğlence için yapılmış bir proje olduğunu anlıyorum ama sonucu paylaşmadan önce nihai çözümü test etmek için gereken 10 dakikayı neden ayırmadığını anlamıyorum.
Barkod oluştururken kişisel olarak PostScript tabanlı barkod oluşturucuyu tercih ederim
https://bwipp.terryburton.co.uk/
Bu sorunu kütüphane kartının fotoğrafını çekerek çözdüm. Kitap ödünç alırken fotoğrafı açıp tarayıcıya tutmak yeterli
Telefondaki fotoğraf albümünde tüm kimlik kartlarımı saklıyorum
Android’de benzer bir şey yapmak isterseniz Google Play ve F-Droid’de bulunan Catima var. Birçok barkod türünü destekliyor
https://catima.app/
Ucuz lazer tipi 1 boyutlu barkod tarayıcıları ekrandan barkod okuyamaz. eInk belki çalışabilir
Sık gittiğim süpermarketin üyelik kartı barkod tabanlı olduğu için kullanışsız; neyse ki barkod okuyucu klavyeyi taklit ediyor, bu yüzden kodu doğrudan klavyeyle girebiliyorum
Kamera tabanlı tarayıcılar barkod aydınlatmasının ortam ışığı mı, kendi LED’i mi, yoksa arkadan aydınlatmalı ekran mı olduğuna aldırmaz; ama lazer tabanlı sistemler kendi ışıklarının yansımasına dayandığı için aktif arka aydınlatmalı ekranlarda hiç çalışmaz
e-ink veya pasif LCD ekranlarda çalışıp çalışmadığını merak ediyorum
Dışarıdan basit bir kırmızı çizgili 2D tip gibi görünüyor, ama demek ki donanım gerçekten önemli
KCLS hesap numarasını ezberledim. Ezberlemek 30 saniye kadar sürer; kişiye göre değişir ama bence bu yöntem daha hızlı olur
Sonrasında barkodu taratmak yerine hesap numarasını girmek yeterli; telefonu çıkarıp hazırlamaktan daha az zaman alma ihtimali yüksek
SPL’nin de aynı şekilde olup olmadığını bilmiyorum. Seattle’da yaşamadığım için kontrol edemem