From 4d1e35aee0d7b41858818fe197a636f2c21d7128 Mon Sep 17 00:00:00 2001 From: Younho Park Date: Tue, 11 Oct 2016 17:49:04 +0900 Subject: [PATCH] [3.0][sppc] Updated 3.0 features Change-Id: Iaf8354917cb397d8d62c72fc41075f09e3d7ee0b Signed-off-by: Younho Park --- .../html/images/push_active_notification.png | Bin 0 -> 108388 bytes org.tizen.guides/html/native/messaging/push_n.htm | 1561 +++++++++++--------- .../html/native/messaging/push_server_n.htm | 319 +++- 3 files changed, 1142 insertions(+), 738 deletions(-) create mode 100644 org.tizen.guides/html/images/push_active_notification.png diff --git a/org.tizen.guides/html/images/push_active_notification.png b/org.tizen.guides/html/images/push_active_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..4f88651ab1efe76ffe6376f5454311160a79f759 GIT binary patch literal 108388 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ɶ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 U!^tD!<^TWy07*qoM6N<$f`a|1r2qf` literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/native/messaging/push_n.htm b/org.tizen.guides/html/native/messaging/push_n.htm index 771fc30..4845a4f 100644 --- a/org.tizen.guides/html/native/messaging/push_n.htm +++ b/org.tizen.guides/html/native/messaging/push_n.htm @@ -1,735 +1,828 @@ - - - - - - - - - - - - - Push - - - -
-
-

Mobile native Wearable native

-
- -
-

Dependencies

-
    -
  • Tizen 2.4 and Higher for Mobile
  • -
  • Tizen 2.3.1 and Higher for Wearable
  • -
-

Content

- -

Related Info

- -
-
- -
-

Push

- -

Push enables you to push events from an application server to your application on a Tizen device.

- -

Once your application is successfully registered in the push server through the push service (daemon) on the device, your application server can send push messages to the application in that particular device.

-

When a push message arrives when the application is running, it is automatically delivered to the application. If not, the push service makes a sound or vibrates and adds a ticker or a badge notification to notify the user. By touching this notification, the user can check the message. The application server may send a message with a LAUNCH option. In this case, the push service forcibly launches the application and hands over the message to the application as an application control.

- -

To use the push messaging service, the application needs the permission to access the Tizen push server. Request the permission from the Tizen push service team by email, including the necessary information. When the team approves the request, you receive a push app ID corresponding to your package ID.

- -

Remember to take care of security issues when sending notifications with sensitive information.

- -

Figure: Push messaging service

-

Push messaging service

- -

Service Architecture

-

The following figure illustrates the service architecture of the Tizen push messaging service.

-

Figure: Service architecture

-

Service architecture

-

The following steps illustrate a typical scenario for using the push messaging service on a Tizen device:

-
    -
  1. The application on the device registers for the push messaging service. Before you start, remember to prepare your application to use the push functionality.
  2. -
  3. When an application is installed and launched, the device establishes a push session with the Tizen Server by sending a registration request to the Tizen push server through the push service. -

    The push session is managed by the Tizen server and device platform, so there is no need to create any code to manage it within the application.

  4. -
  5. If the registration request is approved, the application receives through the push service a registration ID. The registration ID is a unique key used to identify the application installed in that particular device and route the push message. -

    The application delivers the registration ID to the application server. This registration ID is used to identify the application installed in that particular device.

  6. -
  7. When the application server needs to send a push message to the application in the particular device, it calls the Tizen server's open API to send the message together with the registration ID. (For more information for server developers about sending push messages, see Sending Push Notifications.) -

    A text message of up to 1024 bytes can be sent in a push message. If the application needs to download a large amount of data, the application server sends a link to the data in the push message.

    -
  8. -
  9. When the Tizen push server receives the message and the registration ID, it checks which device has the application with the particular registration ID and then routes the message to that device.
  10. -
  11. When the push service receives the message and the registration ID, it sends the message to the destination application, which receives the push message.
  12. -
- -

Warm-up

-

Become familiar with the Push API basics by learning about:

- - -

Prerequisites

- -

To enable your application to use the push functionality:

-
    -
  1. -

    To use the Push API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the tizen-manifest.xml file:

    -
    -<privileges>
    -   <privilege>http://tizen.org/privilege/push</privilege>
    -</privileges>
    -
    -
  2. -
  3. -

    Make sure the following requirements are fulfilled:

    -
      -
    1. Internet access -

      To connect to the Tizen push server and receive notifications from it, the target device or emulator must be able to contact any IP address with the port 5223. If you are in an enterprise network, ensure that the proxy setting in your local network allows outgoing traffic destined for this port number.

    2. -
    3. Package ID -

      When you create a project in the Tizen Studio, you are given the package ID (randomly generated by the Tizen Studio or entered by yourself). The Tizen push server identifies your applications using the package ID.

    4. -
    5. Permission to Tizen push servers -

      To use the push messaging service, the application needs the permission to access the Tizen push server. Request the permission from the Tizen push service team by email, including the following information. When the team approves the request, you receive a push app ID corresponding to your package ID.

      -

      By sending the application, you agree to the Terms of Service and Privacy Policy.

      -
    6. -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table: Request form details
    Developer information
    Email addressYour email address to receive the approval response.
    Last nameYour last name.
    First nameYour first name.
    CountryYour country of residence.
    Application information
    Package IDThe ID of the application package that uses the push messaging service. The package ID can be obtained from the application manifest file in the Tizen Studio.
    Application nameName of the application that uses the push service.
    Application typeNative application or Web application.
    Testing purpose Yes or no. If you request the service for testing purposes only, the duration of the push service is limited to 3 weeks.
    Purpose of the push notification usage Description of how you plan to use the push service, including the situations in which you want to use it.
    Application launch date Application launch date in the YYYY/MM/DD format. For example: 2014/08/01.
    Service area/countryService area, such as Asia, Africa, America, Europe, or the country where the application is used.
    Daily push requestsEstimated number of daily notifications.
    Transactions per second Estimated peak number of transactions per second (the recommendation is below 100).
    -
  4. - -
  5. To use the functions and data types of the Push API, include the <push-service.h> header file to your application:

    - -
    -#include <push-service.h>
    -
    -
  6. - -
  7. To ensure that push notifications are handled fluently, make both a service and UI application. The service application receives push notifications in the background, while the UI application shows the notifications or events triggered by notifications to the users. An example implementation is available in the push sample package in the Tizen Studio.

    -
  8. -
- -

Connecting to the Push Service

- -

To request or receive push notifications, establish a socket connection to the push service. All the information regarding this connection must be controlled by a connection handle which can be defined as a global variable:

- -
-push_service_connection_h push_conn;
-
- -

To manage push service connections:

