Geofencing API proposal

Hi, I’m a Software Engineer working on blink/chrome at Google. I’m
currently working on brining Geofencing to Service Workers/the web, so here
is a proposal for an API for that.
Use cases

   -

   Companies presenting their Web app based on the user’s locality (e.g.
   showing their membership card # when they’re in a store).
   -

   Web apps for assisting the user based on their locality (e.g. calendars,
   alarms, reminders, accessibility devices and so on).
   -

   Similarly, Web apps showing photo spots, events and transport
   information based on the user’s locality (similar to Google Now)..
   -

   Offers or discounts presented to a user when they’re near a store.

API proposal

[exposed=Window&Worker]

partial interface Navigator {

  readonly attribute Geofenci <http://dev.w3.org/geo/api/spec-source.html>ng
geofencing;

};

partial interface ServiceWork
<https://github.com/slightlyoff/ServiceWorker/blob/master/explainer.md>erGlobalScope
{

  attribute EventHandler ongeofenceenter;

  attribute EventHandler ongeofenceleave;

};

The ongeofenceenter and ongeofenceleave events have a “region” attribute
with the relevant GeofencingRegion.

[NoInterfaceObject]

interface Geofencing {

  Promise<undefined> registerRegion(GeofencingRegion region);

  Promise<undefined> unregisterRegion(DOMString regionId);

  Promise<sequence<GeofencingRegion>> getRegisteredRegions();

};

Possible failure reasons for registerRegion include no service worker being
associated with the page, the user not accepting the location request, and
maybe others. If an attempt is made to register a region with the same ID
as that of a region that is already registered, the new region will
override the old region.

Possible failure reasons for unregisterRegion include no region being
registered with the given ID.

The getRegisteredRegions method returns all currently registered regions.

The promise is resolved to a (potentially empty) list of GeofencingRegions
on success, and rejected on failure to get the regions. A possible failure
reason would be no service worker being active for the page. No regions
being registered is not a failure.

Regions are specified by the following API:

[NoInterfaceObject]

interface GeofencingRegion {

  readonly attribute DOMString id;

};

[Constructor(optional String? id, dictionary options), exposed=Window&Worker
]

interface CircularRegion : GeofencingRegion {

  const double MIN_RADIUS = 10;

  const double MAX_RADIUS = 1000;

  readonly attribute double latitude;

  readonly attribute double longitude;

  readonly attribute double radius;

};

All regions may be referred to by a string identifier. Exactly one region
can be registered per identifier.

The radius is specified in meters, and must be between MIN_RADIUS and
MAX_RADIUS (inclusive). The values of MIN_RADIUS and MAX_RADIUS may be
platform dependent.

If no id is provided the empty string is used. Latitude, longitude and
radius must always be provided.

Received on Friday, 18 July 2014 22:10:23 UTC