Near Field Communication (NFC) enables wireless communication between two devices at close proximity, usually less than a few centimeters. NFC is an international standard (ISO/IEC 18092) defining an interface and protocol for simple wireless interconnection of closely coupled devices operating at 13.56 MHz (see https://www.nfc-forum.org/specs/spec_list/).
This document defines an API to enable selected use-cases based on NFC technology.
Implementers need to be aware that this specification is considered unstable. Implementers who are not taking part in the discussions will find the specification changing out from under them in incompatible ways. Vendors interested in implementing this specification before it eventually reaches the Candidate Recommendation phase should subscribe to the repository on GitHub and take part in the discussions.
Significant changes to this document since last publication are documented in the Changes section.
This document defines conformance criteria that apply to a single product: the user agent that implements the interfaces it contains.
Implementations that use ECMAScript to implement the APIs defined in this document MUST implement them in a manner consistent with the ECMAScript Bindings defined in the Web IDL specification [[!WEBIDL]], as this document uses that specification and terminology.
The term
browsing context refers to the environment in which
Document objects are
presented to the user. A given browsing context has a single
origin and a single WindowProxy object, but it
can have many Document objects, with their associated
Window objects. The browsing context identifies
the entity which invokes this API, which can be a web app, a
web page, or an
iframe.
The term incumbent settings object is defined in [[!HTML5]].
The term secure context is defined in [[!WEBAPPSEC]].
The term of executing algorithms in parallel is defined in [[!HTML5]].
URL is defined in [[!URL]].
The term document base URL is defined in [[!HTML5]].
The term URL path is defined in [[!URL]].
The term origin is defined in [[!HTML5]].
The term ASCII serialized origin is defined in [[!HTML5]].
The term URL pattern is defined in the URL patterns section.
The term match pattern is defined in the Match patterns section.
DOMString,
ArrayBuffer,
BufferSource and
any
are defined in [[!WEBIDL]].
DOMException, AbortError, SyntaxError, NotSupportedError, NotFoundError, NetworkError, SecurityError are defined in [[!DOM4]].
Promise, JSON and JSON.parse are defined in [[!ECMASCRIPT]].
The algorithms utf-8 encode, and utf-8 decode are defined in [[!ENCODING]].
IANA media types (formerly known as MIME types) are defined in RFC2046.
The term expressed permission refers to an act by the user, e.g. via user interface or setting or host device platform features, using which the user approves the permission of a browsing context to access the given functionality.
The term ask for forgiveness refers to some form of unobtrusive notification that informs the user of an operation while it is running. User agents SHOULD provide the user with means to ignore similar future operations from the same origin and advertise this to the user.
The term prearranged trust relationship means that the user agent has already established a trust relationship for a certain operation using a platform specific mechanism, so that an expressed permission from the user is not any more needed. See also this section in the Security and Privacy document.
The term obtain permission for a certain operation indicates that the user agent has either obtained expressed permission, or asks for forgiveness, or ensured a prearranged trust relationship exists.
NFC stands for Near Field Communications, short-range wireless technology operating at 13.56 MHz which enables communication between devices at a distance less than 10 cm. The NFC communications protocols and data exchange formats, and are based on existing radio-frequency identification (RFID) standards, including ISO/IEC 14443 and FeliCa. The NFC standards include ISO/IEC 18092[5] and those defined by the NFC Forum. See https://www.nfc-forum.org/specs/spec_list/ for a complete listing.
An NFC adapter is the software entity in the underlying platform which provides access to NFC functionality implemented in a given hardware element (NFC chip). A device may have multiple NFC adapters, for instance a built-in one, and one attached via USB.
An NFC tag is a passive NFC device. The NFC tag is powered by magnetic induction when an active NFC device is in proximity range. An NFC tag contains a single NDEF message.
The way of reading the message may happen through proprietary technologies, which require the reader and the tag to be of the same manufacturer. Implementations are expected to encapsulate this.
An NFC peer is an active, powered device, which can interact with other devices in order to exchange data using NFC.
An NFC device is either an NFC peer, or an NFC tag.
An NDEF message encapsulates one or more application-defined NDEF records. NDEF is an abbreviation for NFC Forum Data Exchange Format, a lightweight binary message format. NDEF messages can be stored on an NFC tag or exchanged between NFC-enabled devices.
The term NFC content is a synonym for NDEF message, which can originate either from an NFC tag or an NFC peer.
An NDEF record is a part of an NDEF message that has a single associated type information to its payload. It is contains a Type Name Format (TNF) field, the payload size, the payload type, an optional identifier which is a URL, and a payload of maximum size of 2^32-1 bytes. The NFC Forum has standardized a small set of useful data types to be used in NDEF records, for instance text, URL, and binary data such as media. In addition, there are record types designed for more complex interactions, such as Smart Poster, and handover records.
The TNF (Type Name Format) field of the NDEF record can take binary values denoting the following NDEF record payload types:
| TNF value | NDEF record type |
|---|---|
| 0 | Empty |
| 1 | NFC Forum Well-Known Type |
| 2 | Media Type |
| 3 | Absolute URI |
| 4 | NFC Forum External Type |
| 5 | Unknown |
| 6 | Unchanged |
| 7 | Reserved |
An NFC watch is a mechanism used for listening to and filtering Web NFC messages. It is defined in more detail in The watch() method section.
A Web NFC record is a special NDEF record of External Type specific to W3C Web NFC, which indicates that the containing NDEF message is targeted for browsing contexts using this API and contains information useful for handling the NDEF message with the algorithms defined in this API. The format of a Web NFC record is the following:
urn:nfc:ext:w3.org:webnfc.
The Web NFC Id is a URL according to
[[RFC3986]], with "https" scheme, and an
ASCII serialized origin optionally followed by a URL path.
It is used for matching Web NFC content with URL patterns
specified by NFC watches.
A Web NFC message consists of a set of the NDEF records and a single Web NFC record.
The position of the Web NFC record within the Web NFC message is implementation specific, this specification only mandates its existence for a Web NFC message. It is not mandatory to a NDEF message.
The term Web NFC content denotes all Web NFC messages contained in an NDEF message, identified by their Web NFC Id within the NDEF message. This version of the specification supports one Web NFC message per NDEF message.
Part of the NDEF record is the NDEF Id field, which may or may not be present and it is meant for applications use. If it is present, according to the [[!NFC-STANDARDS]] it contains a maximum 256 octets long URL which is used for identifying the payload, in an application specific way. Although the NDEF Id could be used for containing e.g. an ASCII serialized origin associated with the NDEF record, it is not used in this version of the specification for record-level identification, since message-level identification is used by the means of the Web NFC Id. Also, the content of the NDEF Id is also contained in the Web NFC Id, and since NFC tags are rather small storages, this duplication is avoided in this version. When multiple Web NFC messages will be eventually supported within a single NDEF message, it would likely use the NDEF Id to store the same identifier for each NDEF record which is part of a given Web NFC message, which identifier will likely be an ASCII serialized origin associated with the Web NFC content.
The term trusted integrity NFC content refers to an NDEF message, or an NDEF record, which can be trusted for data integrity, i.e. the content is not changed by third party between writing and reading.
An NFC handover defines NFC Forum Well Known Types and the corresponding message structure that allows negotiation and activation of an alternative communication carrier, such as Bluetooth or WiFi. The negotiated communication carrier would then be used (separately) to perform certain activities between the two devices, such as sending photos to the other device, printing to a Bluetooth printer or streaming video to a television set.
In general, there are three groups of user scenarios for NFC:
NFC works using magnetic induction, meaning that the reader will emit a small electric charge which then creates a magnetic field. This field powers the passive device which turns it into electrical impulses to communicate data. Thus, when the devices are within range, a read is always performed (see NFC Analog Specification and NFC Digital Protocol, NFC Forum, 2006). The peer-to-peer connection works in a similar way, as the device periodically switches into a so-called initiator mode in order to scan for targets, then later to fall back into target mode. If a target is found, the data is read the same way as for tags.
As NFC is based on existing RFID standards, many NFC chipsets support reading RFIDs tags, but many of these are only supported by single vendors and not part of the NFC standards. Though certain devices support reading and writing to these, it is not a goal of this document to support proprietary tags or support interoperability with legacy systems.
The NFC Forum has mandated the support of four different tag types to be operable with NFC devices. The same is required on operating systems such as Android.
In addition to data types standardized for NDEF records by the NFC Forum, many commercial products, e.g. bus cards, door openers etc, use different card specific data and protocol extensions which require specific NFC chips (same vendor of card and reader) in order to work.
Card emulation mode capabilities also depend on the NFC chip in the device. For payments, a Secure Element is often needed.
This document does not aim supporting all possible use cases of NFC technology, but only a few use cases which are considered relevant to be used by web pages in browsers, using the browser security model.
This section shows how developers can make use of the various features of this specification.
var adapter = null;
var id = null;
navigator.nfc.requestAdapter().then((nfcAdapter) => {
id = adapter.watch({}, onMessage);
};
function onMessage(message, url) {
console.log("NDEF message received from URL " + url);
if (message[0].kind == 'empty') {
adapter.pushMessage([
{ kind: "text", type: "", data: “Initializing a passive tag”}]);
}
message.forEach((record) => {
if (record.kind == "string") {
console.log(“Data is string: “ + data);
} else if (record.kind == "json") {
processJSON(record.data);
} else if (record.kind == "url") {
console.log(“Data is URL: “ + record.data;
} else if (record.kind == "opaque") {
processBinary(data);
});
};
function processBinary(data) {
console.log("Binary data we know being a string: ");
console.log(String.fromCharCode.apply(null, new Uint16Array(data)));
};
function processJSON(data) {
var obj = JSON.parse(data);
console.log("My data: " + obj.myProperty.toString());
};
navigator.nfc.requestAdapter().then((adapter) => {
adapter.pushMessage([
{ kind: "text", type: "", data: “Data meant for peers”}])
.then(() => { console.log("Message sent")})
.catch(() => {console.log("Send failed, try again.")});
};
navigator.nfc.requestAdapter().then((adapter) => {
console.log("Waiting for game state");
adapter.watch({ url: "*://myserver/mygame/*"}, (message, url) => {
console.log("Game state received from: " + url;
console.log("Game state: " + message.data);
// Now do some calculations and update the state.
adapter.pushMessage([ data: { level: 3, points: 4500, lives: 3 } ])
.then(() => { console.log("Send was successful")})
.catch(() => { console.log("Send failed")});
};
});
A few Web NFC user scenarios are described in the Use Cases document. These user scenarios can be grouped by criteria based on security, privacy and feature categories, resulting in generic flows as follows.
The user opens a web page which can write an NFC tag. The write operations may be one of the following:
Note that an NFC write operation to an NFC tag always involves also a read operation.
In general, sending data to another Web NFC capable device requires that
on the initiating device the user would first have to navigate to a web
site. The user would then touch the device against another Web NFC
equipped device, and data transfer would occur. On the receiving device
the user agent will dispatch the content to an application registered
and eligible to handle the content, and if that application is a browser
which has a web page open and in focus that uses the Web NFC API and has
set up a NFC watch to listen to Web NFC content, then the
content is delivered to the web page through the parameters of an
NFCMessageCallback.
NFC supports handover protocols to Bluetooth or WiFi connectivity for the purpose of larger volume data transfer. The user touches another NFC capable device, and as a result configuration data is sent for a new Bluetooth or WiFi connection, which is then established between the devices. This use case is not supported in this version of the specification.
The user buys goods in a store, and payments options include NFC. In general, touching the device to the point of sales terminal receiver area will result in a transaction between the secure element from the device and the point of sales terminal. With the Web NFC API, if the user navigates to a web site before paying, there may be interaction with that site regarding the payment, e.g. the user could get points and discounts, or get delivered application or service specific data (e.g. tickets, keys, etc) to the device. This use case is not supported in this version of the specification.
High level features for the Web NFC specification include the following:
NFC is usually deeply integrated into device platforms (e.g. Android, Windows, etc), because end-to-end user experience implications (e.g. users need to be presented platform specific dialogs for selecting applications and actions). Also, privacy and security related issues require platform specific solutions.
The various integrated technologies, wide variety of use cases, and platform integration issues make standardization of NFC for the web a challenge. Therefore this document makes a few simplifications in what use cases and data types are possible to handle by users of this API:
The trust model, attacker model, threat model and possible mitigation proposals for the Web NFC API are presented in the Security and Privacy document. This section presents the chosen security and privacy model through normative requirements to implementations.
Web pages using the NFC API are not trusted. This means that the user needs to be aware of exactly what a web page is intending to do with NFC at any given moment. Implementations SHOULD make sure that when the user authorizes an NFC operation, then only that action is run, without side effects, and exactly in the context and the number of times the user allows the execution of NFC operations.
The content of Web NFC messages is not trusted, unless the user agent can safely assume that the content has not been change by third parties between writing and reading it, e.g. in the case of a prearranged trust relationship can be established.
The main threats are summarized in the Security and Privacy document.
In this specification the following threats are handled with the highest priority:
User agents MUST NOT provide Web NFC API access to browsing contexts without complying with the security policies described in this document.
This specification attempts to help minimizing the user prompts needed to use the Web NFC API and tries to involve implicit policies which can address the threats. However, this specification does not describe, nor does it mandate specific user prompting policies. The term obtain permission is used for acquiring trust for a given operation.
The Permissions API SHOULD
be supported by user agents for implementing NFC related
[[permissions]]. The required
permission name is "nfc".
This allows saving user permissions for a given origin in a
persistent database until revocation.
User agents MUST acquire user consent, i.e. expressed permission for for using the methods of this API, unless a prearranged trust relationship applies, or unless an implicit policy specified in this document allows it, eventually with an ask for forgiveness indication.
The choice of trusting the integrity of NFC content when used for implementing security policies, for instance the authenticity of origins saved in the NDEF Id field, or that of the URL path of the browsing context, and then used for same-origin or allowed-origins policy by the user agent, SHOULD be based on prearranged trust relationship (such as encryption and other means), otherwise the integrity of the content MUST NOT be trusted by user agents and security policies MUST NOT be based on this.
All expressed permissions that are preserved beyond the current browsing session MUST be revocable.
User agents MUST implement the following policies:
"https" SHOULD be able to access
NFC content.
Browsers MAY ignore this rule for development purposes only.
Window object associated with the
active Document of the browsing context using
the Web NFC API MUST be visible and
in focus. This also means that user agents
SHOULD make sure the display is on, and the device is unlocked.
For web pages in background, receiving and sending NFC content
MUST be suspended.
As a consequence, since every access from a browsing context needs the attention of the user, and since the user must do a physical gesture of tapping the device to another one in order to use NFC, it is assumed in this specification that the user has expressed permission for each NFC operation, provided the other conditions described in this specification are fulfilled.
getAdapter
method, or when setting up listeners for reading, or when sending
NFC content, the user agent MAY warn the user that
physical location may be inferred from the act of using NFC by the
origin of the reading browsing context.
The content of any Web NFC message is exposed by the following sequence:
The content of any NDEF record is exposed by the following dictionary:
The kind
property MUST return the NFCRecordType of the
NDEF record.
The type
property MUST return the IANA media type of the NDEF record
payload.
The
data property MUST return the
payload data of the NDEF record with an appropriate ECMAScript
type, which depends on the IANA media type.
NFCRecordType denotes the data types supported as NDEF record payload in read and send operations in this API.
The mapping from data types of an NFCRecord to and from
NDEF record types is presented in the algorithmic steps which handle
the data, i.e. the receiving NFC content
algorithm and sending NFC content algorithm.
The mapping from data types of an NFCRecord to
NDEF record types, as used in the sending NFC content
algorithm is as follows:
| NFCRecord kind | NFCRecord type | NFCRecord data | NDEF record type |
|---|---|---|---|
| "empty" | not used | not used | NFC Forum Empty Type (TNF=0) |
| "text" | not used | DOMString |
NFC Forum Well Known Type (TNF=1) with type Text |
| "url" | not used | DOMString |
NFC Forum Well Known Type (TNF=1) with type URI |
| "json" | "application/json", "application/*+json" |
null or DOMString or Number or
Object
|
Media-type as defined in [[RFC2046]] (TNF=2) with associated
IANA media type specified in the type attribute.
|
| "opaque" | IANA media type | ArrayBuffer or typed array |
Media-type as defined in [[RFC2046]] (TNF=2) |
| "opaque" | "" (empty) |
ArrayBuffer or typed array |
NFC Forum External Type (TNF=4) |
The mapping from NDEF record types to NFCRecord,
as used for incoming NDEF messages described by the
receiving NFC content algorithm is as
follows:
| NDEF record type | NFCRecord kind | NFCRecord type | NFCRecord data |
|---|---|---|---|
| NFC Forum Empty Type (TNF=0) | "empty" | "" | null |
| NFC Forum Well Known Type (TNF=1) with type Text | "text" | "text/plain" | DOMString |
| NFC Forum Well Known Type (TNF=1) with type URI | "url" | "text/plain" | DOMString |
| NFC Forum Well Known Type (TNF=1) with type Smart Poster | "url" | "text/plain" | DOMString |
| Absolute URI as defined in [[RFC3986]] (TNF=3) | "url" | "text/plain" | DOMString |
Media-type as defined in [[RFC2046]] (TNF=2) with associated
IANA media type "application/json" or
"application/*-json"
|
"json" | The IANA media type used in the NDEF record |
null or DOMString or Number or
Object
|
| Media-type as defined in [[RFC2046]] (TNF=2) | "opaque" | The IANA media type used in the NDEF record | ArrayBuffer |
NFC Forum External Type (TNF=4) with type other than
urn:nfc:ext:w3.org:webnfc* |
"opaque" | "application/octet-stream" | ArrayBuffer |
| Any other NDEF record type | "opaque" | "application/octet-stream" | ArrayBuffer |
The Web NFC records MUST NOT be exposed to client browsing contexts.
The HTML document defines a
Navigator interface [HTML] which this specification
extends.
When getting the nfc attribute, the user agent MUST return the NFC object, which provides NFC related functionality.
Implementations MAY expose multiple NFC adapters. By using the requestAdapter() method, the browsing context can obtain an adapter object providing NFC functionality. When this method is invoked, the user agent MUST run the following steps:
Promise object.
"SecurityError",
and terminate this algorithm.
"NotSupportedError", and terminate this algorithm.
null.NFCAdapter object, or if that does not
exist, a new NFCAdapter object which is bound to
work with the default NFC adapter.
Resolve promise with adapter, and terminate these
steps.
"NotFoundError", and terminate this algorithm.
NFCAdapter
object.
The NFCAdapter interface provides sending
Web NFC messages to NFC tags or NFC peers within range,
and to set up and cancel NFC watches to handle incoming
Web NFC messages either from an NFC tag or an NFC peer.
The target property
denotes the intended target for the pending pushMessage()
operation. The default value is "any".
The timeout property
denotes the timeout for the pending pushMessage()
operation expressed in milliseconds. The default, and maximal value is
10000, i.e. 10 seconds. After the timeout expires, the
message set for sending is cleared, an error is returned, and a new
Web NFC message can be set for sending.
The
pushMessage() method is used for saving a NDEF message
to be sent to an NFC tag for writing, or to an NFC peer
device for pushing, next time when they get into proximity range, or until
a timeout expires. At any time for there is maximum 2
Web NFC messages that can be set for sending for an origin:
one targeted to NFC tags and one to NFC peers.
When there is a Web NFC message set for sending
to any target, then no more messages are accepted to be set until the
current message is sent or a timeout happens.
When the
pushMessage(message, options) method is invoked, the user
agent MUST run the following sending NFC content algorithm:
Promise object.
"SecurityError", and terminate this algorithm.
"NotSupportedError", and terminate this algorithm.
"SecurityError", and terminate this algorithm.
"any".
NFCRecord objects, then reject
promise with "SyntaxError",
and terminate this algorithm.
"empty", then
execute the following steps:
NFCMessage output to
contain only the current empty record record,
and continue with step 11.
"text", then
execute the following steps, or make sure
that the underlying platform provides equivalent values to
ndef:
This is to be used when clients specifically want to write an
NDEF Well Known Type Text record. Otherwise clients could
also use "opaque" with an explicit IANA media
type also for text, which has the advantage of better
differentiation, e.g. when using "text/xml", or "text/vcard".
"string"
or "number", then then reject promise
with "SyntaxError", and terminate this algorithm.
"string"
or if it does not start with "text/", then
reject promise with "SyntaxError",
and terminate this algorithm.
In addition, user agents MAY check that
record.type is a IANA registered media type
for text. If not, then the user agent MAY
reject promise with "SyntaxError",
and terminate this algorithm.
"en".
If record.type does include a lang=
parameter for language encoding (e.g.
"text/plain; lang=fr"), then set language to
the language code extracted from record.type.
If language is not one of the language codes listed
in the IANA language registry
(or [[ISO-639.2]]),
then user agents MAY reject promise with
"SyntaxError", and terminate this algorithm.
Note that lang= is not standard parameter
to IANA media types, but it is used in this specification
in order to maintain compatibility with NFC specifications.
"T"
(value 0x54 in NFC binary encoding).
"url", then
execute the map URL to NDEF sub-steps, or make sure
that the underlying platform provides equivalent values to
ndef:
string,
then reject promise with
"SyntaxError", and terminate this algorithm.
"json", then
execute the map JSON to NDEF sub-steps, or make sure
that the underlying platform provides equivalent values to
ndef:
"string", or "number", or
"object", then reject promise with
"SyntaxError", and terminate this algorithm.
"application/json", or another IANA type for JSON
("application/<type>+json"), then reject
promise with "SyntaxError", and
terminate this algorithm.
"opaque", then
execute the map binary to NDEF sub-steps, or make sure
that the underlying platform provides equivalent values to
ndef:
ArrayBuffer, then reject promise with
"SyntaxError", and terminate this algorithm.
"SyntaxError", and
terminate this algorithm.
undefined,
then:
ArrayBuffer, then set record.type to
"application/octet-stream" and execute the
map binary to NDEF
steps.
"object", then set record.type to
"application/json" and execute the
map JSON to NDEF steps.
"number" or "string", then
set record.type to "plain/text" and
execute the
map text to NDEF steps.
"SyntaxError", and terminate this algorithm.
"urn:nfc:ext:w3.org:webnfc".
In future versions a list of "allowed-origins" may be supported. It needs more discussions, since there is a security issue with it. See the Security and Privacy document.
pushMessage() method replaces the previously set
push message, and also resets the timer associated with it.
"TimeoutError" and terminate this algorithm.
"tag",
then the sending should only happen if an NFC tag is
tapped, otherwise reject promise
"InvalidAccessError" and terminate this algorithm.
"peer",
then the sending should only happen if an NFC peer is
tapped, otherwise reject promise with
"InvalidAccessError" and terminate this algorithm.
"any"
(which is the default value), then the sending should happen if
either an NFC peer or an NFC tag is tapped within
the specified timeout.
"NetworkError" and
terminate this algorithm.
cancelPush()
method is called, reject promise with
"AbortError", as described in the
cancelPush() algorithm.
The
cancelPush
method is used for resetting the NDEF message set to be pushed next
time an NFC device comes in range.
When the cancelPush() method is invoked, the user agent
MUST run the following algorithm:
"SecurityError", and terminate this algorithm.
pushMessage() algorithm,
or no active timers associated with it, then terminate this algorithm.
This step also covers the case when the timer has already fired,
which also means that the message buffer is invalid, and is to be
replaced by the next invocation of pushMessage().
messagePush().
pushMessage() algorithm
with "AbortError".
A match pattern is a string which can contain the
'*' wildcard character.
Match patterns are used primarily for matching IANA media types, for
instance the match pattern 'application/*+json' matches
'application/calendar+json', but does not match
'application/json'. The match pattern
'*/*json' matches both.
A URL pattern is a URL which can contain '*'
characters. Each URL pattern is in the form of
The syntax is the following:
<url-pattern> := <scheme>://<host><path>
<scheme> := '*' | 'https'
<host> := '*' | '*.' <any char except '/' and '*'>+
<path> := '/' <any chars>
Note that '*' has slightly different meaning depending on
whether it is in the scheme, host or path part.
In a scheme '*' will match only the allowed
'https' scheme.
If the host is '*', then it matches any host. If the
host is e.g. '*.myhost', then it will match the
specified host or any of its subdomains.
In the path part, each '*' matches 0 or more
characters.
For example, '*://*.mydomain.com/*' will match
'https://services.mydomain.com/myservice1/myapp2/' and
'https://info.mydomain.com/general/'.
The "web-only" value means that only those
NDEF messages are exposed which contain a
Web NFC record, i.e. which are meant for web pages.
This is the default value.
The "all" value means that all NDEF messages
are exposed.
To describe which messages an application is interested in, the following dictionary is used:
The url property
denotes the URL pattern which is used for matching the
URL path of the Web NFC message which is stored in the
Web NFC record.
The values null, undefined, and
"" mean that no matching happens.
The kind property
denotes the string value which is used for matching the
kind property of each NFCRecord object
in a Web NFC message.
The values null and undefined mean that
no matching happens.
The type property
denotes the match pattern which is used for matching the
type property of each NFCRecord object
in a Web NFC message.
The values null and undefined mean that
no matching happens. The value "" matches missing type
information.
The mode property tells whether only Web NFC content or any NFC content will be watched.
var watchOptions = {
url: "www.w3.org/*", // all paths from the domain are accepted
kind: "json",
type: "application/*json" // all IANA media types dealing with JSON
}
var watchOptions = {
url: "*://*/info/restaurant/daily-menu/", // accepted from any domain
kind: "opaque",
type: "application/octet-stream"
}
The
watch(options, callback) method enables listening to incoming
NDEF messages.
The NFC content to which clients listen can be filtered based on its data type, and based on the URL path of the browsing context which has been saved to the Web NFC record of the NFC content. The latter is matched against URL patterns used in NFC watches.
A NFC watch is referring to a NFCWatchOptions
filter saved together the information with NFC adapter it belongs
to, and a locally unique identifier which is used for cancellation.
The
receiving NFC algorithm uses NFC watches to match incoming
NFC content.
Multiple consecutive calls to the watch() method from the
same origin create filters which are in OR relationship.
Watch filters are grouped by NFC adapter.
When the
watch() method is invoked, the user agent MUST run
the following NFC watch algorithm:
Promise object.
"SecurityError", and terminate this algorithm.
"NotSupportedError", and
terminate this algorithm.
"SecurityError", and terminate this algorithm.
"all", then also include in this information that the
origin is requesting to read all NFC content, not only
those meant for web pages.
"SecurityError", and terminate this algorithm.
The ask for forgiveness interaction might show choices like "block now" or "block forever", etc. If the user has chosen to "block forever" the given origin, it is the responsibility of the user agent to remember these user choices for each origin, regardless of which NFC adapter is used, and consult them on later invocations.
"SyntaxError",
and terminate this algorithm.
"SyntaxError", and terminate this algorithm.
"NotSupportedError" , and terminate this algorithm.
When the
unwatch(id) method is invoked, the user agent
MUST run the following steps:
Promise object.
"SecurityError", and terminate this algorithm.
undefined, then
remove all watches and filters set by successive calls of the
NFC watch() method on the current
NFC adapter.
"NotFoundError", and terminate this algorithm.
If there are any NFC watches set up for any NFC adapter, then user agents MUST listen to NDEF messages, according to step 9 of the NFC watch algorithm. When an NDEF message is received by the underlying platform, user agents MUST run the following algorithm:
This is a placeholder for a possible future feature. In this step, implementations MAY check if the origin of the browsing context matches the Web NFC Id of input.If yes, and also prearranged trust relationship exists so that input is trusted integrity NFC content, then same-origin policies MAY be applied.
This is a placeholder for a possible future feature. In this step, implementations MAY check if any of the URL patterns saved in the Web NFC record (in the future) match with the origin of the browsing context. If yes, and also if prearranged trust relationship exists so that input is trusted integrity NFC content, then allowed-origin policies MAY be applied.
NFCRecord
objects.
null, used for storing the
Web NFC Id of message.
NFCRecord object.
"empty",
record.type to "",
and record.data to null.
"T" (value 0x54 in NFC binary
encoding), then execute the following sub-steps for
parsing NDEF Text record, or make sure that the
underlying platform provides equivalent values to the
record object properties:
"text"."text/plain".";lang=" and then the value of
language to record.type.
"U" (value 0x55 in NFC binary
encoding), then execute the following sub-steps for
parsing NDEF URL record, or make sure that the
underlying platform provides equivalent values to the
record object properties:
"url"."text/plain"."url",
set record.type to "text/plain" and
set record.data to the string converted from
ndef.PAYLOAD.
"application/*json", then
"json".The payload SHOULD NOT be evaluated by user agents for security reasons.
"opaque".ArrayBuffer
object constructed from the octets of ndef.PAYLOAD.
urn:nfc:ext:w3.org:webnfc,
then set messageId to the value decoded from
ndef.PAYLOAD in UTF-16.
"opaque"."application/octet-stream.
ArrayBuffer
object constructed from the octets of ndef.PAYLOAD.
watch() method, execute the following sub-steps:
NFCWatchOptions
saved with the watch, and let callback be the registered
callback function.
"web-only", and
messageId is null, then skip to the next
NFC watch.
"web-only", and
messageId is not null, or if
options.mode is "all", then execute the
following sub-steps:
The following is a list of substantial changes to the document. For a complete list of changes, see the change log on Github. You can also view the recently closed bugs.
The following problems are being discussed and need most attention:
This version addresses the issues above, and also other issues.The editors would like to express their gratitude to the former editors Luc Yriarte and Samuel Ortiz, and also to Don Coleman, Anne van Kesteren, Domenic Denicola, Jonas Sickling, Jeffrey Yasskin, Alexander Shalamov, Salvatore Iovene, and Rijubrata Bhaumik for their technical guidance, implementation feedback and support.