-
    -
  1. Connect to the push service. -

    Once the connection handle is defined, use the push_service_connect() function to connect to the push service:

    - -
    -#define PUSH_APP_ID "YOUR_PUSH_ID_HERE"
    -
    -static bool
    -app_create(void *data)
    -{
    -    int ret;
    -
    -    /* Connect to the push service when the application is launched */
    -    ret = push_service_connect(PUSH_APP_ID, _state_cb, _noti_cb, NULL, &push_conn);
    -
    -    if (ret != PUSH_SERVICE_ERROR_NONE) {
    -        /* Implementation here */
    -        dlog_print(DLOG_INFO, LOG_TAG, "push_service_connect() Failed");
    -    }
    -
    -    return true;
    -}
    -
    - -

    In the above example, the application establishes a socket connection to the push service:

    -
      -
    • The YOUR_PUSH_ID_HERE parameter is the push app ID received from the Tizen push server team when the access to the server was requested. Keep this push app ID confidential, otherwise your push notifications can be hijacked by malicious applications.
    • -
    • The _state_cb() and _noti_cb() parameters are callback functions called when the state changes or a notification arrives from the server through the push service.
    • -
    • The push_conn parameter is the output of the push_service_connect() function. If the connection between the application and the service is successful, the push_service_connect() function returns PUSH_SERVICE_ERROR_NONE and the push_conn connection handle is returned through the last parameter. If the push_service_connect() function returns other values, the connection to the service failed. This happens most likely when the push privilege is not added in the Tizen Studio.
    • -
    - -

    This sample application establishes a connection to the service when it is launched and disconnects from the service when it terminates. Due to this, the push_service_connect() function is located in the app_create() function, which is called when the application is launched. -

    -
  2. - -
  3. Disconnect from the push service. -

    When the application terminates or no longer uses the push service, close the connection using the push_service_disconnect() function.

    - -

    The push_service_disconnect() function closes the existing connection associated with the push_conn handle and returns all the resources allocated for the connection.

    - -
    -push_service_disconnect(push_conn);
    -push_conn = NULL;
    -
    - -

    The connection is automatically closed when the application terminates. Hence, if the application uses the push service while being launched, it does not need this function.

    - -

    The application can also disconnect the service in the middle of the application operation. If you add a toggle switch to the application for switching the push service on and off, call this function when the service is switched off. Do not call this function inside any push callback functions, however, since it can cause the application to crash.

    -
  4. - -
  5. Handle state transitions. -

    After the connection to the service is made, the application is notified whenever the connection state changes. This notification is conducted through the _state_cb() callback, which is defined in the push_service_connect() function. The following figure illustrates the possible states.

    - -

    State transitions

    - -

    Once launched, the application is in the INITIAL state. When the application establishes a connection to the service using the push_service_connect() function, the state becomes either UNREGISTERED or REGISTERED:

    -
    • If the application is currently registered to the push server, the service forces it to transit from the INITIAL state to the REGISTERED state. In this case, the application can request deregistration from the push server using the push_service_deregister() function. If this request is approved by the push server, the state transits to UNREGISTERED.
    • -
    • If the application is not currently registered to the push server, the state transits from the INITIAL state to the UNREGISTERED state. In this case, the application can request registration to the push server using the push_service_register() function. If this request is approved by the push server, the state transits to REGISTERED.
    • -
    • When an error occurs, the state transits to ERROR.
    - -

    When the current state transits, the _state_cb() function is called and the new state is obtained from the first parameter. Determine the application actions based on the new state:

    - -
    -static void
    -_state_cb(push_service_state_e state, const char *err, void *user_data)
    -{
    -    switch (state) {
    -    case PUSH_SERVICE_STATE_UNREGISTERED:
    -        dlog_print(DLOG_INFO, LOG_TAG, "Arrived at STATE_UNREGISTERED");
    -        _on_state_unregistered(user_data);
    -        break;
    -    case PUSH_SERVICE_STATE_REGISTERED:
    -        dlog_print(DLOG_INFO, LOG_TAG, "Arrived at STATE_REGISTERED");
    -        _on_state_registered(user_data);
    -        break;
    -    case PUSH_SERVICE_STATE_ERROR:
    -        dlog_print(DLOG_INFO, LOG_TAG, "Arrived at STATE_ERROR");
    -        _on_state_error(err, user_data);
    -        break;
    -    default:
    -        dlog_print(DLOG_INFO, LOG_TAG, "Unknown State");
    -        break;
    -    }
    -}
    -
    - -

    In the above example, the _on_state_registered(), _on_state_unregistered(), and _on_state_error() functions contain the actions for the REGISTERED, UNREGISTERED, and ERROR states, respectively. The application does not need to handle the INITIAL state, because it is maintained internally, and this callback function is never invoked in that state. The second parameter, err, is the error message from the push service when the state becomes ERROR. Consequently, only the _on_state_error() function takes this parameter.

    -

    The registration state is subject to change. Consequently, make sure that the application connects to the push service whenever it is launched.

    -
  6. -
- -

Registering with the Push Server

- -

To receive push notifications, the application must send a registration request to the Tizen push server. When the server receives this request, it assigns a registration ID that is unique to the application on the particular device. When sending a notification from your application server, this registration ID is used as a destination address of the application. If the application no longer needs to receive push notifications, it needs to send a deregistration request to the server.

-

To register with the push server:

-
    -
  1. Request registration. -

    After connecting to the push service, request registration using the push_service_register() function.

    -

    The first parameter is the connection handle that was returned from the push_service_connect() function, and the second parameter is the callback function that returns the result of the registration request.

    - -
    -#define PUSH_HASH_KEY "existing_push_reg_id"
    -
    -static void
    -_on_state_unregistered(void *user_data)
    -{
    -    int ret;
    -
    -    /* Reset the previously-stored registration ID */
    -    ret = preference_set_string(PUSH_HASH_KEY, "");
    -
    -    /* Send a registration request to the push service */
    -    ret = push_service_register(push_conn, _result_cb, NULL);
    -}
    -
    - -

    The _on_state_unregistered() function containing the push_service_register() function is called when the state transits to UNREGISTERED. This sample application is designed to send the registration request as soon as it is connected to the push service. If the application requires users to login to the service, this registration request must be sent after the login process is complete.

    - -

    The registration request is non-blocking. If the push_service_register() function returns PUSH_SERVICE_ERROR_NONE, the request is successfully delivered to the push service. However, it does not necessarily mean that the request is approved by the server. If the push service successfully sends the request to the server and receives an approval, the _result_cb() callback is called with PUSH_SERVICE_RESULT_SUCCESS as the first parameter:

    - -
    -static void
    -_result_cb(push_service_result_e result, const char *msg, void *user_data)
    -{
    -    if (result == PUSH_SERVICE_RESULT_SUCCESS)
    -        dlog_print(DLOG_INFO, LOG_TAG, "Registration request is approved.");
    -    else
    -        dlog_print(DLOG_ERROR, LOG_TAG, "Registration ERROR [%s]", msg);
    -
    -    return;
    -}
    -
    - -

    When an error occurs in the middle of the registration process, the reason is returned in the first parameter of the callback. For example, if the push server is not responding, the push_service_register() function returns PUSH_SERVICE_ERROR_NONE (because delivery to the service is successful), but the _result_cb() function is called later with PUSH_SERVICE_RESULT_TIMEOUT. In this case, the application does not need to request registration again because the push service keeps the previous request and sends it when the network becomes online. The msg parameter is the error message from the push service if the request fails.

    -
  2. - -
  3. Handle the transit to the REGISTERED state. -

    The application transits to the REGISTERED state in one of the following cases:

    -
      -
    • The registration request sent at the UNREGISTERED state is approved.
    • -
    • The already-registered application at the INITIAL state is successfully connected to the push service.
    • -
    - -

    In both cases, the _state_cb() callback function is called with the PUSH_SERVICE_STATE_REGISTERED state. The application calls the _on_state_registered() function immediately, as shown in the state transitions. When defining the actions inside the function, keep the following points in mind:

    -
      -
    • If the application has already been registered, request the push service for any unread notifications that have arrived before the application is launched. -

      Request the unread notifications asynchronously. If there is such a notification, it can be received through the _noti_cb() function after the _on_state_registered() function returns. Once the request for unread notifications is successfully delivered, PUSH_SERVICE_ERROR_NONE is returned.

    • -
    • If the application is newly registered, send the registration ID issued by the push server to your application server. -

      Retrieve the registration ID from the push_conn connection handle. If the ID is new or updated, you need to send it to your application server. This ID is used as a destination address to the application in a particular device. If the application has already sent the ID, you can skip this step. This logic is implemented in the _send_reg_id_if_necessary() function.

    • -
    - -
    -static void
    -_on_state_registered(void *user_data)
    -{
    -    int ret;
    -    char *reg_id = NULL;
    -    char *app_id = NULL;
    -
    -    /* Request unread notifications to the push service */
    -    /* _noti_cb() is called if there are unread notifications */
    -    ret = push_service_request_unread_notification(push_conn);
    -
    -    /* Get the registration ID */
    -    ret = push_service_get_registration_id(push_conn, &reg_id);
    -    if (ret != PUSH_SERVICE_ERROR_NONE) {
    -        dlog_print(DLOG_ERROR, LOG_TAG, "ERROR [%d]: push_service_get_registration_id()", ret);
    -
    -        return;
    -    }
    -
    -    /* Send reg_id to your application server if necessary */
    -    _send_reg_id_if_necessary(reg_id);
    -
    -    if (reg_id)
    -        free(reg_id);
    -}
    -
    - -

    Compute the hash value of the ID and compare it with the existing hash value in the _send_reg_id_if_necessary() function:

    -
    • If they are different, send the current registration ID to your application server and store the new hash value. For security, it is not safe to keep the ID as a string because it can be easily exposed.
    • -
    • If they are the same, the application server already has this registration ID. In this case, the application exits this function.
    - -
    -#include <openssl/sha.h>
    -#define PUSH_HASH_KEY "existing_push_reg_id"
    -
    -static void
    -_send_reg_id_if_necessary(const char *reg_id)
    -{
    -    unsigned char md[SHA_DIGEST_LENGTH];
    -    char hash_string[2*SHA_DIGEST_LENGTH+1];
    -    char *buf_ptr = hash_string;
    -    char *stored_hash_value = NULL;
    -    int ret;
    -    int i;
    -
    -    /* Generate a hash string from reg_id */
    -    SHA1((unsigned char *)reg_id, sizeof(reg_id), md);
    -
    -    /* Convert byte array to hex string */
    -    for (i = 0; i < SHA_DIGEST_LENGTH; i++)
    -        buf_ptr += sprintf(buf_ptr, "%02X", md[i]);
    -    hash_string[2*SHA_DIGEST_LENGTH] = '\0';
    -
    -    /* Get the saved hash string */
    -    ret = preference_get_string(PUSH_HASH_KEY, &stored_hash_value);
    -
    -    /*
    -       If there is no hash string stored before or
    -       if the stored hash string is different from the new one,
    -       send reg_id to the server
    -    */
    -    if (ret != PREFERENCE_ERROR_NONE || strncmp(stored_hash_value, hash_string, 2*SHA_DIGEST_LENGTH) !=0) {
    -        /* Send the reg_id to your application server */
    -        ret = _send_reg_id(reg_id);
    -
    -        /* If reg_id is successfully sent, store the new hash value */
    -        if (!ret)
    -            ret = preference_set_string(PUSH_HASH_KEY, hash_string);
    -    }
    -    if (stored_hash_value)
    -        free(stored_hash_value);
    -
    -    return;
    -}
    -
    -
  4. - -
  5. Request deregistration. -

    When the application no longer wants to receive push notifications, use the following function to request deregistration.

    - -
    -push_service_deregister(push_conn, _dereg_result_cb, NULL);
    -
    - -

    This function is non-blocking. If it returns PUSH_SERVICE_ERROR_NONE, the request is successfully received by the push service. The result of this request is returned in the _dereg_result_cb() callback function.

    - - - - - - - - - - -
    Note
    The push_service_deregister() function is not used, if the application is intended to receive push notifications continuously while it is installed on the device. When the application is uninstalled, the push service detects the event and deregisters the application automatically.

    On the other hand, if the application wants to receive push notifications only when a user logs in, the push_service_deregister() function must be called whenever a user logs out.

    - -
  6. -
