作者ervis (Ervis)
看板iOS
标题[心得] CoreNFC 读西瓜实体卡踩坑纪录(FeliCa)
时间Mon Feb 9 09:53:03 2026
## 前言
最近在做一个日/韩旅游记帐 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://webptt.com/cn.aspx?n=bbs/iOS/M.1770601985.A.B28.html
2F:推 gg90052: 很有潜力的作法,可惜我现在都用apple wallet的suica了 02/09 11:12
3F:推 awdrgyjilp22: 用心给推 虽然看不懂 02/09 11:22
4F:推 a100820: 太神 这真的是免费能用的吗 02/09 11:24
5F:推 lovebbqjim: 很棒!不知道你有没有考虑将这些笔记发表在Medium 02/09 11:40
6F:→ lovebbqjim: 或ITHome,应该能让更多开发者看到 02/09 11:40
7F:推 berserkman: 这简直记帐者福音 02/09 12:05
8F:推 as209099: 推,感觉也可以发到GitHub 02/09 12:20
9F:推 kpg0427: 看不懂,但推w 02/09 12:47
10F:→ ervis: 感谢 lovebbqjim 建议,我有发表在 iThome, 欢迎来按赞 ^^ 02/09 15:00
11F:→ ervis: 回 a100820: 免费无误 (app 内有纯赞助支持, 但不影响使用) 02/09 15:03
12F:推 ankai: 先跪了 太神 02/09 15:23
13F:推 lmw: 太神了!可惜现在都是用钱包中的西瓜 02/09 15:51
14F:→ ervis: 没错,希望 Apple 能够开放 API 读取,资料就丰富多了 02/09 16:06
15F:推 ginlom: 推小结:实测才是真的 02/09 16:48
16F:推 ko00385331: 推 02/09 17:54
17F:推 cutejojocat: 推一个持续更新新功能 02/10 01:19
18F:推 y05192c: 实用就给推 介绍给刚好最近要去日本玩的朋友 02/10 03:50
19F:推 Syu: 认真开发给推 02/10 05:22
20F:推 pcmacgyver: 推作者的用心开发 02/10 06:58
21F:推 hymo: 推 02/10 12:07
22F:推 Donaldren: 推推 02/10 12:20
24F:→ sinclaireche: Github上也有相关library 02/10 12:58
25F:推 Ethierz: 推 02/10 13:15
26F:推 love61106: 只能推作者用心 其他就靠板友研究自己摸索了 02/10 17:41
27F:→ ervis: 感谢 sinclaireche 提供资讯,非常完整超棒 02/10 23:43
28F:推 sam749: 推 02/11 02:04
29F:推 linken28: 推用心! 02/11 15:54
30F:推 zhao60: 推推 02/12 00:22
31F:推 stableman302: 推旅收 02/12 07:02