🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NFC

無線通信

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

3816閲覧

NFCのタグ接続時のエラー原因について

terater

総合スコア9

NFC

無線通信

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/12/23 07:16

前提・実現したいこと

参照HPに基づきSwiftで運転免許読取の試作をしています。
しかし試しに実行すると、
タグの接続時にエラーメッセージが発生しました。

エラー発生の行
session.connect(to: tag) { (error) in

原因や解決方法はなんでしょうか。

またエラーメッセージに関わるドキュメントがありましたら、
ご案内いただけますとありがたいです。

下記のドキュメントを確認はしましたが、
お恥ずかしながらエラーの意味もよく理解できていません。
(メモリ関係なのかなと、イメージしているぐらいです。)
https://developer.apple.com/documentation/corenfc/nfctagreadersession/3281996-connect

[コード参照元]
https://qiita.com/treastrain/items/58e69a1d82dccde48770

発生している問題・エラーメッセージ

2020-12-23 15:01:11.902720+0900 driverLicenceReader[320:6692] [CoreNFC] 00000002 811520a0 -[NFCTagReaderSession _connectTag:error:]:621 Error Domain=NFCError Code=100 "Stack Error" UserInfo={NSLocalizedDescription=Stack Error, NSUnderlyingError=0x282d17780 {Error Domain=nfcd Code=15 "Stack Error" UserInfo={NSLocalizedDescription=Stack Error}}} NFCReaderError Session invalidated by user

該当のソースコード

Swift

1import UIKit 2import CoreNFC 3 4class ViewController: UIViewController ,NFCTagReaderSessionDelegate{ 5 6 var session: NFCTagReaderSession? 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view. 11 12 guard NFCTagReaderSession.readingAvailable else{ 13 print("NFC タグ非対応") 14 return 15 } 16 17 self.session = NFCTagReaderSession(pollingOption: .iso14443, delegate: self) 18 self.session?.alertMessage = "運転免許証の上にiPhoneの上部を載せてください" 19 self.session?.begin() 20 } 21 22 func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) { 23 print("tagReaderSesssionDidBecomeActive") 24 } 25 26 func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) { 27 let readerError = error as! NFCReaderError 28 print(readerError.code,readerError.localizedDescription) 29 } 30 31 func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) { 32 print("tagReaderSession(_:didDetect") 33 34 let tag = tags.first! 35 session.connect(to: tag) { (error) in 36 if let error = error { 37 session.invalidate(errorMessage: error.localizedDescription) 38 return 39 } 40 } 41 } 42} 43 44

試したこと

StackErrorやエラーメッセージのCode番号でWeb等検索を実施しましたが、
原因や適切な解決方法が見つけられませんでした。

補足情報(FW/ツールのバージョンなど)

(開発環境)
macOS Catalina 10.15.7
Xcode Version12.2(12B45b)
(実行環境)
iphone7 14.2(18B92)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/12/23 07:56

よくわかりませんが、参照先 (ライブラリを使わずに〜) のソースをそのまま試してる感じでしょうか? 先に前回の記事 (ライブラリを使って) を試した方がいいのでは? また、免許証は暗証番号を間違えると面倒くさそうなので、まず別のもの (SUICA など) で試した方がいいかもしれません。
terater

2020/12/23 08:58

解説にそって、処理順にコードを書いて(写して)、随時実行して動きをみている感じです。原因がわかるまでは、他のものもためしてみます。
terater

2020/12/23 11:13

参照先 (ライブラリを使わずに〜) のソースをそのままコピペして実行しましたが、やはり同様のエラーになりました。ライブラリを使ってを試そうとしたのですが、「Carthage」などの導入が必要とのことです。前に導入を試みましたがこちらもエラーが発生し、先に進めない状況です。(前に質問したのですが、回答が付かずお手上げ状況です。)
hoshi-takanori

2020/12/23 19:39

Carthage は昔使ってましたが、確かに面倒くさかった記憶があります。CocoaPods の方が楽な気がしますし、teratail でも CocoaPods を使ってる (そしてうまくいかなくて質問する) 人が多いですが、初心者には敷居が高いのは確かでしょうね。(尤も、免許証の読み取り自体、初心者向けではないような…。) 参照先 (ライブラリを使わずに〜) のソースですが、ソースコード以外にいくつか設定が必要で、それは前回の記事 (ライブラリを使って) の方にしか書いてなかったりします。具体的には、 ・Capability と Entitlements の設定 ・Info.plist の設定 ですね。(免許証が読み取れなくなると困るので、試してませんが…。) それでは、がんばってください。
TsukubaDepot

2020/12/24 01:07

Swiftで記述されたNFCリーダのサンプルであれば https://github.com/treastrain/TRETJapanNFCReader がよくできていますし、サンプルもありますし、説明も丁寧なので、こちらで試されてみるのがいいかもしれません。そもそも日本規格向けにチューニングされていますので、あまり余計なことを考える必要もありません。
guest

回答1

0

ベストアンサー

結果からですが、ご提示のコードで読み込ませることは可能です。

ただし、かなり読み取り条件がシビアな感じです。

iPhone X の場合ですが、「免許証の下半分だけを iPhone の下にかざす」必要があります。
感じとしては、有効期限より下の部分だけ iPhone に密着させる、という感じです。

それ以外の条件、たとえば免許証全てを iPhone に密着させるなどすると、残念ながら読み取りが正しく行えない、あるいは読み込みに30秒近くかかってしまうことがあるようです。