- - -

Managing Security

- -

When you send a notification with sensitive information, be aware of the chance that the notification gets hijacked by someone else. It is your responsibility to keep such sensitive information safe from malicious access. The following rules are strongly recommended:

- -
    -
  • Keep the push application ID confidential. -

    If it is exposed, hackers can try to hijack notifications using a fake application with the exposed ID.

  • -
  • Do not store the registration ID on the device. -

    The registration ID can be seen as a destination address of the notifications. Without the ID, hackers cannot send fake notifications to your application.

  • -
  • Encrypt sensitive information. -

    When you send sensitive information, such as personal information and financial transactions, encrypt it and load it to the notification as a payload. Do not load the information to the message field of the notification. When the notification arrives at the device, the application decrypts the payload and retrieves the sensitive information.

  • -
  • Do not hardcode the AppSecret in the source code. -

    The AppSecret is a key to accessing the push server for sending notifications. If notifications are sent from your application server, the application does not need to know the AppSecret at all. Keep the AppSecret in the server and do not load any related information in the application. If you want device-to-device notification delivery without your application server, the application needs the AppSecret to send a notification from a device. In this case, it is your responsibility to keep the AppSecret safe.

  • -
- - -

Sending Push Notifications

- -

Once the application successfully sends its registration ID to the application server, you are ready to send push notifications from the application server to the application on that particular device. This use case describes how to send a simple push notification to the device. For advanced features, see the Push Server guide for server developers.

- -

The following example shows a sample push notification:

-
    -
  • URI: See the Push server URL table.
  • -
  • Method: HTTP POST
  • -
  • Header: -
    -appID: 1234567890987654
    -appSecret: dYo/o/m11gmWmjs7+5f+2zLNVOc=
    -
    -
  • -
  • Body: -
    -{
    -    "regID": "0501a53f4affdcbb98197f188345ff30c04b",
    -    "requestID": "01231-22EAX-223442",
    -    "message": "badgeOption=INCREASE&badgeNumber=1&action=ALERT&alertMessage=Hi",
    -    "appData": "{id:asdf&passwd:1234}", /* Optional, if the message field is not empty */
    -}
    -
  • -
- -

To send a notification:

- -
    -
  1. Prepare the appID, appSecret, regID, and requestID: -
      -
    • The appID and appSecret values are from the email that you received when requesting permission to Tizen push servers.
    • -
    • The regID value is the one that the application server received from your application installed in a Tizen device. Depending on the regID value, the URI of the server to which your application server sends the notification varies.
    • -
    • The requestID value is used to identify the notification in the push server. When your application server sends notifications using the same requestID value, the last notification overwrites all the previous notifications that are not delivered yet.
    • -
    -
  2. - -
  3. Use the message field to describe how to process the notification. -

    The message field contains not only the message to show in the quick panel on the device, but also the behaviors that the device must take when receiving the notification. The message field is a string that consists of key-value pairs. The available pair options are given in the following table.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table: Message field key-value pairs
    KeyValueDescription
    actionALERT: Store the message and alert the user. -

    SILENT: Store the message without alerting the user.

    -

    DISCARD: Discard the message.

    -

    LAUNCH: Forcibly launch the application and deliver the notification.

    Action to be performed if the application is not running. If no action is defined, the default behavior is SILENT.
    alertMessageUp to 127 bytesAlert message shown to the user in the quick panel. If the action is not set as ALERT, this value is meaningless.
    badgeOptionINCREASE: Increase the badge number by the given value. -

    DECREASE: Decrease the badge number by the given value.

    -

    SET: Set badge number to the given value.

    Option for updating the icon badge number. If the action is set as DISCARD, the badgeOption is ignored. If the badge option is not included, the icon badge number remains unchanged.
    badgeNumber0-999-
    - -

    For example, to show a "Hi" message in the quick panel and increase the badge count by 1 when the notification arrives at the device, the message field of the notification must be the following:

    - -
    -"badgeOption=INCREASE&badgeNumber=1&action=ALERT&alertMessage=Hi"
    -
    - -

    If you want to deliver the notification directly to your application, the message field must be the following:

    -
    -"action=LAUNCH"
    -
    -

    When the push service in the target device receives a notification with this message, it launches your application and delivers the notification through an Application Controls. Your application can get the notification using the push_service_app_control_to_notification() function. For more information, see how to receive notifications when the application is not running.

    - -

    The message field takes effect only when the application is not running (more precisely, when the application is not connected to the push service). If a notification with the above message field arrives at the device where the application is running, the push service delivers the notification directly to the application. It does not show the "Hi" message in the quick panel or increase the badge count.

    -
  4. -
  5. Load your own data to the appData field as a string. -

    This use case focuses on how an application developer can construct a notification. For advanced features, see the Push Server guide for server developers.

    -
  6. -
- -

Receiving Push Notifications

- -

When a notification arrives at the device, its delivery mechanism depends on whether the application is running.

- -

To handle incoming push notifications:

- -
    -
  • Receive notifications when the application is running. -

    When a notification arrives to the application while it is running (precisely, the application is connected to the service), the _noti_cb() function is called as defined in the push_service_connect() function. In this callback, you can handle the received notification.

    -

    The following example shows how the application can retrieve the app data (payload), message, and timestamp from the received notification. When the _noti_cb() callback is called, obtain the notification through the first parameter. You can retrieve the app data, message, and time stamp from the handle using the push_service_get_notification_data(), push_service_get_notification_message(), and push_service_get_notification_time() functions respectively. Before exiting the function, free the data, except for the notification itself. The notification is freed automatically right after the callback.

    - -
    -static void
    -_noti_cb(push_service_notification_h noti, void *user_data)
    -{
    -    int ret;
    -
    -    char *data=NULL; /* App data loaded on the notification */
    -    char *msg=NULL; /* Noti message */
    -    long long int time_stamp; /* Time when the noti is generated */
    -    char *sender=NULL; /* Optional sender information */
    -    char *session_info=NULL; /* Optional session information */
    -    char *request_id=NULL; /* Optional request ID */
    -    int type=0; /* Optional type information */
    -
    -    /* Retrieve app data from noti */
    -    ret = push_service_get_notification_data(noti, &data);
    -    /* Decrypt app data here if it is encrypted */
    -
    -    /* Retrieve notification message from noti */
    -    ret = push_service_get_notification_message(noti, &msg);
    -
    -    /* Retrieve the time when notification is created from noti */
    -    ret = push_service_get_notification_time(noti, &time_stamp);
    -
    -    /* Retrieve the optional information */
    -    ret = push_service_get_notification_sender(noti, &sender);
    -    ret = push_service_get_notification_session_info(noti, &session_info);
    -    ret = push_service_get_notification_request_id(noti, &request_id);
    -    ret = push_service_get_notification_type(noti, &type);
    -
    -    /*
    -       Use data, msg, time_stamp, sender,
    -       session_info, request_id, and type as needed
    -    */
    -
    -    /* Free all resources */
    -    /* Do not free noti in the callback function */
    -    if (data)
    -        free(data);
    -    if (msg)
    -        free(msg);
    -    if (sender)
    -        free(sender);
    -    if (session_info)
    -        free(session_info);
    -    if (request_id)
    -        free(request_id);
    -}
    -
    -
  • - -
  • Receive notifications when the application is not running. -

    If the notification arrives when the application is not running, there are 3 ways to handle the notification:

    -
      -
    • Forcibly launch the application and deliver the notification to it. -

      You need to set the action to LAUNCH in the message field when sending the notification from the application server. When the notification action arrives at the device, the push service forcibly launches the application and delivers the notification as a bundle.

      -

      When you create a project in the Tizen Studio, the app_control() function is created automatically. When the application is launched by another application or process (in this case, by the push service), all related information regarding this launch request is delivered through the app_control parameter. From this handle, retrieve the op operation using the app_control_get_operation() function. With app_control and op, retrieve the notification data using the push_service_app_control_to_noti_data() function.

      -

      If the application is not launched by the push service, this function returns as NULL.

      - -
      -static void
      -app_control(app_control_h app_control, void *data)
      -{
      -    char *op = NULL;
      -    push_service_notification_h noti = NULL;
      -    int ret;
      -
      -    if (app_control_get_operation(app_control, &op) < 0)
      -        return;
      -
      -    /* Retrieve the noti from the bundle */
      -    ret = push_service_app_control_to_notification(app_control, op, &noti);
      -
      -    if (noti) {
      -        /* Handle the noti */
      -
      -        /* Free the noti */
      -        push_service_free_notification(noti);
      -    } else {
      -        /* Case when the application is not launched by the push service */
      -    }
      -    if (op)
      -        free(op);
      -}
      -
    • -
    • Store the notification at the push service database and request it later when the application is launched. -

      You need to set the action to ALERT or SILENT in the message field when sending the notification from the application server. When such a notification arrives at the device, the push service keeps the notification in the database and waits for the request from the application.

      -

      The difference between the ALERT and SILENT actions is that the former shows an alert message in the quick panel and changes the badge count, while the latter does not. If the user clicks the alert message in the quick panel, the push service forcibly launches the application and delivers the notification through the app control callback function.

    • -
    • Discard it. -

      You need to set the action to DISCARD in the message field when sending the notification from the application server. When such a notification arrives at the device, the push service discards the notification unless the application is running.

    • -
    -
  • - -
  • Request unread notifications. - -

    If the user does not launch the application from the quick panel, the application requests the unread notifications after start-up using the asynchronous push_service_request_unread_notification() function.

    -

    The following example shows a synchronous request using the push_service_get_unread_notification() function:

    - -
    -push_service_notification_h noti;
    -int ret;
    -do {
    -    ret = push_service_get_unread_notification(push_conn, &noti);
    -
    -    /* Process the unread message noti */
    -
    -    push_server_free_notification(&noti);
    -} while (1);
    -
    - -

    Call this function repeatedly until no notification is returned. If there are multiple unread notifications, the notifications are retrieved in their arrival order.

    -

    The push_service_get_unread_notification() function blocks the code while it receives a notification from the service. Unless you need this kind of synchronous behavior, use the asynchronous function.

    - - -
  • -
