iOS 11 CoreNFC如何检查设备是否具有NFC功能?

13

如何检测iPhone是否具有使用核心NFC框架提供的NFC芯片的功能?

我知道现在它只适用于iPhone 7和7 Plus,但我不想硬编码硬件字符串标识符,因为我不知道未来会出现什么设备。


https://developer.apple.com/documentation/corenfc/nfcndefreadersession/2915854-readingavailable - Paulw11
@Paulw11 哇,真不敢相信我错过了那个。我猜那是在后来的测试版中添加的?我记得在它被宣布时那里没有这个功能。请把它放在一个答案中。 - SolidSnake4444
4个回答

22
您可以使用 readingAvailable 类属性:
if NFCNDEFReaderSession.readingAvailable {
    // Set up the NFC session
} else {
    // Provide fallback option
}

已在iPhone 7 Plus和iPhone 6S上进行了测试,其中7显示了NFC按钮,而6S没有。 - SolidSnake4444
如果我只使用上面的代码块,它将对iPhone 7返回false。=/ 我需要做更多的事情吗? - iadcialim24
这对我的iPhone 11也返回false。 - Benjamin B.
也在 iPhone 12 上返回false,这已通过快捷指令应用程序确认读取NFC标签(确认方法为:->自动化->创建个人自动化->NFC->扫描)。 - DoruChidean
为了使其正常工作,您还需要启用NFC标签读取功能。 - DoruChidean
显示剩余2条评论

10

iOS 12更新:

1) 如果您希望仅在iPhone 7及更高型号上运行应用程序,您可以在 Info.plist 中添加NFC要求:

<key>UIRequiredDeviceCapabilities</key>
    <array>
        // ... your restrictions
        <string>nfc</string>
    </array>

这个需求只有带有NFC的设备才能从App Store下载我们的应用程序。

2) 对于早于iPhone 7的iPhone和支持iPad,您还必须检查是否可用Core NFC,因为这些设备未包括它。这就是为什么您应该使用弱链接链接Core NFC框架:

Core NFC框架的弱链接

然后在代码中检查Core NFC的可用性:

var isNFCAvailable: Bool {
    if NSClassFromString("NFCNDEFReaderSession") == nil { return false }
    return NFCNDEFReaderSession.readingAvailable
}

如果isNFCAvailable返回true,那么您可以使用由Core NFC提供的所有API而不用担心应用程序崩溃。

4

还需要检查iOS < 11.0的设备,例如iPhone 5

import CoreNFC
.
.
// Check if NFC supported
if #available(iOS 11.0, *) {
   if NFCNDEFReaderSession.readingAvailable {
      // available  
   }
   else {
     // not
   }
} else {
  //iOS don't support
}

-2

这个问题是关于基于代码的解决方案,允许用户在他们的代码中检查设备是否支持 NFC。这使得它具有未来性,您不必更改代码以支持或删除设备。 - SolidSnake4444
原始问题对我来说没有意义,因为具有 NFC 功能的应用程序会拒绝安装,如果设备没有 NFC 功能。所以您会看到通知。安装和执行另一个代码来查看另一个通知是没有意义的。 - tontonCD
1
这个问题是在将近5年前提出的,当时有一些设备可以运行iOS 11,并且可以使用一个可以打开和关闭NFC访问权限的应用程序。这在今天仍然适用于iPad、Mac和iOS混合应用程序。此外,您可以在非NFC手机上安装NFC应用程序,除非开发人员说明该应用程序应该限制为仅支持NFC手机。如果开发人员没有限制,它可以被安装在非NFC手机上。 - SolidSnake4444
好的,信息很不错。 - tontonCD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接