最初のiOS 11ベータ版をiPhone 7にインストールしたばかりで、NFCを試すことに興味があります。設定には何もありません。タグの読み方を示すサンプルコードがあるかどうか疑問に思っています。コードスニペットでCore NFC SDKを使用する方法を誰でも示すことができますか?
Apple Developerサイトで、新しいアプリIDを作成し、NFC Tag Reading
有効になっています。
.plistファイルに次の行を追加します。
<key>NFCReaderUsageDescription</key>
<string>NFC Tag!</string>
これらを資格ファイルに追加します。
<key>com.Apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
対応するファイルでは次のようになります。
また、コアNFCはXcodeの[機能]タブで有効にできます。
インポートCoreNFC
#import <CoreNFC/CoreNFC.h>
そしてデリゲートを設定します:
@interface YourViewController : UIViewController <NFCNDEFReaderSessionDelegate>
ViewDidLoadの場合:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NFCNDEFReaderSession *session = [[NFCNDEFReaderSession alloc] initWithDelegate:self queue:dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT) invalidateAfterFirstRead:NO];
[session beginSession];
}
デリゲートコールバックで:
- (void) readerSession:(nonnull NFCNDEFReaderSession *)session didDetectNDEFs:(nonnull NSArray<NFCNDEFMessage *> *)messages {
for (NFCNDEFMessage *message in messages) {
for (NFCNDEFPayload *payload in message.records) {
NSLog(@"Payload data:%@",payload.payload);
}
}
}
didInvalidateWithError
デリゲートコールバックも追加する必要があります。追加しないと、プロトコルに準拠しません。
- (void)readerSession:(nonnull NFCNDEFReaderSession *)session didInvalidateWithError:(nonnull NSError *)error {
}
次の方法でリーダーを停止できます。
[session invalidateSession];
インポートCoreNFC
import CoreNFC
そしてデリゲートを設定します:
class YourViewController: UIViewController, NFCNDEFReaderSessionDelegate
ViewDidLoadの場合:
override func viewDidLoad() {
super.viewDidLoad()
let session = NFCNDEFReaderSession(delegate: self,
queue: DispatchQueue(label: "queueName", attributes: .concurrent), invalidateAfterFirstRead: false)
session?.begin()
}
デリゲートコールバックで:
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
for message in messages {
for record in message.records {
print(record.payload)
}
}
}
次の方法でリーダーを停止できます。
session.invalidateSession
ビューを起動すると、すぐにiOS NFCリーダーダイアログが次のように表示されます。
このダイアログが表示されたら、読みたいNFCタグの近くにiPhoneを1秒ほど置きます。一貫性のある測定値を取得するためにキャンセルして再試行する必要がよくありました 詳細はこちら 。
この問題を修正するには、com.Apple.developer.nfc.readersession.formats
資格ファイルに入力します。キーは、有効なNFSタイプの配列に関連付ける必要があります。たとえば、次のことを試すことができます。
<array>
<string>NDEF</string>
</array>```
It worked for me.
<img src="https://i.stack.imgur.com/I9wHX.png">
2番目のXcodeベータ用に更新
デベロッパーセンターからアプリにNFC機能を追加します。 識別子 ->アプリID-> "NFCタグ読み取り"を有効にします。
プロジェクトにエンタイトルメントファイルがない場合、Xcodeでアクティブ化してからXcode-> Project Targets-> Capabilities内の任意の機能を非アクティブ化することにより、Xcodeに資格ファイルを作成させます。プロジェクトナビゲータに新しい[AppName] .entitlementsファイルがあります。そのファイルを右クリックし、「開く->ソースコード」を選択します。 <dict></dict>
の間に次のエントリを手動で入力します。
<key>com.Apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
Xcode 9がNFC Capabilities selectionからのタグ読み取りを有効にするとすぐに、このステップを無効にする必要があるため、このステップは廃止されます。現在の(最初の)ベータバージョンはこれをサポートしません。
IOSがユーザーに表示するプライバシー警告の使用法の説明も入力する必要があります。 (現時点(ベータ1)で、デバイスのスキャン準備が整ったときにこの警告が表示され、このメッセージを含むネイティブシステムダイアログが表示されます。ただし、これは未処理のようです。)ターゲットのInfo.plistを開いて入力を開始します「Privacy」を選択すると、「Privacy-NFC Usage Description」までスクロールダウンしてReturnキーを押して選択できます。右側の列にユーザーにわかりやすい説明を入力します。
これで、SwiftでCoreNFCをインポートできるはずです。
import CoreNFC
次に、Appleの ドキュメント に進みます。
重要:コンパイラーが ベータ2には、この問題はもうありません。ただし、実際のテストには、iPhone 7/p形式の実際のハードウェアが必要です。No such module 'CoreNFC'
でエラーを返す場合、シミュレーターではなく、ビルドする実際のiOS 11デバイスを選択したかどうかを確認します。また、iPhone 7または7 plusでなければなりません。これは将来のバージョンで変更される可能性がありますが、テストNFCは実際のハードウェアでのみ完全に機能します。(cp。シミュレータで実行できるが、実際の機能をテストできないコアBluetooth)
以前の回答を充実させるために、特にNFCNDEFReaderSession
クラスに関するこれらの考慮事項に留意することが重要です。
com.Apple.developer.nfc.readersession.formats
"資格が必要です。さらに、アプリケーションのInfo.plist
には、空ではない使用法の説明文字列。-beginSession
が呼び出されてセッションの開始を通知すると、モーダルシステムUIが表示されます;セッションがユーザーまたは呼び出しによって無効化されると、UIシートは自動的に閉じられます-invalidateSession
。-beginSession
が呼び出された後、60秒の時間制限制限があります。制限時間に達すると、-readerSession:didInvalidateWithError:
はNFCReaderSessionInvalidationErrorSessionTimeout
エラーを返します。-readerSession:didInvalidateWithError:
によって新しいリーダーセッションが開始されると、-beginSession
はNFCReaderSessionInvalidationErrorSystemIsBusy
を返します。-readerSession:didInvalidateWithError:
はNFCReaderSessionInvalidationErrorUserCanceled
を返します。-readerSession:didInvalidateWithError:
は、クライアントアプリケーションがバックグラウンド状態になったときにNFCReaderSessionInvalidationErrorSessionTerminatedUnexpectedly
を返します。 -readerSession:didInvalidateWithError:
は、のときにNFCReaderErrorUnsupportedFeature
を返します。使用法の説明が適切であることを確認し、Apple Developer Center。私の経験に基づいたチュートリアルがあります(Swift 4ベース)のアプリに機能を追加する必要があります。ここにあります: Core NFC Tutorial
私の2セント:
1)xcode 9.0(beta 4 9M189t)で、既に機能を追加している場合、手動で追加する必要はありません:
<key>com.Apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
自動的に行われます
2)iPhone 7を使用していなくてもクラッシュしないORシミュレーターを使用している場合:
次のように呼び出されます。
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print(error.localizedDescription)
}
「サポートされていない機能」と表示されます
3)お見逃しなく:
self.nfcSession?.begin() // will trigger callback
そう:
final private func setup(){
self.nfcSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
self.nfcSession?.alertMessage = "Put your NFC TAG over iPhone.."
self.nfcSession?.begin() // will trigger callback
}
4)ユーザーがキャンセルした場合、以下が得られます:
「セッションはユーザーのキャンセルにより無効になります」
didInvalidateWithErrorコールバック。
Core NFCこれらの回答のリソースを使用してプロジェクトに追加しました。ただし、エンタイトルメントを介して手動で機能を追加しても、Xcodeは表示されないこれはおそらく、Xcode 9 Beta 1が多くの人のサンプルプロジェクトの機能スイッチとしてCore NFCを持たないためです。まだ問題が発生している場合は、少なくとも1つの他の機能をオンにします!これを行うまで、予期しない終了エラーがすぐに返されます。
私はこれをコメントとして残しますが、まだそうするほどの評判はありません。これは十分に重要であると考えられました。