- - - -
- -Go to top - - - - - - + + + + + + + + + + + + + Push + + + +
+
+

Mobile native Wearable native

+
+ +
+

Dependencies

+
    +
  • Tizen 2.3 and Higher for Mobile
  • +
  • Tizen 2.3.1 and Higher for Wearable
  • +
+

Content

+ +

Related Info

+ +
+
+ +
+

Push

+ +

Push enables you to push events from an application server to your application on a Tizen device.

+ +

Once your application is successfully registered in the push server through the push service (daemon) on the device, your application server can send push messages to the application in that particular device.

+

When a push message arrives when the application is running, it is automatically delivered to the application. If not, the push service makes a sound or vibrates and adds a ticker or a badge notification to notify the user. By touching this notification, the user can check the message. The application server may send a message with a LAUNCH option. In this case, the push service forcibly launches the application and hands over the message to the application as an application control.

+ +

To use the push messaging service, the application needs the permission to access the Tizen push server. Request the permission from the Tizen push service team by email, including the necessary information. When the team approves the request, you receive a push app ID corresponding to your package ID.

+ +

Remember to take care of security issues when sending notifications with sensitive information.

+ +

Figure: Push messaging service

+

Push messaging service

+ +

Service Architecture

+

The following figure illustrates the service architecture of the Tizen push messaging service.

+

Figure: Service architecture

+

Service architecture

+

The following steps illustrate a typical scenario for using the push messaging service on a Tizen device:

+
    +
  1. The application on the device registers for the push messaging service. Before you start, remember to prepare your application to use the push functionality.
  2. +
  3. When an application is installed and launched, the device establishes a push session with the Tizen Server by sending a registration request to the Tizen push server through the push service. +

    The push session is managed by the Tizen server and device platform, so there is no need to create any code to manage it within the application.

  4. +
  5. If the registration request is approved, the application receives through the push service a registration ID. The registration ID is a unique key used to identify the application installed in that particular device and route the push message. +

    The application delivers the registration ID to the application server. This registration ID is used to identify the application installed in that particular device.

  6. +
  7. When the application server needs to send a push message to the application in the particular device, it calls the Tizen server's open API to send the message together with the registration ID. (For more information for server developers about sending push messages, see Sending Push Notifications.) +

    A text message of up to 1024 bytes can be sent in a push message. If the application needs to download a large amount of data, the application server sends a link to the data in the push message.

    +
  8. +
  9. When the Tizen push server receives the message and the registration ID, it checks which device has the application with the particular registration ID and then routes the message to that device.
  10. +
  11. When the push service receives the message and the registration ID, it sends the message to the destination application, which receives the push message.
  12. +
+ +

Warm-up

+

Become familiar with the Push API basics by learning about:

+ + +

Prerequisites

+ +

To enable your application to use the push functionality:

+
    +
  1. +

    To use the Push API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the tizen-manifest.xml file:

    +
    +<privileges>
    +   <privilege>http://tizen.org/privilege/push</privilege>
    +</privileges>
    +
    +
  2. +
  3. +

    Make sure the following requirements are fulfilled:

    +
      +
    1. Internet access +

      To connect to the Tizen push server and receive notifications from it, the target device or emulator must be able to contact any IP address with the port 5223. If you are in an enterprise network, ensure that the proxy setting in your local network allows outgoing traffic destined for this port number.

    2. +
    3. Package ID +

      When you create a project in the Tizen Studio, you are given the package ID (randomly generated by the Tizen Studio or entered by yourself). The Tizen push server identifies your applications using the package ID.

    4. +
    5. Permission to Tizen push servers +

      To use the push messaging service, the application needs the permission to access the Tizen push server. Request the permission from the Tizen push service team by email, including the following information. When the team approves the request, you receive a push app ID corresponding to your package ID.

      +

      By sending the application, you agree to the Terms of Service and Privacy Policy.

      +
    6. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table: Request form details
    Developer information
    Email addressYour email address to receive the approval response.
    Last nameYour last name.
    First nameYour first name.
    CountryYour country of residence.
    Application information
    Package IDThe ID of the application package that uses the push messaging service. The package ID can be obtained from the application manifest file in the Tizen Studio.
    Application nameName of the application that uses the push service.
    Application typeNative application or Web application.
    Testing purpose Yes or no. If you request the service for testing purposes only, the duration of the push service is limited to 3 weeks.
    Purpose of the push notification usage Description of how you plan to use the push service, including the situations in which you want to use it.
    Application launch date Application launch date in the YYYY/MM/DD format. For example: 2014/08/01.
    Service area/countryService area, such as Asia, Africa, America, Europe, or the country where the application is used.
    Daily push requestsEstimated number of daily notifications.
    Transactions per second Estimated peak number of transactions per second (the recommendation is below 100).
    +
  4. + +
  5. To use the functions and data types of the Push API, include the <push-service.h> header file to your application:

    + +
    +#include <push-service.h>
    +
    +
  6. + +
  7. Since Tizen 3.0, the push service supports launching an application in the background. Remember that you can deliver application data to your application without an unwanted UI launch.

    +
  8. +
+ +

Connecting to the Push Service

+ +

To request or receive push notifications, establish a socket connection to the push service. All the information regarding this connection must be controlled by a connection handle which can be defined as a global variable:

+ +
+push_service_connection_h push_conn;
+
+ +

To manage push service connections:

