We are moving away from the pattern of delegation and are being reborn as something that can take advantage of Swift Concurrency.
Please refer to this branch: tretnfckit-main
日本のNFCカード向けリーダーライブラリ / NFC Reader for Japanese NFC Cards for iOS etc.
Suica、PASMOなどの交通系ICカード、楽天Edy、nanaco、WAON などの電子マネーカード、運転免許証、マイナンバーカードの読み取り
- iOS 9.3 以降
- watchOS 2.0 以降
- tvOS 9.2 以降
- macOS 10.9 以降
※ NFCカードの読み取りは iOS 13.0 以降で対応するデバイスで使用可能。
- 運転免許証
- 警察庁交通局運転免許課による「運転免許証及び運転免許証作成システム等仕様書(仕様書バージョン番号:008)」に対応
- 共通データ要素(MF/EF01)、暗証番号(PIN)設定(MF/EF02)の読み取り、暗証番号1による認証、記載事項(本籍除く)(DF1/EF01)写真(DF2/EF01)まで実装済み
- マイナンバーカード(個人番号カード、Individual Number Card)
- ICカード種別情報(JPKI_CardType)、マイナンバーの読み取りまで実装済み
IDm と System Code の表示
- 0003: 交通系ICカード (Suica, ICOCA, Kitaca, PASMO, TOICA, manaca, PiTaPa, SUGOCA, nimoca, はやかけん, icsca, ...etc.)
- 残高の読み取りと表示
- 利用履歴、改札入出場履歴、SF入場情報の読み取り
- 80DE: IruCa
- 残高の読み取りと表示
- 利用履歴、改札入出場履歴、SF入場情報の読み取り
- 8592: PASPY
- 残高の読み取りと表示
- 利用履歴、改札入出場履歴、SF入場情報の読み取り
- 865E: SAPICA
- 残高の読み取りと表示
- 利用履歴、改札入出場履歴、SF入場情報の読み取り
- 8FC1: OKICA
- 残高の読み取りと表示
- 利用履歴、改札入出場履歴、SF入場情報の読み取り
- 8B5D: りゅーと
- 残高の読み取りと表示
- 利用履歴の読み取り
- FE00: 楽天Edy
- 残高の読み取りと表示
- 利用履歴の読み取り
- FE00: nanaco
- 残高の読み取りと表示
- 利用履歴の読み取り
- FE00: WAON
- 残高の読み取りと表示
- 利用履歴の読み取り
- FE00: 大学生協プリペイドカード(大学 学生証)
- 残高の読み取りと表示
- 利用履歴の読み取り
- 8008: 八達通
- 残高の読み取りと表示
Examples
配下にサンプルを掲載。
Xcode 11: File > Swift Package > Add Package Dependency... > Enter package repository URL
https://github.com/treastrain/TRETJapanNFCReader
Cartfile
に以下を記述し、carthage update
github "treastrain/TRETJapanNFCReader"
Podfile
に以下を記述し、pod install
pod 'TRETJapanNFCReader'
- プロジェクトの TARGET から開発している iOS Application を選び、Signing & Capabilities で Near Field Communication Tag Reading を有効にする(Near Field Communication Tag Reader Session Formats が entitlements ファイルに含まれている必要がある)。
- Near Field Communication Tag Reader Session Formats の中に "NFC tag-specific data protocol (TAG)" が含まれていることを確認する。
- 開発している iOS Application の Info.plist に "Privacy - NFC Scan Usage Description (NFCReaderUsageDescription)" を追加する。
- 運転免許証を読み取るには、開発している iOS Application の Info.plist に "ISO7816 application identifiers for NFC Tag Reader Session (com.apple.developer.nfc.readersession.iso7816.select-identifiers)" を追加する。ISO7816 application identifiers for NFC Tag Reader Session には以下を含める必要がある。
- Item 0:
A0000002310100000000000000000000
- Item 1:
A0000002310200000000000000000000
- Item 2:
A0000002480300000000000000000000
- ライブラリをインポートし、
DriversLicenseReader
を初期化した後でスキャンを開始する。
import UIKit
import TRETJapanNFCReader
class ViewController: UIViewController, DriversLicenseReaderSessionDelegate {
var reader: DriversLicenseReader!
override func viewDidLoad() {
super.viewDidLoad()
self.reader = DriversLicenseReader(self)
self.reader.get(items: DriversLicenseCardItem.allCases, pin1: "暗証番号1", pin2: "暗証番号2")
}
func driversLicenseReaderSession(didRead driversLicenseCard: DriversLicenseCard) {
// driversLicenseCard に読み取った運転免許証の情報が格納されている
}
}
- マイナンバーカードを読み取るには、開発している iOS Application の Info.plist に "ISO7816 application identifiers for NFC Tag Reader Session (com.apple.developer.nfc.readersession.iso7816.select-identifiers)" を追加する。ISO7816 application identifiers for NFC Tag Reader Session には以下を含める必要がある。
- Item 0: ``
- Item 1: ``
- Item 2: ``
- Item 3: ``
- ライブラリをインポートし、
IndividualNumberReader
を初期化した後でスキャンを開始する。
import UIKit
import TRETJapanNFCReader
class ViewController: UIViewController, IndividualNumberReaderSessionDelegate {
var reader: IndividualNumberReader!
override func viewDidLoad() {
super.viewDidLoad()
// 取得したい情報を指定
let items: [IndividualNumberCardItem] = [.tokenInfo, .individualNumber]
// 券面入力補助用パスワード
let cardInfoInputSupportAppPIN = "1234"
self.reader = IndividualNumberReader(delegate: self)
self.reader.get(items: items, cardInfoInputSupportAppPIN: cardInfoInputSupportAppPIN)
}
func individualNumberReaderSession(didRead individualNumberCardData: IndividualNumberCardData) {
print(individualNumberCardData)
}
func japanNFCReaderSession(didInvalidateWithError error: Error) {
print(error.localizedDescription)
}
// パスワードの残り試行回数を取得する場合
func lookupRemaining() {
// 取得したい残り試行回数の種別を指定
let pinType: IndividualNumberCardPINType = .digitalSignature
self.reader.lookupRemainingPIN(pinType: pinType) { (remaining) in
print("Remaining:", remaining)
}
}
}
- FeliCa を読み取るには、開発している iOS Application の Info.plist に "ISO18092 system codes for NFC Tag Reader Session (com.apple.developer.nfc.readersession.felica.systemcodes)" を追加し、読み取る際に使用する FeliCa システムコードを記述する。ワイルドカードは使用できない。
各カードに対応する
Reader
とCard
がある。
カードの種類 | FeliCa システムコード | Reader |
Card |
---|---|---|---|
交通系IC | 0003 |
TransitICReader |
TransitICCard |
IruCa | 80DE |
TransitICReader |
TransitICCard |
PASPY | 8592 |
TransitICReader |
TransitICCard |
SAPICA | 865E |
TransitICReader |
TransitICCard |
りゅーと | 8B5D |
RyutoReader |
RyutoCard |
OKICA | 8FC1 |
OkicaReader |
OkicaCard |
楽天Edy | FE00 |
RakutenEdyReader |
RakutenEdyCard |
nanaco | FE00 |
NanacoReader |
NanacoCard |
WAON | FE00 |
WaonReader |
WaonCard |
大学生協ICプリペイド | FE00 |
UnivCoopICPrepaidReader |
UnivCoopICPrepaidCard |
FCFCampus(ICU) | FE00 |
ICUReader |
ICUCard |
八達通 | 8008 |
OctopusReader |
OctopusCard |
楽天Edyの例。各Reader
、Card
は上記の表に対応するものに書き換える。
import UIKit
import TRETJapanNFCReader
class ViewController: UIViewController, FeliCaReaderSessionDelegate {
var reader: RakutenEdyReader!
override func viewDidLoad() {
super.viewDidLoad()
self.reader = RakutenEdyReader(viewController: self)
self.reader.get(items: [.balance])
}
func feliCaReaderSession(didRead feliCaCard: FeliCaCard) {
let rakutenEdyCard = feliCaCard as! RakutenEdyCard
let balance = rakutenEdyCard.balance! // カード残高
}
}
- 日本語 Japanese
- English
- treastrain/ios13-felica-reader: Sample project to read FeliCa on iOS 13 and later - GitHub
- iOS 13 で FeliCa (Suica) にアクセス | notes from E
- iOS 13 の Core NFC で運転免許証を読み取ろう【TRETJapanNFCReader】 - Qiita
- ISO/IEC7816
- JIS X 6320-4
マイナンバーカードの読み取り実装においては以下に掲載されている情報を参考にしました。
jpki/myna
- 公的個人認証サービス 利用者クライアントソフト API 仕様書【個人認証サービス AP C 言語インターフェース編】第4.3版 地方公共団体情報システム機構
OKICA の情報、および OKICA カード内に保存されているゆいレールの駅名情報、各バス会社名の情報は Twitter@resi098 様からご提供いただきました。
大学生協ICプリペイドの読み取り実装においては以下に掲載されている仕様を参考にしました。
oboenikui/UnivFeliCa.md
各電子マネー、電子マネーサービス等の名称は一般に各社の商標、登録商標です。 本ライブラリはサービス提供各団体および各社、電子マネーカード提供各社が公式に提供するものではありません。
The names of e-money and the services are generally trademarks and registered trademarks of each company. This library is not officially provided by e-money card service providers and others.