如何在核心NFC中获取标签标识符

时间:2017-08-29 18:55:07

标签: ios swift core-nfc

如何使用Core NFC获取NFC标签的ID(而不是消息有效负载的ID)?

我正在寻找与Android中存在的此功能类似的内容:https://developer.android.com/reference/android/nfc/Tag.html#getId()

2 个答案:

答案 0 :(得分:2)

使用_foundTags 导致拒绝:

  

1.2二进制被拒绝

     

准则2.5.1 - 性能 - 软件要求

     

您的应用使用或引用了以下非公开API:

     

_foundTags

     

App Store上不允许使用非公共API,因为   如果这些API发生变化,它可能会导致糟糕的用户体验。

     

在未来的提交中继续使用或隐藏非公共API   此应用程序可能会导致Apple Developer终止   帐户,以及从App Store删除所有相关应用程序。

     

后续步骤

     

如果您使用的是第三方库,请尽快更新   这些库的最新版本。如果您没有访问权限   库'来源,您可以使用搜索已编译的二进制文件   "字符串"或" otool"命令行工具。 "字符串"工具可以   输出库调用的方法列表和" otool -ov"   将输出Objective-C类结构及其定义的结构   方法。这些工具可以帮助您缩小问题所在   代码驻留。您也可以使用" nm"用于验证是否有任何工具   第三方库正在调用这些API。

     

资源

     

有关" nm"的信息工具,请查看" nm工具" Xcode中   手册页。

     

如果没有提供应用功能的替代方案   要求,您可以提交增强请求。

答案 1 :(得分:0)

以下是如何实现它的方法。 但请记住,它使用的是私有函数,可以随时由Apple删除/更改,并可能导致AppStore拒绝。

在我的应用程序中测试过,它现在适用于iOs 11.1

消息来源:

https://github.com/hansemannn/iOS11-NFC-Example/issues/16

https://github.com/chariotsolutions/phonegap-nfc/pull/287/files#diff-84fad93feff6a327c30a08cac8f546dfR171

        func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
            let uid : String = getTagIdFromSession(session: session)
            //Do what you want with the UID

        }


        func getTagIdFromSession(session : NFCNDEFReaderSession) -> String{
            var uid: String = ""
            if(session.value(forKey: "_foundTags") != nil) {
                let foundTags : NSArray = session.value(forKey: "_foundTags") as! NSArray
                if(foundTags.count > 0) {
                    let tag : NSObject = foundTags.firstObject  as! NSObject;
                    if(tag.value(forKey: "_tagID") != nil) {
                        var uuidPadded : Data = tag.value(forKey: "_tagID") as! Data
                        //We reverse the order
                        for (i,_) in uuidPadded.enumerated() {
                            uuidPadded.insert(uuidPadded.remove(at:i),at:0)
                        }
                        for (_, element) in uuidPadded.enumerated() {
                            let tag : String = String(element, radix:16)
                            //We add the missing 0 in case the number is < 10. It can be done with bitwise operations too.  
                            if(tag.length < 2) {
                                uid.append("0"+tag)
                            }
                            else {
                                uid.append(tag)
                            }


                        }
                    }
                }
            }
            return uid;
        }