+
    +
  1. Connect to the push service. +

    Once the connection handle is defined, use the push_service_connect() function to connect to the push service:

    + +
    +#define PUSH_APP_ID "YOUR_PUSH_ID_HERE"
    +
    +static bool
    +app_create(void *data)
    +{
    +    int ret;
    +
    +    /* Connect to the push service when the application is launched */
    +    ret = push_service_connect(PUSH_APP_ID, _state_cb, _noti_cb, NULL, &push_conn);
    +
    +    if (ret != PUSH_SERVICE_ERROR_NONE) {
    +        dlog_print(DLOG_ERROR, LOG_TAG, "push_service_connect() Failed");
    +        push_conn = NULL;
    +
    +        return false;
    +    }
    +
    +    /* UI implementation here */
    +
    +    return true;
    +}
    +
    + +

    In the above example, the application establishes a socket connection to the push service:

    +
      +
    • The YOUR_PUSH_ID_HERE parameter is the push app ID received from the Tizen push server team when the access to the server was requested. Keep this push app ID confidential, otherwise your push notifications can be hijacked by malicious applications.
    • +
    • The _state_cb() and _noti_cb() parameters are callback functions called when the state changes or a notification arrives from the server through the push service.
    • +
    • The push_conn parameter is the output of the push_service_connect() function. If the connection between the application and the service is successful, the push_service_connect() function returns PUSH_SERVICE_ERROR_NONE and the push_conn connection handle is returned through the last parameter. If the push_service_connect() function returns other values, the connection to the service failed. This happens most likely when the push privilege is not added in the Tizen Studio.
    • +
    + +

    This sample application establishes a connection to the service when it is launched and disconnects from the service when it terminates. Due to this, the push_service_connect() function is located in the app_create() function, which is called when the application is launched. +

    +

    The application can be resumed after being paused. To ensure that push notifications are handled fluently, the push_service_connect() function must be located in the app_resume() function. For more information, see the following example.

    +
    +static void
    +app_resume(void *data)
    +{
    +    /* Take necessary actions when application becomes visible */
    +
    +    int ret;
    +    if (!push_conn) {
    +        ret = push_service_connect(PUSH_APP_ID, _state_cb, _noti_cb, NULL, &push_conn);
    +        if (ret != PUSH_SERVICE_ERROR_NONE){
    +            dlog_print(DLOG_ERROR, LOG_TAG, "ERROR : push_service_connect() is failed.");
    +            push_conn = NULL;
    +
    +            return;
    +        }
    +    }
    +
    +    /*
    +       If the connection with the push service succeeds,
    +       the application must request the unread notification messages
    +       which are sent during the disconnected state
    +    */
    +    ret = push_service_request_unread_notification(push_conn);
    +    if (ret != PUSH_SERVICE_ERROR_NONE)
    +        dlog_print(DLOG_ERROR, LOG_TAG, "ERROR : push_service_request_unread_notification() is failed.");
    +}
    +
    +
  2. + + +
  3. Disconnect from the push service. +

    When the application terminates or no longer uses the push service, close the connection using the push_service_disconnect() function.

    + +

    The push_service_disconnect() function closes the existing connection associated with the push_conn handle and returns all the resources allocated for the connection.

    + +
    +static void
    +app_terminate(void *data)
    +{
    +    /* Release all push messages */
    +
    +    if (push_conn)
    +        push_service_disconnect(push_conn);
    +
    +    push_conn = NULL;
    +}
    +
    + +

    The connection is automatically closed when the application terminates. Hence, if the application uses the push service while being launched, it does not need this function.

    + +

    The application can also disconnect the service in the middle of the application operation. If you add a toggle switch to the application for switching the push service on and off, call this function when the service is switched off. Do not call this function inside any push callback functions, however, since it can cause the application to crash.

    +

    The application can be paused by pressing home or back key. For a proper push operation, the push_service_disconnect() function must be located in the app_pause() function.

    +
    +static void
    +app_pause(void *data)
    +{
    +    if (push_conn)
    +        push_service_disconnect(push_conn);
    +
    +    push_conn = NULL;
    +}
    +
    +
  4. + +
  5. Handle state transitions. +

    After the connection to the service is made, the application is notified whenever the connection state changes. This notification is conducted through the _state_cb() callback, which is defined in the push_service_connect() function. The following figure illustrates the possible states.

    + +

    State transitions

    + +

    Once launched, the application is in the INITIAL state. When the application establishes a connection to the service using the push_service_connect() function, the state becomes either UNREGISTERED or REGISTERED:

    +
    • If the application is currently registered to the push server, the service forces it to transit from the INITIAL state to the REGISTERED state. In this case, the application can request deregistration from the push server using the push_service_deregister() function. If this request is approved by the push server, the state transits to UNREGISTERED.
    • +
    • If the application is not currently registered to the push server, the state transits from the INITIAL state to the UNREGISTERED state. In this case, the application can request registration to the push server using the push_service_register() function. If this request is approved by the push server, the state transits to REGISTERED.
    • +
    • When an error occurs, the state transits to ERROR.
    + +

    When the current state transits, the _state_cb() function is called and the new state is obtained from the first parameter. Determine the application actions based on the new state:

    + +
    +static void
    +_state_cb(push_service_state_e state, const char *err, void *user_data)
    +{
    +    switch (state) {
    +    case PUSH_SERVICE_STATE_UNREGISTERED:
    +        dlog_print(DLOG_INFO, LOG_TAG, "Arrived at STATE_UNREGISTERED");
    +        _on_state_unregistered(user_data);
    +        break;
    +    case PUSH_SERVICE_STATE_REGISTERED:
    +        dlog_print(DLOG_INFO, LOG_TAG, "Arrived at STATE_REGISTERED");
    +        _on_state_registered(user_data);
    +        break;
    +    case PUSH_SERVICE_STATE_ERROR:
    +        dlog_print(DLOG_INFO, LOG_TAG, "Arrived at STATE_ERROR");
    +        _on_state_error(err, user_data);
    +        break;
    +    default:
    +        dlog_print(DLOG_INFO, LOG_TAG, "Unknown State");
    +        break;
    +    }
    +}
    +
    + +

    In the above example, the _on_state_registered(), _on_state_unregistered(), and _on_state_error() functions contain the actions for the REGISTERED, UNREGISTERED, and ERROR states, respectively. The application does not need to handle the INITIAL state, because it is maintained internally, and this callback function is never invoked in that state. The second parameter, err, is the error message from the push service when the state becomes ERROR. Consequently, only the _on_state_error() function takes this parameter.

    +

    The registration state is subject to change. Consequently, make sure that the application connects to the push service whenever it is launched.

    +
  6. +
+ +

Registering with the Push Server

+ +

To receive push notifications, the application must send a registration request to the Tizen push server. When the server receives this request, it assigns a registration ID that is unique to the application on the particular device. When sending a notification from your application server, this registration ID is used as a destination address of the application. If the application no longer needs to receive push notifications, it needs to send a deregistration request to the server.

+

To register with the push server:

+
    +
  1. Request registration. +

    After connecting to the push service, request registration using the push_service_register() function.

    +

    The first parameter is the connection handle that was returned from the push_service_connect() function, and the second parameter is the callback function that returns the result of the registration request.

    + +
    +#define PUSH_HASH_KEY "existing_push_reg_id"
    +
    +static void
    +_on_state_unregistered(void *user_data)
    +{
    +    int ret;
    +
    +    /* Reset the previously-stored registration ID */
    +    ret = preference_set_string(PUSH_HASH_KEY, "");
    +    if (ret != PREFERENCE_ERROR_NONE)
    +        dlog_print(DLOG_ERROR, LOG_TAG, "ERROR: Fail to initialize hash_value [%d : %s]", ret, get_error_message(ret));
    +
    +    /* Send a registration request to the push service */
    +    ret = push_service_register(push_conn, _result_cb, user_data);
    +}
    +
    + +

    The _on_state_unregistered() function containing the push_service_register() function is called when the state transits to UNREGISTERED. This sample application is designed to send the registration request as soon as it is connected to the push service. If the application requires users to login to the service, this registration request must be sent after the login process is complete.

    + +

    The registration request is non-blocking. If the push_service_register() function returns PUSH_SERVICE_ERROR_NONE, the request is successfully delivered to the push service. However, it does not necessarily mean that the request is approved by the server. If the push service successfully sends the request to the server and receives an approval, the _result_cb() callback is called with PUSH_SERVICE_RESULT_SUCCESS as the first parameter:

    + +
    +static void
    +_result_cb(push_service_result_e result, const char *msg, void *user_data)
    +{
    +    if (result == PUSH_SERVICE_RESULT_SUCCESS)
    +        dlog_print(DLOG_INFO, LOG_TAG, "Registration request is approved.");
    +    else
    +        dlog_print(DLOG_ERROR, LOG_TAG, "Registration ERROR [%s]", msg);
    +
    +    return;
    +}
    +
    + +

    When an error occurs in the middle of the registration process, the reason is returned in the first parameter of the callback. For example, if the push server is not responding, the push_service_register() function returns PUSH_SERVICE_ERROR_NONE (because delivery to the service is successful), but the _result_cb() function is called later with PUSH_SERVICE_RESULT_TIMEOUT. In this case, the application does not need to request registration again because the push service keeps the previous request and sends it when the network becomes online. The msg parameter is the error message from the push service if the request fails.

    +
  2. + +
  3. Handle the transit to the REGISTERED state. +

    The application transits to the REGISTERED state in one of the following cases:

    +
      +
    • The registration request sent at the UNREGISTERED state is approved.
    • +
    • The already-registered application at the INITIAL state is successfully connected to the push service.
    • +
    + +

    In both cases, the _state_cb() callback function is called with the PUSH_SERVICE_STATE_REGISTERED state. The application calls the _on_state_registered() function immediately, as shown in the state transitions. When defining the actions inside the function, keep the following points in mind:

    +
      +
    • If the application has already been registered, request the push service for any unread notifications that have arrived before the application is launched. +

      Request the unread notifications asynchronously. If there is such a notification, it can be received through the _noti_cb() function after the _on_state_registered() function returns. Once the request for unread notifications is successfully delivered, PUSH_SERVICE_ERROR_NONE is returned.

    • +
    • If the application is newly registered, send the registration ID issued by the push server to your application server. +

      Retrieve the registration ID from the push_conn connection handle. If the ID is new or updated, you need to send it to your application server. This ID is used as a destination address to the application in a particular device. If the application has already sent the ID, you can skip this step. This logic is implemented in the _send_reg_id_if_necessary() function.

    • +
    + +
    +static void
    +_on_state_registered(void *user_data)
    +{
    +    if (!push_conn)
    +        return;
    +
    +    int ret;
    +    char *reg_id = NULL;
    +    char *app_id = NULL;
    +
    +    /* Request unread notifications to the push service */
    +    /* _noti_cb() is called if there are unread notifications */
    +    ret = push_service_request_unread_notification(push_conn);
    +    if (ret != PUSH_SERVICE_ERROR_NONE) {
    +        dlog_print(DLOG_ERROR, LOG_TAG, "ERROR [%d]: push_service_request_unread_notification()", ret);
    +
    +        return;
    +    }
    +
    +    /* Get the registration ID */
    +    ret = push_service_get_registration_id(push_conn, &reg_id);
    +    if (ret != PUSH_SERVICE_ERROR_NONE) {
    +        dlog_print(DLOG_ERROR, LOG_TAG, "ERROR [%d]: push_service_get_registration_id()", ret);
    +
    +        return;
    +    }
    +
    +    /* Send reg_id to your application server if necessary */
    +    _send_reg_id_if_necessary(reg_id);
    +
    +    if (reg_id)
    +        free(reg_id);
    +}
    +
    + +

    Compute the hash value of the ID and compare it with the existing hash value in the _send_reg_id_if_necessary() function:

    +
    • If they are different, send the current registration ID to your application server and store the new hash value. For security, it is not safe to keep the ID as a string because it can be easily exposed.
    • +
    • If they are the same, the application server already has this registration ID. In this case, the application exits this function.
    + +
    +#include <openssl/sha.h>
    +#define PUSH_HASH_KEY "existing_push_reg_id"
    +
    +static void
    +_send_reg_id_if_necessary(const char *reg_id)
    +{
    +    unsigned char md[SHA_DIGEST_LENGTH];
    +    char hash_string[2*SHA_DIGEST_LENGTH+1];
    +    char *buf_ptr = hash_string;
    +    char *stored_hash_value = NULL;
    +    int ret;
    +    int i;
    +
    +    /* Generate a hash string from reg_id */
    +    SHA1((unsigned char *)reg_id, sizeof(reg_id), md);
    +
    +    /* Convert byte array to hex string */
    +    for (i = 0; i < SHA_DIGEST_LENGTH; i++)
    +        buf_ptr += sprintf(buf_ptr, "%02X", md[i]);
    +    hash_string[2*SHA_DIGEST_LENGTH] = '\0';
    +
    +    /* Get the saved hash string */
    +    ret = preference_get_string(PUSH_HASH_KEY, &stored_hash_value);
    +
    +    /*
    +       If there is no hash string stored before or if the stored hash string
    +       is different from the new one, send reg_id to the server
    +    */
    +    if (ret != PREFERENCE_ERROR_NONE || strncmp(stored_hash_value, hash_string, 2*SHA_DIGEST_LENGTH) !=0) {
    +        /* Send the reg_id to your application server */
    +        ret = _send_reg_id(reg_id);
    +
    +        /* If reg_id is successfully sent, store the new hash value */
    +        if (!ret)
    +            ret = preference_set_string(PUSH_HASH_KEY, hash_string);
    +    }
    +    if (stored_hash_value)
    +        free(stored_hash_value);
    +
    +    return;
    +}
    +
    +
  4. + +
  5. Request deregistration. +

    When the application no longer wants to receive push notifications, use the following function to request deregistration.

    + +
    +push_service_deregister(push_conn, _dereg_result_cb, NULL);
    +
    + +

    This function is non-blocking. If it returns PUSH_SERVICE_ERROR_NONE, the request is successfully received by the push service. The result of this request is returned in the _dereg_result_cb() callback function.

    + + + + + + + + + + +
    Note
    The push_service_deregister() function is not used, if the application is intended to receive push notifications continuously while it is installed on the device. When the application is uninstalled, the push service detects the event and deregisters the application automatically.

    On the other hand, if the application wants to receive push notifications only when a user logs in, the push_service_deregister() function must be called whenever a user logs out.

    + +
  6. +
