[心得] CoreNFC 讀西瓜實體卡踩坑紀錄(FeliCa)

看板iOS (蘋果iOS作業系統)作者 (Ervis)時間2周前 (2026/02/09 09:53), 編輯推噓23(2308)
留言31則, 25人參與, 2周前最新討論串1/1
## 前言 最近在做一個日/韓旅遊記帳 App「旅收」, 收到用戶許願說想用 NFC 感應西瓜卡直接記帳,不用手打金額。 覺得這個方向很有趣就開始研究。 查了一輪資料,網路上幾乎都寫 Suica 的 FeliCa system code 是 88B4, 結果實測完全不是那回事,踩了不少坑,紀錄一下。 環境:iPhone 16 Pro / iOS 26 / Xcode 26.1.1 / CoreNFC ## 踩坑紀錄 ### 坑 1:FFFF 萬用碼直接被 Apple 拒絕 FeliCa 有個萬用 system code FFFF,理論上可以偵測所有卡片。 放進 Info.plist → Apple 直接噴 "Invalid system code entry: FFFF"。 所以必須列舉具體的 system codes。 ### 坑 2:88B4 超時,拖垮整個 NFC 連線 照網路資料把 88B4 排第一,結果 nfcd daemon 嘗試查詢時直接超時: ``` nfcd: _getIDMFromTag:systemCode: nfcd: phNciNfc_RspTimeOutCb: Timer expired! nfcd: Target Lost!! ``` 重點是,這個超時不只是「查詢失敗」,它會弱化整個 RF 連線。 後面即使換別的 system code 成功連上,App 也只能送 1-2 個指令就斷線。 ### 坑 3:實測 3 張 Suica,全部沒有 88B4 用 requestSystemCode() 查詢卡片支援的系統碼: ``` 3 張不同年份的實體 Suica → ["0003", "FE00", "86A7"] ``` 沒有一張有 88B4。 目前不確定是所有實體卡都這樣,還是跟卡片世代有關。 手邊沒有 PASMO 可以交叉驗證。 如果有板友手上有不同卡片,很好奇 requestSystemCode 會回什麼。 ### 坑 4:服務藏在 system 0003 既然沒有 88B4,那餘額 (0x008B) 跟交易歷史 (0x090F) 在哪? 用 requestService 逐一探測: ``` System 0003: 0x008B (餘額): 存在 0x090F (歷史): 存在 System 86A7: 全部 FFFF(無可用服務) System FE00: Common Area,沒有交通相關服務 ``` 所以交通卡服務的 service codes 跟網路資料一樣(0x008B / 0x090F), 但掛載的 system 不是 88B4 而是 0003。 ### 坑 5:Info.plist 順序決定連線穩定性 nfcd 會按照 Info.plist 的順序逐一嘗試 system code。 排錯順序 → 前面的超時 → 連線不穩 → App 讀不到資料。 最終順序: ```xml <array> <string>0003</string> <!-- 服務在這,排最前 --> <string>FE00</string> <!-- Common Area fallback --> <string>88B4</string> <!-- 標準交通卡(備用) --> <string>86A7</string> <!-- 無有用服務,排最後 --> </array> ``` ## 最終結果 調整順序後,讀取穩定很多。成功讀到餘額 + 最近的交易紀錄。 每筆交易 16 bytes,包含日期、終端機類型(改札機/超商/自販機)、 進出站代碼、餘額。 目前已經整合到 App 裡面, 靠卡就能把交通費跟超商消費直接匯入帳本。 ## 小結 這次最大的收穫是:不要盡信網路資料,實測才是真的。 88B4 在我手上的 3 張 Suica 都不存在, 但 service codes 是一樣的,只是掛在不同的 system 上。 CoreNFC + FeliCa 的中文資源真的很少, 希望這篇能幫到也在研究的人。有問題歡迎推文交流。 PS: 有使用 AI 協助寫作 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.35.1.4 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/iOS/M.1770601985.A.B28.html

02/09 10:51, 2周前 , 1F
02/09 10:51, 1F

02/09 11:12, 2周前 , 2F
很有潛力的作法,可惜我現在都用apple wallet的suica了
02/09 11:12, 2F

02/09 11:22, 2周前 , 3F
用心給推 雖然看不懂
02/09 11:22, 3F

02/09 11:24, 2周前 , 4F
太神 這真的是免費能用的嗎
02/09 11:24, 4F

02/09 11:40, 2周前 , 5F
很棒!不知道你有沒有考慮將這些筆記發表在Medium
02/09 11:40, 5F

02/09 11:40, 2周前 , 6F
或ITHome,應該能讓更多開發者看到
02/09 11:40, 6F

02/09 12:05, 2周前 , 7F
這簡直記帳者福音
02/09 12:05, 7F

02/09 12:20, 2周前 , 8F
推,感覺也可以發到GitHub
02/09 12:20, 8F

02/09 12:47, 2周前 , 9F
看不懂,但推w
02/09 12:47, 9F

02/09 15:00, 2周前 , 10F
感謝 lovebbqjim 建議,我有發表在 iThome, 歡迎來按讚 ^^
02/09 15:00, 10F

02/09 15:03, 2周前 , 11F
回 a100820: 免費無誤 (app 內有純贊助支持, 但不影響使用)
02/09 15:03, 11F

02/09 15:23, 2周前 , 12F
先跪了 太神
02/09 15:23, 12F

02/09 15:51, 2周前 , 13F
太神了!可惜現在都是用錢包中的西瓜
02/09 15:51, 13F

02/09 16:06, 2周前 , 14F
沒錯,希望 Apple 能夠開放 API 讀取,資料就豐富多了
02/09 16:06, 14F

02/09 16:48, 2周前 , 15F
推小結:實測才是真的
02/09 16:48, 15F

02/09 17:54, 2周前 , 16F
02/09 17:54, 16F

02/10 01:19, 2周前 , 17F
推一個持續更新新功能
02/10 01:19, 17F

02/10 03:50, 2周前 , 18F
實用就給推 介紹給剛好最近要去日本玩的朋友
02/10 03:50, 18F

02/10 05:22, 2周前 , 19F
認真開發給推
02/10 05:22, 19F

02/10 06:58, 2周前 , 20F
推作者的用心開發
02/10 06:58, 20F

02/10 12:07, 2周前 , 21F
02/10 12:07, 21F

02/10 12:20, 2周前 , 22F
推推
02/10 12:20, 22F

02/10 12:57, 2周前 , 23F

02/10 12:58, 2周前 , 24F
Github上也有相關library
02/10 12:58, 24F

02/10 13:15, 2周前 , 25F
02/10 13:15, 25F

02/10 17:41, 2周前 , 26F
只能推作者用心 其他就靠板友研究自己摸索了
02/10 17:41, 26F

02/10 23:43, 2周前 , 27F
感謝 sinclaireche 提供資訊,非常完整超棒
02/10 23:43, 27F

02/11 02:04, 2周前 , 28F
02/11 02:04, 28F

02/11 15:54, 2周前 , 29F
推用心!
02/11 15:54, 29F

02/12 00:22, 2周前 , 30F
推推
02/12 00:22, 30F

02/12 07:02, 2周前 , 31F
推旅收
02/12 07:02, 31F
文章代碼(AID): #1fYJu1ie (iOS)
文章代碼(AID): #1fYJu1ie (iOS)