2019年10月14日 星期一

在 iPhone XR 上讀取八達通餘額


最近有個 App 能透過在 iPhone 上的 NFC 模組讀取八達通餘額。感到很神奇,也想動手做做看。

事緣是 iOS 13 鬆綁了對 NFC 的限制,開發人員能讀取更多不同款式的 NFC 卡。按照蘋果的範例去做,只需要幾個步驟便能完成程式。可是,當在 iPhone XR 上執行程式,放上八達通,一點反應也沒有。以為是數據格式問題,加入 Breakpoint 同樣也沒有反應。是連檢測也沒有發生。

經過多翻研究及嘗試,知道八達通是使用 Felica 系統 Type-F 制式,需要用上 NFCTagReaderSession 而非 NFCNDEFReaderSession。同時在 Info.plist 內要加入:
<key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
<array>
 <string>0003</string>
 <string>8008</string>
</array>
在 NFCTagReader.entitlements 中也要加入:
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
 <string>NDEF</string>
 <string>TAG</string>
</array>
八達通的系統代號為 8008。服務代碼為 0x0117。有了這些準確的設定才能成功讀取數據。數據頭 4 字元是沒有加密的八達通餘額。由於港幣餘額會有毫子出現,為了簡單快捷起見,八達通餘額會乘大 10 倍,即是數值 789 其實是 HK$78.9 餘額。還有是這個餘額包含了按金,所以實際餘額會是 HK$78.9 - HK$50 = $23.9。

沒有留言: