iOS 11核心NFC - 任何示例代码?

时间:2017-06-06 02:08:37

标签: ios nfc beta core-nfc

我刚刚在iPhone 7上安装了第一个iOS 11测试版,并且对尝试NFC感兴趣。在设置中没有任何关于它。我想知道是否有任何示例代码显示如何读取标记。任何人都可以在代码片段中展示如何使用Core NFC SDK吗?

7 个答案:

答案 0 :(得分:28)

在Apple Developer网站中,创建一个新的App ID并确保已启用NFC Tag Reading

Dev portal capabilities

将以下行添加到.plist文件中:

<key>NFCReaderUsageDescription</key>
<string>NFC Tag!</string>

以及权利文件:

<key>com.apple.developer.nfc.readersession.formats</key>
    <array>
        <string>NDEF</string>
    </array>

它应该在相应的文件中看起来像这样:

enter image description here

还可以通过Xcode中的功能选项卡启用Core NFC。

enter image description here

目标c

导入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];

Swift 3/4

导入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阅读器对话框,如下所示:

iOS NFC reader dialog

一旦出现此对话框,您将有大约一秒钟将iPhone放置在您想要阅读的NFC标签附近。否则,该字段被停用(这似乎是苹果公司的一个错误)。我经常需要取消并重试以获得一致的读数。 More details here

答案 1 :(得分:4)

