treastrain / TRETJapanNFCReader

NFC (FeliCa) Reader for iOS 13 later Core NFC / Japanese e-Money prepaid or identification cards
https://japannfcreader.tret.jp
MIT License
446 stars 34 forks source link
corenfc edy felica ios nanaco nfc nfc-library octopus okica pasmo rakuten-edy suica swift waon

🏎️ Road to TRETNFCKit

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

TRETJapanNFCReader

日本のNFCカード向けリーダーライブラリ / NFC Reader for Japanese NFC Cards for iOS etc.

MIT License GitHub Stars Platform: iOS|watchOS|tvOS|macOS Swift: 5.2 Swift Package Manager compatible Carthage compatible CocoaPods

Support: Twitter: @JapanNFCReader Developer Twitter: @treastrain

Suica、PASMOなどの交通系ICカード、楽天Edy、nanaco、WAON などの電子マネーカード、運転免許証、マイナンバーカードの読み取り

対応 OS / Supported OS

※ NFCカードの読み取りは iOS 13.0 以降で対応するデバイスで使用可能。

対応 NFC カード / Supported NFC card

NFC-B (Type-B)

NFC-F (Type-F, FeliCa)

IDm と System Code の表示

使い方 / How to use

Examples 配下にサンプルを掲載。

Swift Package Manager

Xcode 11: File > Swift Package > Add Package Dependency... > Enter package repository URL

https://github.com/treastrain/TRETJapanNFCReader

Carthage

Cartfile に以下を記述し、carthage update

github "treastrain/TRETJapanNFCReader"

CocoaPods

Podfile に以下を記述し、pod install

pod 'TRETJapanNFCReader'

全 NFC カード共通

  1. プロジェクトの TARGET から開発している iOS Application を選び、Signing & Capabilities で Near Field Communication Tag Reading を有効にする(Near Field Communication Tag Reader Session Formats が entitlements ファイルに含まれている必要がある)。
  2. Near Field Communication Tag Reader Session Formats の中に "NFC tag-specific data protocol (TAG)" が含まれていることを確認する。
  3. 開発している iOS Application の Info.plist に "Privacy - NFC Scan Usage Description (NFCReaderUsageDescription)" を追加する。

NFC-B (Type-B)

運転免許証の場合

  1. 運転免許証を読み取るには、開発している 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
  2. ライブラリをインポートし、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 に読み取った運転免許証の情報が格納されている
    }
    }

マイナンバーカードの場合

  1. マイナンバーカードを読み取るには、開発している 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: D392F000260100000001
    • Item 1: D3921000310001010408
    • Item 2: D3921000310001010100
    • Item 3: D3921000310001010401
  2. ライブラリをインポートし、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)
        }
    }
    }

NFC-F (Type-F, FeliCa)

カードの種類 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の例。各ReaderCardは上記の表に対応するものに書き換える。

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! // カード残高
    }
}

L10N

関連するページ / Related

謝辞 / Acknowledgments

MiFare TRETJapanNFCReader/MIFARE

マイナンバーカード TRETJapanNFCReader/MIFARE/IndividualNumber

マイナンバーカードの読み取り実装においては以下に掲載されている情報を参考にしました。

OKICA TRETJapanNFCReader/FeliCa/Okica/

OKICA の情報、および OKICA カード内に保存されているゆいレールの駅名情報、各バス会社名の情報は Twitter@resi098 様からご提供いただきました。

大学生協ICプリペイド TRETJapanNFCReader/FeliCa/UnivCoopICPrepaid

大学生協ICプリペイドの読み取り実装においては以下に掲載されている仕様を参考にしました。

八達通 TRETJapanNFCReader/FeliCa/Octopus

各電子マネー、電子マネーサービス等の名称は一般に各社の商標、登録商標です。 本ライブラリはサービス提供各団体および各社、電子マネーカード提供各社が公式に提供するものではありません。

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.