+ + +

Managing Security

+ +

When you send a notification with sensitive information, be aware of the chance that the notification gets hijacked by someone else. It is your responsibility to keep such sensitive information safe from malicious access. The following rules are strongly recommended:

+ +
    +
  • Keep the push application ID confidential. +

    If it is exposed, hackers can try to hijack notifications using a fake application with the exposed ID.

  • +
  • Do not store the registration ID on the device. +

    The registration ID can be seen as a destination address of the notifications. Without the ID, hackers cannot send fake notifications to your application.

  • +
  • Encrypt sensitive information. +

    When you send sensitive information, such as personal information and financial transactions, encrypt it and load it to the notification as a payload. Do not load the information to the message field of the notification. When the notification arrives at the device, the application decrypts the payload and retrieves the sensitive information.

  • +
  • Do not hardcode the AppSecret in the source code. +

    The AppSecret is a key to accessing the push server for sending notifications. If notifications are sent from your application server, the application does not need to know the AppSecret at all. Keep the AppSecret in the server and do not load any related information in the application. If you want device-to-device notification delivery without your application server, the application needs the AppSecret to send a notification from a device. In this case, it is your responsibility to keep the AppSecret safe.

  • +
+ + +

Sending Push Notifications

+ +

Once the application successfully sends its registration ID to the application server, you are ready to send push notifications from the application server to the application on that particular device. This use case describes how to send a simple push notification to the device. For advanced features, see the Push Server guide for server developers.

+ +

The following example shows a sample push notification:

+
    +
  • URI: See the Push server URL table.
  • +
  • Method: HTTP POST
  • +
  • Header: +
    +appID: 1234567890987654
    +appSecret: dYo/o/m11gmWmjs7+5f+2zLNVOc=
    +
    +
  • +
  • Body: +
    +{
    +    "regID": "0501a53f4affdcbb98197f188345ff30c04b-5001",
    +    "requestID": "01231-22EAX-223442",
    +    "message": "badgeOption=INCREASE&badgeNumber=1&action=ALERT&alertMessage=Hi",
    +    "appData": "{id:asdf&passwd:1234}", /* Optional, if the message field is not empty */
    +}
    +
  • +
+ +

To send a notification:

+ +
    +
  1. Prepare the appID, appSecret, regID, and requestID: +
      +
    • The appID and appSecret values are from the email that you received when requesting permission to Tizen push servers.
    • +
    • The regID value is the one that the application server received from your application installed in a Tizen device. Depending on the regID value, the URI of the server to which your application server sends the notification varies. +

      Since Tizen 3.0, the format of the regID is changed to support multiple users. A hyphen and the application's UID are added at the end of the regID.

      +
    • +
    • The requestID value is used to identify the notification in the push server. When your application server sends notifications using the same requestID value, the last notification overwrites all the previous notifications that are not delivered yet.
    • +
    +
  2. + +
  3. Use the message field to describe how to process the notification. +

    The message field contains not only the message to show in the quick panel on the device, but also the behaviors that the device must take when receiving the notification. The message field is a string that consists of key-value pairs. The available pair options are given in the following table.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table: Message field key-value pairs
    KeyValueDescription
    actionALERT: Store the message and alert the user. +

    SILENT: Store the message without alerting the user.

    +

    DISCARD: Discard the message, if the application is not up and running.

    +

    LAUNCH: Forcibly launch the application and deliver the notification.

    +

    BACKGROUNDLAUNCH: Launch the application in the background and deliver the notification. (Since Tizen 3.0)

    Action to be performed if the application is not running. If no action is defined, the default behavior is SILENT.
    alertMessageUp to 127 bytesAlert message shown to the user in the quick panel. If the action is not set as ALERT, this value is meaningless.
    badgeOptionINCREASE: Increase the badge number by the given value. +

    DECREASE: Decrease the badge number by the given value.

    +

    SET: Set badge number to the given value.

    Option for updating the icon badge number. If the action is set as DISCARD, the badgeOption is ignored. If the badge option is not included, the icon badge number remains unchanged.
    badgeNumber0-999-
    + +

    For example, to show a "Hi" message in the quick panel and increase the badge count by 1 when the notification arrives at the device, the message field of the notification must be the following:

    + +
    +"badgeOption=INCREASE&badgeNumber=1&action=ALERT&alertMessage=Hi"
    +
    + +

    If you want to deliver the notification directly to your application, the message field must be the following:

    +
    +"action=LAUNCH"
    +
    +

    When the push service in the target device receives a notification with this message, it launches your application and delivers the notification through an Application Controls. Your application can get the notification using the push_service_app_control_to_notification() function. For more information, see how to receive notifications when the application is not running.

    + +

    The message field takes effect only when the application is not running (more precisely, when the application is not connected to the push service). If a notification with the above message field arrives at the device where the application is running, the push service delivers the notification directly to the application. It does not show the "Hi" message in the quick panel or increase the badge count.

    +
  4. +
  5. Load your own data to the appData field as a string. +

    This use case focuses on how an application developer can construct a notification. For advanced features, see the Push Server guide for server developers.

    +
  6. +
+ +

Receiving Push Notifications

+ +

When a notification arrives at the device, its delivery mechanism depends on whether the application is running.

+ +

To handle incoming push notifications:

