配置 NFC 读取

扫描或停止扫描 NFC(近场通信)标签。

选项 

  • 操作”指定是开始(读取)还是停止(取消)扫描 NFC 标签。

以下选项仅用于读取

  • 脚本”指定在读取标签、发生错误、用户取消操作或使用“取消”选项的另一个“配置 NFC”脚本步骤取消操作时要运行的脚本。

  • 参数”(可选)指定脚本的脚本参数。

  • 超时”(可选)会在指定的秒数后自动取消读取操作。

  • 持续读取”(可选)如果该值不为零,则将脚本步骤设置为读取标签,直到用户点击“取消”按钮、达到超时参数指定的值或者操作系统规定的时间限制为止。如果此选项为零或未指定,则仅读取一个标签。

  • 将结果格式化为 JSON(可选)如果该值不为零,这会引起脚本接收 NFC 标签数据作为 JSON 对象。如果此选项为零或未指定,则会接收多行字符串数据。

兼容性 

产品 是否支持
FileMaker Pro
FileMaker Go
FileMaker WebDirect
FileMaker Server
FileMaker Cloud
FileMaker Data API
自定义 Web 发布

原始版本 

19.0

说明 

使用此脚本步骤扫描或停止扫描使用少量数据编程的 NFC 标签。NFC 标签中数据通常是使用 http、tel、fmp 和 mailto 等协议的 URL。

必须在“脚本”选项指定的脚本中调用 Get (脚本参数)函数,以返回 NFC 标签的数据。根据“将结果格式化为 JSON”的设置,NFC 标签数据将作为 JSON 对象或多行字符串返回。

下表说明 JSON 对象中的每个元素和多行字符串的每一行。有关 NFC 参数的更多信息,请参见 NFC 数据交换格式 (NDEF) 规范。

JSON 元素

字符串行号

说明

action

1

调用脚本的原因。返回:

  • TagRead,如果已读取 NFC 标签

  • CanceledByUser,如果用户点击“取消”按钮

  • CanceledByError,如果发生错误

error

2

错误字符串

parameter

3

“指定脚本”对话框中指定的可选脚本参数

payloadCount

4

从标签读取的 NFC 记录数量

payloads -

JSON 中以下行的对象数组,每条 NFC 记录一行。在多行字符串中,行 5 至 8 对每条 NFC 记录重复。

identifier

5

NFC 记录的标识符

primary

6

作为字符串的 NFC 记录的有效负载

type

7

NFC 记录的类型

typeNameFormat

8

NFC 记录的类型名称格式

secondary - 存在的其他有效负载信息(仅限 JSON)

这是作为 JSON 对象的 NFC 标签数据示例:

复制
{
  "action" :"TagRead",
  "error" : "",
  "parameter" :"Optional script parameter",
  "payloadCount" :2,
  "payloads" :
  [
    {
      "identifier" : "",
      "primary" :"This is the content from the NFC card.",
      "secondary" : "en",
      "type" :"T",
      "typeNameFormat" :1
    },
    {
      "identifier" : "",
      "primary" : "https://example.com",
      "secondary" : "",
      "type" :"U",
      "typeNameFormat" :1
    }
  ]
}


下面是作为多行字符串的相同 NFC 标签数据:

复制
TagRead

Optional script parameter
2

This is the content from the NFC card.
T
1

https://example.com
U
1

注释 

  • 同一时间只能进行一次读取操作。如果在执行取消操作时正在进行读取操作,则取消读取操作。

  • 打开 URL 脚本步骤可用于打开 URL,例如从读取 NFC 标签获取的 URL。

示例 1

启动单个 NFC 标签的读取,并在达到 NFC::Timeout 字段中指定的超时值后停止。读取标签后,将在“解析结果”子脚本指定的字段中设置标签中的数据,该结果将从“扫描一次完成”子脚本中调用。

主脚本:扫描一次

复制
转到布局 [ "NFC Tag" ; Animation:None ]
配置 NFC 读取 [ 操作:读取 ; 脚本:"扫描一次完成" ; 参数:"The current date and time is " & Get ( 当前系统时间 ) ; 超时:NFC::Timeout ; 将结果格式化为 JSON:1 ]

