Code Monkey home page Code Monkey logo

tretjapannfcreader's Introduction

🏎️ 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

  • iOS 9.3 以降
  • watchOS 2.0 以降
  • tvOS 9.2 以降
  • macOS 10.9 以降

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

対応 NFC カード / Supported NFC card

NFC-B (Type-B)

  • 運転免許証
  • 警察庁交通局運転免許課による「運転免許証及び運転免許証作成システム等仕様書(仕様書バージョン番号:008)」に対応
  • 共通データ要素(MF/EF01)、暗証番号(PIN)設定(MF/EF02)の読み取り、暗証番号1による認証、記載事項(本籍除く)(DF1/EF01)写真(DF2/EF01)まで実装済み
  • マイナンバーカード(個人番号カード、Individual Number Card)
  • ICカード種別情報(JPKI_CardType)、マイナンバーの読み取りまで実装済み

NFC-F (Type-F, FeliCa)

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: 八達通
    • 残高の読み取りと表示

使い方 / 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
  1. ライブラリをインポートし、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
  1. ライブラリをインポートし、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 を読み取るには、開発している iOS Application の Info.plist に "ISO18092 system codes for NFC Tag Reader Session (com.apple.developer.nfc.readersession.felica.systemcodes)" を追加し、読み取る際に使用する FeliCa システムコードを記述する。ワイルドカードは使用できない。 各カードに対応する ReaderCard がある。
カードの種類 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

  • 日本語 Japanese
  • English

関連するページ / Related

謝辞 / Acknowledgments

MiFare TRETJapanNFCReader/MIFARE

  • ISO/IEC7816
  • JIS X 6320-4

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

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

  • jpki/myna
  • 公的個人認証サービス 利用者クライアントソフト API 仕様書【個人認証サービス AP C 言語インターフェース編】第4.3版 地方公共団体情報システム機構

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.

tretjapannfcreader's People

Contributors

kishikawakatsumi avatar qs-f avatar treastrain avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tretjapannfcreader's Issues

利用iPhoneの機体による問題

こんにちは

本コードをクローンして幾つかのiPhoneで試したところ、運転免許証の読み込みで問題があったので共有しておきます

  • 利用端末: iPhone7 sim free
  • 発生問題: 運転免許証ver7、8において読み取りができなかった
    • iPhone Xにて同じ免許証を同様のコードにて実装したところ問題なく読み込むことができました
  • 問題発生個所: func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag])
    • session.connectにてエラーが発生し読み込みが止まってしまっている

詳しくは調査しきれていませんが、端末に関する問題もあるかもしれません。
また何かありましたら共有させていただきます

ドキュメントが GitHub Pages に反映されない

Actions で Swift Doc によりドキュメントを生成し、それを Wiki と GitHub Pages にアップロード・デプロイしたい。

この作業は GitHub Actions の documentation.yml により実行される。

Wiki へのアップロードは問題なく行われるが、GitHub Pages へのデプロイが正しく行われない。
https://github.com/treastrain/TRETJapanNFCReader/runs/2511854408?check_suite_focus=true#step:5:47 を見ると

cp: copyFileSync: could not read src file (/home/runner/work/TRETJapanNFCReader/TRETJapanNFCReader/documentation/all.css)

と表示されている。手動で cp -r も試みたが、権限が無いと表示されてコピーできない。
Swift Doc では Docker が使用されている。

ライブラリのローカライズについて About the localization

いつもお世話になっております。

下記の部分についてお伺いできればと思います。

return NSLocalizedString(key, bundle: Bundle.current, comment: "")

こちらのbundle: Bundle.currentの部分を削除してみたら正常に動いているようですが、もともとそれが使われた理由について教えていただけますでしょうか。

何卒よろしくお願い致します。

Question about the e-money ecosystem in Japan

Hi!

With the increased digitization and transfer of value, I'm trying to better understand how various platforms e-money "communicates" with another in Japan. For example, at a single pos terminal, a user can pay with multiple options: Suica, PayPay, LinePay, etc.

How do each of these options "play nice"? Are they separate protocols? Do they follow a single standard? Just encryption passing through nfc?

I apologize in advance for the basic question and if this is the wrong place to ask. I am just trying to learn and understand how these systems work.

Thanks for any help on this topic!

English Please

It's an awesome project but people around the world can not read the README written by Japanese. Please add an English version.

「MIFARE」という表記は正しくない

ICカード運転免許証・マイナンバーカードに関する部分で「MIFARE、MiFare」という表記が用いられているが、MIFARE は ISO/IEC 14443 Type A であり、ICカード運転免許証・マイナンバーカードが準拠しているのは ISO/IEC 14443 Type B ではない。

Cannot decode from JIS X 0208 (with Swift Package Manager)

#24 でも議論されていた、Swift Package Manager から本ライブラリを使用すると発生するローカライズについての問題の解決策を探します。

To find solutions to the issue decoding from JIS X 0208 when using this library from Swift Package Manager discussed in #24 .

Get UID And Serial Number of the NFC Tag iOS

I'm developing an application in which I want to get the NFC serial number and Identifier of a NFC tag. When I press a button, I want the application to find the UID and serial number of the NFC card. The only problem is that I have no idea how to get the UID and and serial number if that's possible on iOS. I m trying to get NFC identifier but i don't know how to get serial number of NFC Tag.

Code:-

