[心得] CoreNFC 讀西瓜實體卡踩坑紀錄(FeliCa)
## 前言
最近在做一個日/韓旅遊記帳 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
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
02/09 11:40, 5F
→
02/09 11:40,
2周前
, 6F
02/09 11:40, 6F
推
02/09 12:05,
2周前
, 7F
02/09 12:05, 7F
推
02/09 12:20,
2周前
, 8F
02/09 12:20, 8F
推
02/09 12:47,
2周前
, 9F
02/09 12:47, 9F
→
02/09 15:00,
2周前
, 10F
02/09 15:00, 10F
→
02/09 15:03,
2周前
, 11F
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
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:57, 23F
→
02/10 12:58,
2周前
, 24F
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
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
iOS 近期熱門文章
PTT數位生活區 即時熱門文章