Skip to content

Latest commit

 

History

History
463 lines (264 loc) · 13.8 KB

sc_push_svc_apnsv3.md

File metadata and controls

463 lines (264 loc) · 13.8 KB

Module sc_push_svc_apnsv3

Apple Push Notification Service (APNS) API.

Behaviours: supervisor.

Authors: Edwin Fine (efine@silentcircle.com).

Description

This is the API to the Apple Push Notification Service Provider.

See apns_erlv3_session for a description of Opts.

   Opts = [
           {name, 'apnsv3-com.example.FakeApp.voip'},
           {token, "ca6a7fef1...4f1dc2"},
           {config,
            [
             {host, <<"api.development.push.apple.com">>},
             {port, 443},
             {apns_env, prod},
             {apns_topic, <<"com.example.FakeApp.voip">>},
             {app_id_suffix, <<"com.example.FakeApp.voip">>},
             {team_id, <<"6F44JJ9SDF">>},
             {disable_apns_cert_validation, true},
             {ssl_opts, [
                         {cacertfile, "/etc/ssl/certs/ca-certificates.crt"},
                         {certfile, "com.example.FakeApp.cert.pem"},
                         {keyfile, "com.example.FakeApp.key.pem"},
                         {verify, verify_peer},
                         {honor_cipher_order, false},
                         {versions, ['tlsv1.2']},
                         {alpn_advertised_protocols, [<<"h2">>]}]}
            ]}
          ],
   {ok, Pid} = sc_push_svc_apnsv3:start_session(my_push_tester, Opts).
   Notification = [{alert, Alert}, {token, <<"e7b300...a67b">>}],
   {ok, ParsedResp} = sc_push_svc_apnsv3:send(my_push_tester, Notification).
   JSON = get_json_payload(), % See APNS docs for format
   Nf = [{token, Token}, {json, JSON}],
   {ok, ParsedResp} = apns_erlv3_session:send(my_push_tester, Nf).
   ok = sc_push_svc_apnsv3:stop_session(my_push_tester).

Data Types


alert_prop() = {title, binary()} | {body, binary()} | {'title-loc-key', binary() | null} | {'title-loc-args', [binary()] | null} | {'action-loc-key', binary() | null} | {'loc-key', binary()} | {'loc-args', [binary()]} | {'launch-image', binary()}

alert_proplist() = [alert_prop()]

async_send_opt() = {from_pid, pid()} | {callback, apns_erlv3_session:send_callback()}

async_send_opts() = [async_send_opt()]

gen_proplist() = sc_types:proplist(atom(), term())

Defines


nf_prop() = {alert, binary() | alert_proplist()} | {badge, integer()} | {sound, binary()} | {'content-available', 0 | 1} | {category, binary()} | {extra, apns_json:json_term()}

notification() = [nf_prop()]

session() = [session_opt()]

session_config() = apns_erlv3_session:options()

session_opt() = {name, atom()} | {mod, atom()} | {config, session_config()}

sessions() = [session()]

Function Index

async_send/2Equivalent to async_send(Name, Notification, []).
async_send/3Asynchronously sends a notification specified by proplist Notification to Name with proplist Opts.
send/2Equivalent to send(Name, Notification, []).
send/3Send a notification specified by proplist Notification to Name with options Opts (currently unused).
start_link/1Sessions is a list of proplists.
start_session/2Start named session for specific host and certificate as supplied in the proplist Opts.
stop_session/1Stop named session.

Function Details

async_send/2


async_send(Name, Notification) -> Result

Equivalent to async_send(Name, Notification, []).

async_send/3


async_send(Name, Notification, Opts) -> Result

Asynchronously sends a notification specified by proplist Notification to Name with proplist Opts.

Returns {ok, Result} or {error, term()}, where Result can be either {queued, uuid()} or {submitted, uuid()}. The difference between queued and submitted is the HTTP/2 session connection status. If the HTTP/2 session is connected at the time the request is made, submitted is used. If the session is not connected, the request is queued internally until the session connects and queued is used to show this.

It is possible that a queued notification could be lost if the session dies before it can connect to APNS.

Opts is a proplist that can take the following properties.