class ScanNFCTag: NFCTagReaderSessionDelegate {

import CoreNFC

var session: NFCTagReaderSession?

func scanNFCTag(sender: UIButton!) {
     self.session = NFCTagReaderSession(pollingOption: .iso14443, delegate: self)
     self.session?.alertMessage = "Hold Your Phone Near the NFC Tag"
     self.session?.begin()
}

func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
    print("Session Begin!")
}

func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
    print(error.localizedDescription)
}

func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
    if tags.count > 1{
        session.alertMessage = "More Than One Tag Detected, Please try again"
        session.invalidate()
    }
    
    let tag = tags.first!
    session.connect(to: tag) { (error) in
        if nil != error{
            session.invalidate(errorMessage: error?.localizedDescription ?? "")
        }
        if case let .miFare(sTag) = tag{
            let UID = sTag.identifier.map{ String(format:"%.2hhx", $0)}.joined()
            session.alertMessage = "Successfully linked tag to location"
            session.invalidate()
            DispatchQueue.main.async {
                print("NFC Identifer = ", "\(UID)")
               }
           }
       }
   }
}

Info list:-

https://i.stack.imgur.com/XjINx.png

So, Here is the my code please let me know if i m doing wrong please correct me. Can someone please explain to me how to get serial number and UID of NFC tag,

Any help would be greatly appreciated.

Thanks in advance.

differ Suica and PASMO

Hello. I used your App a lot, and thank you for your work.

Recently, I start to study the Felica data. I have one question about it. Is there a way to tell the kind of IC card by NFC reader? For example, after scanning a Suica card, the program could tell it is a Suica card (not other cards like PASMO). I searched a lot about the IDm, system code, and service code. However, I cannot find a way to differentiate them.

FeliCaCardTransactionについて

いつもありがとうございます。

最新のコミットにFeliCaCardTransactionというクラスが追加されたのですが、こちらは既に利用可能となっておりますでしょうか。可能でしたら使い方についてご教示頂けますでしょうか。
また、不可能な場合はいつ頃の実装完了になりますでしょうか。

お手数をおかけしますが、何卒よろしくお願いいたします。

Info.plist Checker の開発

Core NFC の NFCReaderSession を使用する際には Info.plist に NFCReaderUsageDescriptioncom.apple.developer.nfc.readersession.iso7816.select-identifierscom.apple.developer.nfc.readersession.felica.systemcodes を指定する必要がある。

Info.plist Checker によって、これらのパラメータが設定されていない場合、Debug ビルドにおいてコンソールにその旨を表示する機能を追加する。

Can add a simple example of SwiftUI?

I am learning SwiftUI recently and trying use this library in SwiftUI, Unfortunately, I can't use this library work normally in SwiftUI (UIKit is work perfectly).
Can you add a simple example of SwiftUI, just like UIKit sample in README.md
Thanks so much!!!

DF02/EF01の顔画像について

利用することがないかもしれませんが、顔写真の利用について記載しておきます
画像についてはUIImageVIewに格納できたのでおそらく利用できるかと…

すでに実装されているかもしれませんが、もしよければご参考までに

  //写真データを利用するための準備用
    private func setFaceImage(fImage: Data){

        //データが写真のものであるかタグを確認
        if(fImage[0] != 0x5F && fImage[1] != 0x40){
            print("写真データでないため処理停止")
            return
        }
        
        //バックグラウンドの処理
        DispatchQueue.global().async {
            var length: UInt16
                //逆順にしないと正しくいかない
                let lengthUInt8: [UInt8] = [fImage[3], fImage[4]].reversed()
                length = UnsafePointer(lengthUInt8).withMemoryRebound(to: UInt16.self, capacity: 1){
                    $0.pointee
                }
                print("picture length:" + String(length))
                let Face: Data = fImage[5...(5+length)]
                
                
                //メインスレッドで変更
                DispatchQueue.main.async {                    
                    //型変換
                    self.jpegPic.image = UIImage(data: Face)
                    //非表示
                    self.jpegPic.alpha = 0.0
                    
                    UIView.animate(withDuration: 0.3, animations: {() ->Void in
                        self.jpegPic.alpha = 1.0
                    })
                    print("表示成功!!!")
                }                                           
            }
        }
    }

Testflight Validate: NDEF is disallowed

I am trying to upload my app to TestFlight, which using TRETJapanNFCReader library

Error:

Invalid entitlement for core nfc framework The sdk version 13.0 and min OS version 13.0 are not compatible for the entitlement 'com. Apple developer nfc. Readersession formats because NDEF is disallowed

Xnip2019-09-27_13-37-36

I have tried this solution, but it cannot completely solved [reason]

Any Solution?
Please!

ローカライズの実装方法の思案

ローカライズの実装方法について、議論させてください☺️
下記の方法で、String を extend すると、美しくローカライズできるように思います。

私がざっと見ただけですが、これを利用すると、現状より綺麗になりますでしょうか?

SwiftUI の美しさを生かせるように、ローカライズも綺麗に、直交性高く実装したいと思いまして。

extension String {
  var localized: String {
    return NSLocalizedString(self, comment: "")
  }
}

https://qiita.com/de_kichi/items/b7b12a03871c3f3bb73f

Use in Objective-c project

Hi, looks like it's a great library, and I'd like to import it into my project which is written in Objective-c.
I've imported it via pod, but seems no symbols are accessible from objective-c, am I missing something?

Thanks.

Octopus card Years

Base on the document about Octopus

cards allow a negative balance of up to 50 HKD (previously 35 HKD). This results in the balance being encoded differently.

How do I know when the card was released by programming?

Thanks to your help!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.