要解决此问题,您应该在权利文件中添加constructor(props, context) { super(props, context); this.swipeConfig = Object.assign(swipeConfig, props.config); } componentWillReceiveProps(props) { this.swipeConfig = Object.assign(swipeConfig, props.config); } componentWillMount() { const responderEnd = this._handlePanResponderEnd.bind(this); const shouldSetResponder = this._handleShouldSetPanResponder.bind(this); this._panResponder = PanResponder.create({ //stop JS beautify collapse onStartShouldSetPanResponder: shouldSetResponder, onMoveShouldSetPanResponder: shouldSetResponder, onPanResponderRelease: responderEnd, onPanResponderTerminate: responderEnd }); } _handleShouldSetPanResponder(evt, gestureState) { return evt.nativeEvent.touches.length === 1 && !this._gestureIsClick(gestureState); } _gestureIsClick(gestureState) { return Math.abs(gestureState.dx) < 5 && Math.abs(gestureState.dy) < 5; } _handlePanResponderEnd(evt, gestureState) { const swipeDirection = this._getSwipeDirection(gestureState); this._triggerSwipeHandlers(swipeDirection, gestureState); } _triggerSwipeHandlers(swipeDirection, gestureState) { const {onSwipe, onSwipeUp, onSwipeDown, onSwipeLeft, onSwipeRight} = this.props; const {SWIPE_LEFT, SWIPE_RIGHT, SWIPE_UP, SWIPE_DOWN} = swipeDirections; onSwipe && onSwipe(swipeDirection, gestureState); switch (swipeDirection) { case SWIPE_LEFT: onSwipeLeft && onSwipeLeft(gestureState); break; case SWIPE_RIGHT: onSwipeRight && onSwipeRight(gestureState); break; case SWIPE_UP: onSwipeUp && onSwipeUp(gestureState); break; case SWIPE_DOWN: onSwipeDown && onSwipeDown(gestureState); break; } } _getSwipeDirection(gestureState) { const {SWIPE_LEFT, SWIPE_RIGHT, SWIPE_UP, SWIPE_DOWN} = swipeDirections; const {dx, dy} = gestureState; if (this._isValidHorizontalSwipe(gestureState)) { return (dx > 0) ? SWIPE_RIGHT : SWIPE_LEFT; } else if (this._isValidVerticalSwipe(gestureState)) { return (dy > 0) ? SWIPE_DOWN : SWIPE_UP; } return null; } _isValidHorizontalSwipe(gestureState) { const {vx, dy} = gestureState; const {velocityThreshold, directionalOffsetThreshold} = this.swipeConfig; return isValidSwipe(vx, velocityThreshold, dy, directionalOffsetThreshold); } _isValidVerticalSwipe(gestureState) { const {vy, dx} = gestureState; const {velocityThreshold, directionalOffsetThreshold} = this.swipeConfig; return isValidSwipe(vy, velocityThreshold, dx, directionalOffsetThreshold); } render() { return (<View {...this.props} {...this._panResponder.panHandlers}/>); } }; 密钥。密钥应与已启用的nfs类型数组相关联。 例如,您可以将其添加到权利中。

com.apple.developer.nfc.readersession.formats

它对我有用。

答案 2 :(得分:4)

针对第二个Xcode测试版进行了更新。

从开发人员中心向您的应用添加NFC功能。 Identifiers - &gt;应用ID - &gt;启用“NFC标签阅读”。

如果您的项目没有授权文件,请让Xcode通过激活然后随后停用Xcode中的任何功能为您创建一个 - &gt;项目目标 - &gt;能力。您将在项目导航器中找到新的[AppName] .entitlements文件。右键单击该文件,然后选择“打开为 - &gt;源代码”。在<dict></dict>

之间手动输入以下条目
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
    <string>NDEF</string>
</array>

只要Xcode 9允许从功能选择启用NFC标签读取,此步骤就会过时,因为您只需要在那里启用它。当前(第一个)Beta版本不支持此功能。

您还需要输入iOS将向用户显示的隐私警告的使用说明。 (目前(测试版1),当设备准备好扫描时,将显示此警告,并显示包含此消息的本机系统对话框。但是,这似乎是未完成的。)打开目标的Info.plist并开始输入“隐私”,您可以向下滚动到“隐私 - NFC使用说明”,通过点击返回选择它。在右栏中为您的用户输入有意义的解释。

现在你应该能够在Swift中导入CoreNFC:

import CoreNFC

然后转到Apple的documentation

重要:如果编译器返回No such module 'CoreNFC'错误,请检查您是否选择了要构建的实际iOS 11设备,而不是模拟器。它也必须是iPhone 7或7 plus。这可能会在未来版本中发生变化,但测试NFC将只能与实际硬件完全兼容。 (cp。核心蓝牙,您可以在模拟器上运行,但不测试实际功能。) Beta 2不再有此问题。但是,实际测试仍然需要iPhone 7 / p形式的实际硬件。

答案 3 :(得分:3)

为了丰富以前的答案,重要的是要牢记这些NFCNDEFReaderSession类的注意事项:

  • 用于处理NFC数据交换格式(NDEF)标记的读者会话。此会话需要&#34; com.apple.developer.nfc.readersession.formats&#34;您的过程中的权利。此外,您的应用程序Info.plist必须包含非空用法说明字符串。
  • NDEF阅读器会话将自动扫描并检测NFC论坛 包含有效NDEF消息的标记。 NFC论坛标记类型1到5 支持NDEF格式的。将出现模态系统UI 一旦-beginSession被调用以通知会话开始;该 会话失效时,UI工作表将自动关闭 由用户或致电-invalidateSession
  • -beginSession被调用后,打开的会话有 60秒的时间限制限制;达到时间限制后,-readerSession:didInvalidateWithError:将返回NFCReaderSessionInvalidationErrorSessionTimeout错误。
  • 系统中只允许1个有效的读者会话;当有活跃的读者会话时-readerSession:didInvalidateWithError:启动新的读者会话时,NFCReaderSessionInvalidationErrorSystemIsBusy将返回-beginSession
  • 当用户点击用户界面上的完成按钮时,
  • -readerSession:didInvalidateWithError:将返回NFCReaderSessionInvalidationErrorUserCanceled
  • 当客户端应用程序进入后台状态时,
  • -readerSession:didInvalidateWithError:将返回NFCReaderSessionInvalidationErrorSessionTerminatedUnexpectedly -readerSession:didInvalidateWithError:何时会返回NFCReaderErrorUnsupportedFeature
    1. 读卡器模式功能在硬件上不可用
    2. 客户端应用程序没有所需的权利。

答案 4 :(得分:1)

您需要确保使用说明,并将功能添加到Apple开发人员中心内的应用程序中。 我有一个基于我的经验的教程(基于Swift 4)。它可以在这里找到:Core NFC Tutorial

答案 5 :(得分:0)

我使用这些答案中的资源将Core NFC添加到项目中。还有一点没有注意到,即使您通过权利手动添加功能,Xcode似乎也不会查看该文件,除非您启用了该功能。这可能是由于Xcode 9 Beta 1没有Core NFC作为许多人的示例项目的功能切换。因此,如果您仍然遇到问题,请确保至少启用其他一项功能!我看到一个意外的终止错误立即返回,直到我这样做。

我会将此作为评论,因为它属于,但没有足够的声誉尚未这样做。认为这很重要,值得注意。

答案 6 :(得分:0)

我的两分钱:

1)在xcode 9.0(beta 4 9M189t)下,如果你已经添加了功能, 无需手动添加:

<key>com.apple.developer.nfc.readersession.formats</key>
    <array>
        <string>NDEF</string>
    </array>

自动完成

2)如果不使用iPhone 7就没有崩溃,或者你在模拟器中:

你将被召入:

func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
        print(error.localizedDescription)
    }

它会显示: &#34;功能不受支持&#34;

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)如果用户取消,您将获得:

&#34;会话因用户取消&#34;

而失效

在didInvalidateWithError回调中。