厳密に「下半分だけ」密着させると、1.3秒くらいで読み込ませることが可能ですし、まず間違いなく読み込ませることが可能です。

Stack Error の原因ですが、これはあくまでも推測ですが、読み取り中に免許証を動かすなど、読み取り動作を不安定にさせると発生することが多いようです。

なので、まずは「免許証の下半分だけ」を読み込ませるようにして試されてみるのが良いかと思います。


追記

「マイナポータル」アプリで読み取りの方法が出ていたのを思い出したので、スクリーンショットを撮ってみました。

イメージ説明

あくまでもマイナンバーカードですが、やはり読み取り位置について厳密に従う必要があります。

また、機種ごとによって最適な読み取り位置も違うようです。

上記のページの下部に記載がありますが、センチメートル単位で読み取り位置の指示があります。
この指示に従わないとうまく読み取れないようです。

投稿2020/12/25 23:20

編集2020/12/25 23:28
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

terater

2020/12/26 02:37

ご回答ありがとうございます。 AppStoreで公開されている読み取りアプリを試しましたが 「Suica」や「マイナンバーカード」は読み込めましたが運転免許証はNGでした (コメントで提示いただいてる、参考ページのソースをビルドしてもNGでした) 別のAndroid版公開アプリでは読み込めたので、運転免許証側の問題ではなさそうです そのため端末問題(iPhone 7)の可能性もあります。 (本当にこの読取精度だった場合は、使いものにならないですね。。。) 周りにiphone持っている人がいないので確認は年明けになってしまいますが、 大変助かりました。 当面は他の方にアドバイスいただきました通り、 別のICカード試してみます。
TsukubaDepot

2020/12/26 03:15

https://apps.apple.com/jp/app/id1480265213#see-all/reviews たとえば、上記アプリのコメントをみていくと、iPhone7 系だと読み取りがかなりシビアだというコメントが多く見受けられますし、開発者側もそれは認識されているようです。 IC タグ系だと、チップというより、おそらくアンテナ側(本体)の問題が大きいのではないでしょうか。 改札のようにタッチ部分に大きなコイルアンテナを置ける機械であれば読み取り精度もかなり柔軟だと思いますが、スマホのように金属筐体、狭い実装面積にコイルアンテナを内蔵するとなると、読み取り精度もかなりシビアにならざるを得ない状況はあると思います。
dodox86

2020/12/26 03:46

興味深いですね。質問者さんが試されたときに運転免許証はOK、マイナンバーカードはNG(が多い)ということで、それぞれに搭載されているNFCチップとアンテナの性能も関係しているかもしれません。これらはSuicaとは違うNFC Type-Bのものですが、チップの型番やアンテナの製品型番が違う可能性もあります。また、発行時期、ロットで、ICタグ側のファームウェアを含め、違う可能性がないとも限りません。不確かな情報ですが、運転免許証に至ってはマイナンバーカードより歴史が若干長いせいもあるのか、カードのOSも違う場合があるとどこかで読んだ覚えがあります。(私自身、うろ覚え、不確かなので、その程度の情報とお受け取りください)横から失礼しました。
TsukubaDepot

2020/12/26 03:52

dodox86 さん 有益な情報、ありがとうございます。 そういう特徴がある、ということを知っておく、あるいはそれらの知見を踏まえた上で、 UIなどで「なるべく適切に読み取れるようにするにはこのようにする」と誘導することは重要だと思いますので、今回のようなご指摘な大変重要だと思います。 これこそ横道にそれますが、クレカに搭載のタグも NFC のようですが、これもまた読み取り精度が甘いように感じる時があります。レジのリーダに書かれている枠内にきちんと合わせてあげないと読み込んでくれないことが多いように感じています。読み取りスピードも遅そうですし...
dodox86

2020/12/26 04:48

ありがとうございます。NFC関連は実践の情報が少ないので興味深く拝見させてもらっています。よくある新型iPhoneのハードウェア御開帳記事で、機種ごとのNFCリーダーライターチップの位置を把握しておくことは読み取り精度を上げることにつながりそうです。あわせて、運転免許証とマイナンバーカードでのNFCチップの挟んでいる位置も。(光に透かしてみると分かります)電波やアンテナ特性があるので、必ずしもチップやアンテナの真上が良いとも限らなかったはずで、非接触型ICカードは難しくも面白いです。
terater

2021/01/11 12:18

iPhone11とiPhone8の実機でサンプルコードを試したところ動きました。そのため、端末側の問題のようでした。(iPhone 7が問題なのか、持っている端末が問題なのかはわかりませんでしたが。)一人で行っていたら間違いなく迷宮入りしているところでした。ご回答感謝いたします。NFCが使えるといわれていた機種で使えないとなると、つらいですね。Andoroid機種は全部は確認できないですし、コメントでいただいた(ICカード側も含め)チップ性能等迄考えだしたらもうお手上げです…。
TsukubaDepot

2021/01/11 12:23

問題の切り分けはなかなか大変だと思いますが、とりあえず動くケースを発見できたのは良かったのではないかと思います。 dodox86さんのコメントも参考に、NFCに関連した各種カードを光で透かしてみましたが、ご指摘の通りカードの種類によって埋め込まれたタグの位置も異なっていました。このことも考えると機種ごとに最適な使い方を考える必要があるのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問