+ +
    +
  • Receive notifications when the application is running. +

    When a notification arrives to the application while it is running (precisely, the application is connected to the service), the _noti_cb() function is called as defined in the push_service_connect() function. In this callback, you can handle the received notification.

    +

    The following example shows how the application can retrieve the app data (payload), message, and timestamp from the received notification. When the _noti_cb() callback is called, obtain the notification through the first parameter. You can retrieve the app data, message, and time stamp from the handle using the push_service_get_notification_data(), push_service_get_notification_message(), and push_service_get_notification_time() functions respectively. Before exiting the function, free the data, except for the notification itself. The notification is freed automatically right after the callback.

    + +
    +static void
    +_noti_cb(push_service_notification_h noti, void *user_data)
    +{
    +    int ret;
    +
    +    char *data=NULL; /* App data loaded on the notification */
    +    char *msg=NULL; /* Noti message */
    +    long long int time_stamp; /* Time when the noti is generated */
    +    char *sender=NULL; /* Optional sender information */
    +    char *session_info=NULL; /* Optional session information */
    +    char *request_id=NULL; /* Optional request ID */
    +
    +    /* Retrieve app data from noti */
    +    ret = push_service_get_notification_data(noti, &data);
    +    /* Decrypt app data here if it is encrypted */
    +
    +    /* Retrieve notification message from noti */
    +    ret = push_service_get_notification_message(noti, &msg);
    +
    +    /* Retrieve the time when notification is created from noti */
    +    ret = push_service_get_notification_time(noti, &time_stamp);
    +
    +    /* Retrieve the optional information */
    +    ret = push_service_get_notification_sender(noti, &sender);
    +    ret = push_service_get_notification_session_info(noti, &session_info);
    +    ret = push_service_get_notification_request_id(noti, &request_id);
    +
    +    /*
    +       Use data, msg, time_stamp, sender,
    +       session_info, and request_id as needed
    +    */
    +
    +    /* Free all resources */
    +    /* Do not free noti in the callback function */
    +    if (data)
    +        free(data);
    +    if (msg)
    +        free(msg);
    +    if (sender)
    +        free(sender);
    +    if (session_info)
    +        free(session_info);
    +    if (request_id)
    +        free(request_id);
    +}
    +
    +
  • + +
  • Receive notifications when the application is not running. +

    If the notification arrives when the application is not running, there are 3 ways to handle the notification:

    +
      +
    • Forcibly launch the application and deliver the notification to it. +

      You need to set the action to LAUNCH in the message field when sending the notification from the application server. When the notification action arrives at the device, the push service forcibly launches the application and delivers the notification as a bundle.

      +

      When you create a project in the Tizen Studio, the app_control() function is created automatically. When the application is launched by another application or process (in this case, by the push service), all related information regarding this launch request is delivered through the app_control parameter. From this handle, retrieve the op operation using the app_control_get_operation() function. With app_control and op, retrieve the notification data using the push_service_app_control_to_noti_data() function.

      +

      If the application is not launched by the push service, this function returns as NULL.

      + +
      +static void
      +app_control(app_control_h app_control, void *data)
      +{
      +    char *op = NULL;
      +    push_service_notification_h noti = NULL;
      +    int ret;
      +
      +    if (app_control_get_operation(app_control, &op) < 0)
      +        return;
      +
      +    /* Retrieve the noti from the bundle */
      +    ret = push_service_app_control_to_notification(app_control, op, &noti);
      +
      +    if (noti) {
      +        /* Handle the noti */
      +
      +        /* Free the noti */
      +        push_service_free_notification(noti);
      +    } else {
      +        /* Case when the application is not launched by the push service */
      +    }
      +    if (op)
      +        free(op);
      +}
      +
      + +

      Since Tizen 3.0, the push service provides launch types when the application is launched by the service. Use the following code to figure out why the application is launched, as the app_control() function is invoked in both cases of receiving notification and changing registration state.

      +
      +#define EXTRA_DATA_FROM_REGISTRATION_CHANGE "registration_change"
      +#define EXTRA_DATA_FROM_NOTIFICATION "notification"
      +
      +static void
      +app_control(app_control_h app_control, void *data)
      +{
      +    char *value = NULL;
      +    app_control_get_extra_data(app_control, APP_CONTROL_DATA_PUSH_LAUNCH_TYPE, &value);
      +    if (value) {
      +        if (!strcmp(value, EXTRA_DATA_FROM_NOTIFICATION)) {
      +            /* Add your code here when push messages arrive */
      +        } else if (!strcmp(value, EXTRA_DATA_FROM_REGISTRATION_CHANGE)) {
      +            /* Add your code here when registration state is changed */
      +        }
      +    }
      +}
      +
      +
    • + +
    • Store the notification at the push service database and request it later when the application is launched. +

      You need to set the action to ALERT or SILENT in the message field when sending the notification from the application server. When such a notification arrives at the device, the push service keeps the notification in the database and waits for the request from the application.

      +

      You can request for unread notifications from the push service. The request can be performed after connected to the push server when the application is launched.

      +
      +if (push_conn) {
      +    int ret = push_service_request_unread_notification(push_conn);
      +    if (ret != PUSH_SERVICE_ERROR_NONE)
      +        dlog_print(DLOG_ERROR, LOG_TAG, "ERROR: push_service_request_unread_notification() is failed.");
      +}
      +
      +

      The difference between the ALERT and SILENT actions is that the former shows an alert message in the quick panel and changes the badge count, while the latter does not. If the user clicks the alert message in the quick panel, the push service forcibly launches the application and delivers the notification through the app control callback function.

    • + +
    • Discard it. +

      You need to set the action to DISCARD in the message field when sending the notification from the application server. When such a notification arrives at the device, the push service delivers the notification only when the application is up and running. Otherwise, the push service does not store the notification and discards it.

    • +
    +
  • + +
  • Request unread notifications. + +

    If the user does not launch the application from the quick panel, the application requests the unread notifications after start-up using the asynchronous push_service_request_unread_notification() function.

    +

    The following example shows a synchronous request using the push_service_get_unread_notification() function:

    + +
    +push_service_notification_h noti;
    +int ret;
    +do {
    +    ret = push_service_get_unread_notification(push_conn, &noti);
    +
    +    /* Process the unread message noti */
    +
    +    push_server_free_notification(&noti);
    +} while (1);
    +
    + +

    Call this function repeatedly until no notification is returned. If there are multiple unread notifications, the notifications are retrieved in their arrival order.

    +

    The push_service_get_unread_notification() function blocks the code while it receives a notification from the service. Unless you need this kind of synchronous behavior, use the asynchronous function.

    + + +
  • +
+ + + +
+ +Go to top + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/messaging/push_server_n.htm b/org.tizen.guides/html/native/messaging/push_server_n.htm index 80ab12b..ebcc8b6 100644 --- a/org.tizen.guides/html/native/messaging/push_server_n.htm +++ b/org.tizen.guides/html/native/messaging/push_server_n.htm @@ -22,12 +22,13 @@

Dependencies

    -
  • Tizen 2.4 and Higher for Mobile
  • +
  • Tizen 2.3 and Higher for Mobile
  • Tizen 2.3.1 and Higher for Wearable

Content

Related Info

@@ -48,6 +49,8 @@ @@ -148,11 +151,12 @@ Description - action +action ALERT: Store the message and alert the user.

SILENT: Store the message without alerting the user.

-

DISCARD: Discard the message.

-

LAUNCH: Forcibly launch the application and deliver the notification.

+

DISCARD: Discard the message, if the application is not up and running.

+

LAUNCH: Forcibly launch the application and deliver the notification.

+

BACKGROUNDLAUNCH: Launch the application in the background and deliver the notification. (Since Tizen 3.0)

Action to be performed if the application is not running. If no action is defined, the default behavior is SILENT. @@ -614,6 +618,313 @@ appSecret: dYo/o/m11gmWmjs7+5f+2zLNVOc= + +

Decorating Push Notifications

+ +

Since Tizen 3.0, you can decorate push notifications you send from the application server to Tizen devices. For example, you can add images and sounds to the notifications. The push service creates a notification using the resources from the application and notifies the user. You can compose the push message using a set of REST APIs.

+

To decorate push notifications, you have to understand the notification functions. In addition to the existing message field, more fields are provided. For more details about the functions to use to create a notification, see the Notification API (in mobile and wearable applications). When you include a key and value in the message field, the push service creates a notification as the application creates a notification using the Notification API.

+

Prepare all the resource files under the /shared/res folder in your application, and you directly address the resource files. For example, imageTypeIcon=image.png means the /share/res/image.png image is displayed as an icon in the notification panel. You can perform the same action by calling the notification_set_image(noti, NOTIFICATION_IMAGE_TYPE_ICON, "image.png") function.

+ +

The following table lists the additional key and value pairs for the message field in notifications.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table: Additional message field key and value pairs for notification
KeyValueNotification functionCorresponding parameters
imageTypeIconImage file path

(for example, image.png)