子脚本 1:扫描一次完成

复制
设置变量[ $scriptParam ; 值:Get ( 脚本参数 ) ]
执行脚本 [指定:来自列表 ; "解析结果" ; 参数: $scriptParam ]
显示自定义对话框: [ "NFC 搜索完成" ; $scriptParam ]

子脚本 2:解析结果

由于将结果格式化为 JSON 在“扫描一次”脚本的“配置 NFC 读取”脚本步骤中设置为非零值,因此“解析结果”脚本会将标签数据解析为 JSON 对象。

复制
新建记录/请求
设置字段 [ NFC::Text ; Get ( 脚本参数 ) ]
设置字段 [ NFC::Tag ; JSONGetElement ( NFC::Text ; "payloads[0].primary" ) ]
设置字段 [ NFC::PayloadCount ; JSONGetElement ( NFC::Text ; "payloadCount" ) ]
设置字段 [ NFC::Result ; JSONGetElement ( NFC::Text ; "action" ) & JSONGetElement ( NFC::Text ; "error" ) ]
设置字段 [ NFC::ReadTimestamp ; Get ( 当前系统时间 ) ]
设置字段 [ NFC::ID ; JSONGetElement ( NFC::Text ; "payloads[0].identifier" ) ]
设置字段 [ NFC::Type ; JSONGetElement ( NFC::Text ; "payloads[0].type" ) ]
提交记录/请求 [ 包括对话框:关闭 ]


如果您想使用多行字符串,请将将结果格式化为 JSON 选项设置为零。然后将“解析结果”脚本更改为以下内容:

复制
新建记录/请求
设置字段 [ NFC::Text ; Get ( 脚本参数 ) ]
设置字段 [ NFC::Tag ; GetValue ( NFC::Text ; 6 ) ]
设置字段 [ NFC::PayloadCount ; GetValue ( NFC::Text ; 4 ) ]
设置字段 [ NFC::Result ; GetValue ( NFC::Text ; 1) & GetValue ( NFC::Text ; 2 ) ]
设置字段 [ NFC::ReadTimestamp ; Get ( 当前系统时间 ) ]
设置字段 [ NFC::ID ; GetValue ( NFC::Text ; 5) ]
设置字段 [ NFC::Type ; GetValue ( NFC::Text ; 7) ]
提交记录/请求 [ 包括对话框:关闭 ]

示例 2 

启动多个 NFC 标签的读取,并在达到 NFC::Timeout 字段中指定的超时值或取消扫描时停止。读取标签时将在“解析结果”子脚本指定的字段中设置标签中的数据(请参阅示例 1)。

主脚本:扫描多次

复制
配置 NFC 读取 [ 操作:读取 ; 脚本:"解析结果" ;参数:"扫描开始于 " & Get ( 当前系统时间 ) ; 超时:NFC::Timeout ; 持续读取:1 ; 将结果格式化为 JSON:1] 
转到布局 [ "NFC 扫描列表"; 动画:无 ]

示例 3 

如果 NFC 记录为“U”(表示有效负载为 URL),则发起标签读取并尝试打开 URL。在达到 NFC::Timeout 字段中指定的超时值或取消扫描时停止扫描。读取标签后将在“解析结果”子脚本指定的字段中设置标签中的数据(请参阅示例 1),该结果将从“通过扫描打开”子脚本中调用。

主脚本:扫描并打开

复制
配置 NFC 读取 [ 操作:读取 ; 脚本:"通过扫描打开" ; 参数:"扫描开始于 " & Get ( 当前系统时间 ) ; 超时:NFC::Timeout ; 将结果格式化为 JSON:1 ] 
转到布局 [ "NFC 扫描列表"; 动画:无 ]

子脚本:通过扫描打开

复制
设置变量[ $scriptParam ; 值:Get ( 脚本参数 ) ]
执行脚本 [指定:来自列表 ; "解析结果" ; 参数: $scriptParam ]
提交记录/请求 [ 包括对话框:关闭 ]
If [ NFC::Type = "U" ]
    打开 URL [ 包括对话框:开启 ; NFC::Tag ] 
End If