{from_pid, pid()}
The pid that will be passed to the callback function as the from property of the notification proplist (the first parameter of the callback function). If omitted, the pid is set to self(). It will be ignored unless the callback property is also provided.
{callback, apns_erlv3_session:send_callback()}
The callback function to be invoked when the asynchronous call completes. If omitted, the standard asynchronous behavior is used, and from_pid - if provided - is ignored.

The callback function type signature is apns_erlv3_session:send_callback(). The parameters are described in apns_erlv3_session:async_send_cb/4.

  fun(NfPL, Req, Resp) -> any().
  • NfPL is the notification proplist as received by the session.

  • Req is the HTTP/2 request as sent to APNS.

  • Resp is the HTTP/2 response received from APNS, parsed into a proplist.

  -spec example_callback(NfPL, Req, Resp) -> ok when
        NfPL :: apns_erlv3_session:send_opts(),
        Req :: apns_erlv3_session:cb_req(),
        Resp :: apns_erlv3_session:cb_result().
  example_callback(NfPL, Req, Resp) ->
      case proplists:get_value(from, NfPL) of
          Caller when is_pid(Caller) ->
              UUID = proplists:get_value(uuid, NfPL),
              Caller ! {user_defined_cb, #{uuid => UUID,
                                           nf => NfPL,
                                           req => Req,
                                           resp => Resp}},
              ok;
          undefined ->
              log_error("Cannot send result, no caller info: ~p", [NfPL])
      end.
  NfPL = [{uuid,<<"44e83e09-bfb6-4f67-a281-f437a7450c1a">>},
          {expiration,2147483647},
          {token,<<"de891ab30fc96af54406b22cfcb2a7da09628c62236e374f044bd49879bd8e5a">>},
          {topic,<<"com.example.FakeApp.voip">>},
          {json,<<"{\"aps\":{\"alert\":\"Hello, async user callback\"}}">>},
          {from,<0.1283.0>},
          {priority,undefined}].
  Req = {[{<<":method">>,<<"POST">>},
          {<<":path">>, <<"/3/device/de891ab30fc96af54406b22cfcb2a7da09628c62236e374f044bd49879bd8e5a">>},
          {<<":scheme">>,<<"https">>},
          {<<"apns-topic">>, <<"com.example.FakeApp.voip">>},
          {<<"apns-expiration">>, <<"2147483647">>},
          {<<"apns-id">>, <<"44e83e09-bfb6-4f67-a281-f437a7450c1a">>}
         ], <<"{\"aps\":{\"alert\":\"Hello, async user callback\"}}">>
        }.
  Resp = {ok,[{uuid,<<"44e83e09-bfb6-4f67-a281-f437a7450c1a">>},
              {status,<<"200">>},
              {status_desc,<<"Success">>}]}.

See also: apns_erlv3_session:async_send_cb/4.

send/2


send(Name, Notification) -> Result

Equivalent to send(Name, Notification, []).

send/3


send(Name, Notification, Opts) -> Result

Send a notification specified by proplist Notification to Name with options Opts (currently unused).

Set the notification to expire in a very very long time.

Send an alert with a sound and extra data:

  Name = 'com.example.AppId',
  Notification = [
     {alert, <<"Hello">>},
     {token, <<"ea3f...">>},
     {aps, [
       {sound, <<"bang">>},
       {extra, [{a, 1}]}]}
  ],
  sc_push_svc_apnsv3:send(Name, Notification).

start_link/1


start_link(Sessions) -> Result
  • Sessions = sessions()
  • Result = {ok, pid()} | {error, term()}

Sessions is a list of proplists. Each proplist is a session definition containing name, mod, and config keys.

See also: apns_erlv3_session:start_link/1.

start_session/2


start_session(Name, Opts) -> Result
  • Name = atom()
  • Opts = session()
  • Result = {ok, pid()} | {error, already_started} | {error, term()}

Start named session for specific host and certificate as supplied in the proplist Opts.

See also: apns_erlv3_session_sup:start_child/2.

stop_session/1


stop_session(Name) -> Result
  • Name = atom()
  • Result = ok | {error, Reason}
  • Reason = any()

Stop named session.