notification_set_image()(noti, NOTIFICATION_IMAGE_TYPE_ICON, "image.png")
imageTypeIconForIndicator(noti, NOTIFICATION_IMAGE_TYPE_ICON_FOR_INDICATOR, "image.png")
imageTypeIconForLock(noti, NOTIFICATION_IMAGE_TYPE_ICON_FOR_LOCK , "image.png")
imageTypeThumbnail(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, "image.png")
imageTypeThumbnailForLock(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL_FOR_LOCK, "image.png")
imageTypeIconSub(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB, "image.png")
imageTypeBackground(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND, "image.png")
imageTypeList1(noti, NOTIFICATION_IMAGE_TYPE_LIST_1, "image.png")
imageTypeList2(noti, NOTIFICATION_IMAGE_TYPE_LIST_2, "image.png")
imageTypeList3(noti, NOTIFICATION_IMAGE_TYPE_LIST_3, "image.png")
imageTypeList4(noti, NOTIFICATION_IMAGE_TYPE_LIST_4, "image.png")
imageTypeList5(noti, NOTIFICATION_IMAGE_TYPE_LIST_5, "image.png")
imageTypeButton1(noti, NOTIFICATION_IMAGE_TYPE_BUTTON_1, "image.png")
imageTypeButton2(noti, NOTIFICATION_IMAGE_TYPE_BUTTON_2, "image.png")
imageTypeButton3(noti, NOTIFICATION_IMAGE_TYPE_BUTTON_3, "image.png")
imageTypeButton4(noti, NOTIFICATION_IMAGE_TYPE_BUTTON_4, "image.png")
imageTypeButton5(noti, NOTIFICATION_IMAGE_TYPE_BUTTON_5, "image.png")
imageTypeButton6(noti, NOTIFICATION_IMAGE_TYPE_BUTTON_6, "image.png")
textTypeTitleText messagenotification_set_text()(noti, NOTIFICATION_TEXT_TYPE_TITLE, "text")
textTypeContent(noti, NOTIFICATION_TEXT_TYPE_CONTENT, "text")
textTypeContentForDisplayOptionIsOff(noti, NOTIFICATION_TEXT_TYPE_CONTENT_FOR_DISPLAY_OPTION_IS_OFF, "text")
textTypeEventCount(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, "text")
textTypeInfo1(noti, NOTIFICATION_TEXT_TYPE_INFO_1, "text")
textTypeInfoSub1(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, "text")
textTypeInfo2(noti, NOTIFICATION_TEXT_TYPE_INFO_2, "text")
textTypeInfoSub2(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2, "text")
textTypeInfo3(noti, NOTIFICATION_TEXT_TYPE_INFO_3, "text")
textTypeInfoSub3(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_3, "text")
textTypeGroupTitle(noti, NOTIFICATION_TEXT_TYPE_GROUP_TITLE, "text")
textTypeGroupContent(noti, NOTIFICATION_TEXT_TYPE_GROUP_CONTENT, "text")
textTypeGroupContentForDisplayOptionIsOff(noti, NOTIFICATION_TEXT_TYPE_GROUP_CONTENT_FOR_DISPLAY_OPTION_IS_OFF, "text")
textTypeButton1(noti, NOTIFICATION_TEXT_TYPE_BUTTON_1, "text")
textTypeButton2(noti, NOTIFICATION_TEXT_TYPE_BUTTON_2, "text")
textTypeButton3(noti, NOTIFICATION_TEXT_TYPE_BUTTON_3, "text")
textTypeButton4(noti, NOTIFICATION_TEXT_TYPE_BUTTON_4, "text")
textTypeButton5(noti, NOTIFICATION_TEXT_TYPE_BUTTON_5, "text")
textTypeButton6(noti, NOTIFICATION_TEXT_TYPE_BUTTON_6, "text")
soundTypeNoneTRUEnotification_set_sound()(noti, NOTIFICATION_SOUND_TYPE_NONE, NULL)
soundTypeUserDataSound file path(noti, NOTIFICATION_SOUND_TYPE_USER_DATA, "sound_path")
vibrationTypeNoneTRUEnotification_set_vibration()(noti, NOTIFICATION_VIBRATION_TYPE_NONE, NULL)
vibrationTypeUserDataVibration file path(noti, NOTIFICATION_VIBRATION_TYPE_USER_DATA, "vib_path")
ledOpOnTRUEnotification_set_led()(noti, NOTIFICATION_LED_OP_ON, NULL)
ledOpOnCustomColorLed argument(noti, NOTIFICATION_LED_OP_ON_CUSTOM_COLOR, led_argb)
eventTypeClickOnButton1[key,value]notification_set_eventhandler()app_control_add_extra_data(appcontrol, key, value) +

notification_add_button(noti, NOTIFICATION_BUTTON_1)

+

(noti, NOTIFICATION_EVENT_TYPE_CLICK_ON_BUTTON_1, app_control)

eventTypeClickOnButton2app_control_add_extra_data(appcontrol, key, value) +

notification_add_button (noti, NOTIFICATION_BUTTON_2)

+

(noti, NOTIFICATION_EVENT_TYPE_CLICK_ON_BUTTON_2, app_control)

eventTypeClickOnButton3app_control_add_extra_data(appcontrol, key, value) +

notification_add_button (noti, NOTIFICATION_BUTTON_3)

+

(noti, NOTIFICATION_EVENT_TYPE_CLICK_ON_BUTTON_3, app_control)

eventTypeClickOnButton4app_control_add_extra_data(appcontrol, key, value) +

notification_add_button (noti, NOTIFICATION_BUTTON_4)

+

(noti, NOTIFICATION_EVENT_TYPE_CLICK_ON_BUTTON_4, app_control)

eventTypeClickOnButton5app_control_add_extra_data(appcontrol, key, value) +

notification_add_button (noti, NOTIFICATION_BUTTON_5)

+

(noti, NOTIFICATION_EVENT_TYPE_CLICK_ON_BUTTON_5, app_control)

eventTypeClickOnButton6app_control_add_extra_data(appcontrol, key, value) +

notification_add_button (noti, NOTIFICATION_BUTTON_6)

+

(noti, NOTIFICATION_EVENT_TYPE_CLICK_ON_BUTTON_6, app_control)

eventTypeClickOnIconapp_control_add_extra_data(appcontrol, key, value) +

(noti, NOTIFICATION_EVENT_TYPE_CLICK_ON_ICON, app_control)

eventTypeClickOnThumbnailapp_control_add_extra_data(appcontrol, key, value) +

(noti, NOTIFICATION_EVENT_TYPE_CLICK_ON_THUMBNAIL, app_control)

setPropertydisplayOnlySimmode|

disableAppLaunch|

disableAutoDelete|

disableUpdateOnInsert|

disableUpdateOnDelete|

volatileDisplay

notification_set_property()(noti, NOTIFICATION_PROP_DISPLAY_ONLY_SIMMODE|

NOTIFICATION_PROP_DISABLE_APP_LAUNCH|

NOTIFICATION_PROP_DISABLE_AUTO_DELETE|

NOTIFICATION_PROP_DISABLE_UPDATE_ON_INSERT|

NOTIFICATION_PROP_DISABLE_UPDATE_ON_DELETE|

NOTIFICATION_PROP_VOLATILE_DISPLAY)

lyNotiEventSingleTRUEnotification_set_layout()(noti, NOTIFICATION_LY_NOTI_EVENT_SINGLE)
lyNotiEventMultipleTRUE(noti, NOTIFICATION_LY_NOTI_EVENT_MULTIPLE)
lyNotiThumbnailTRUE(noti, NOTIFICATION_LY_NOTI_THUMBNAIL)
setDisplayApplistnotificationTray|

ticker|

lock|

indicator|

active|

all

notification_set_display_applist()(noti, NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY|

NOTIFICATION_DISPLAY_APP_TICKER|

NOTIFICATION_DISPLAY_APP_LOCK|

NOTIFICATION_DISPLAY_APP_INDICATOR|

NOTIFICATION_DISPLAY_APP_ACTIVE|

NOTIFICATION_DISPLAY_APP_ALL)

setAutoRemoveTRUEnotification_set_auto_remove()(noti, BOOL)
+ + +

The following example shows the message field for an active notification with 3 buttons:

+
+"message":"setAutoRemove=true
+&textTypeButton1=Connect&textTypeButton2=Hold&textTypeButton3=Cancel&
+eventTypeClickOnButton1=test,connect& eventTypeClickOnButton2=test,hold& 
+eventTypeClickOnButton3=test,cancel& eventTypeClickOnIcon=test,icon&
+eventTypeClickOnThumbnail=test,thumbnail&badgeOption=INCREASE&badgeNumber=1&action=ALERT&
+alertMessage=Hi& textTypeTitle=Active Notification Title&textTypeContent=Hi&
+imageTypeIcon=icon.png&imageTypeIconForIndicator=indicator.png&imageTypeThumbnail=thumbnail.png&
+imageTypeIconSub=sub.png &imageTypeBackground=background.png& soundTypeUserData=test.wav&
+setDisplayApplist=notificationTray|ticker|lock|indicator|active|all&lyNotiEventSingle=true& 
+textTypeContentForDisplayOptionIsOff=contentoptionoff& textTypeEventCount=34&textTypeInfo1=Test 
+notification&setTime=true&setTimeToText=true\"
+
+ +

The following figure shows a decorated push notification.

+ +

Push Active notification

+

Handling Error Codes

If sending a push notification request fails for some reason, the response message contains an error code. Use the following table to identify the reason for the failure and take appropriate action.

-- 2.7.4