반응형

Python 으로 간단하게 만들어본 테스트 푸시 발송 기능.


#!/usr/bin/env python

# -*- coding: utf-8 -*-

 

import socket, ssl, json, struct, time

 

 

if __name__ == '__main__':

    # host

    apnsHost = 'gateway.push.apple.com'

    # port

    apnsPort = 2195

    # dictionary type

    apnsHostPort = (apnsHost, apnsPort)

 

    # certifated file

    certFile = 'apns_production.pem'

 

    # device Token

    apnsToken = 'abcedfg0123456789'

 

    # notification payload

    apnsPayload = {

        'aps':{

            'alert': '테스트푸시 123 abc'.decode('UTF-8'),

            'sound': 'pushSound.caf',

            'content-available': 1,

        },

        'extra':{

            'param1':0,'param2':'test'

        },

        'data':{

            'title':'a',

              'body':'b'

        }

    }

 

    apnsPayload = json.dumps(apnsPayload, ensure_ascii=False, separators=(',',':')).encode('UTF-8')

    # apnsPayload = json.dumps(apnsPayload)

 

    apnsToken = apnsToken.decode('hex') # python 2

    # apnsToken = apnsToken.replace(' ','')

    # apnsToken = apnsToken.decode('hex') # python 3

 

    format = '!BLLH32sH%ds' % len(apnsPayload)

    # format = '!BH32sH%ds' % len(apnsPayload)

 

    expiry = int(time.time()) + 60*60*24 # item['expire_date']

    packet = struct.pack(format, 1, 0, expiry, 32, apnsToken, len(apnsPayload), apnsPayload)

    # packet = struct.pack(format, 0, 32, apnsToken, len(apnsPayload), apnsPayload)

 

    print "-- result %s " % packet

    # sslSock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM), certfile = config.get('ios', 'cert'))

    sslSock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM), certfile = certFile)

    sslSock.connect(apnsHostPort)

 

    sslSock.write(packet)

    sslSock.close()


반응형
반응형

PHP 간단하게 만들어 봤었던 테스트 푸시 발송 기능.


<?php

    $title = 'this is title';

    $message = 'message!!!';

    $title = preg_replace("/\"/", "'", $title);

    $message = preg_replace("/\"/", "'", $message);

 

    $result = array();

   

    $apnsHost  = 'gateway.push.apple.com';

    $apnsCert  = '.../apns_production.pem';   // iOS Developer 를 통한 생성.

    $apnsPort  = 2195;

    $apnsToken = 'abcdefg012345'; // app token

   

    $payload = array();

    // 현재 발송 메시지 형태

    $payload['aps'] = array(

        "alert" => $message,

        "badge" => 1,

        "sound" => "pushSound.caf",

        "content-available" => 1);

    $payload['extra'] = array("param1" => 0, "param2" => "");


    $push = json_encode($payload);

    $streamContext = stream_context_create();

    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);

    $apns = stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort, $error, $errorString, 10, STREAM_CLIENT_CONNECT, $streamContext);

    if($apns) {

        $apnsMessage = chr(0).chr(0).chr(32).pack('H*', str_replace(' ', '', $apnsToken)).chr(0).chr(strlen($push)).$push;

        var_dump($apnsMessage);

        fwrite($apns, $apnsMessage);

        @fclose($apns);

    }

?>



반응형
반응형

Legacy Notification Format


 APNs 로 연결하기 위한 새로운 개발은 최신의 형식을 사용해야만 하는데요, APNs Provider API 에서 설명했던 것 처럼요.

이 형식들은 priority 를 포함하지 않습니다; 10 의 priority 가 가정되어 있습니다.

Legacy Notification Format


Figure B-1 Legacy notification format



 레거시 형식에서 첫 번째 byte 는 0(zero)으로 된 명령어값? 입니다. 다른 속성들은 개선된 형식과 같습니다. B-1 목록은 레거시 알림 형식을 사용해서 바이너리 인터페이스를 통하여 APNs 로의 원격 알림을 보내는 기능의 한 예를 보여줍니다.


Listing B-1 바이너리 인터페이스를 통해 레거시 형식으로 알림을 보내기.


static bool sendPayload(SSL *sslPtr, char *deviceTokenBinary, char *payloadBuff, size_t payloadLength)
{
    bool rtn = false;
    if (sslPtr && deviceTokenBinary && payloadBuff && payloadLength)
    {
        uint8_t command = 0; /* command number */
        char binaryMessageBuff[sizeof(uint8_t) + sizeof(uint16_t) +
            DEVICE_BINARY_SIZE + sizeof(uint16_t) + MAXPAYLOAD_SIZE];
        /* message format is, |COMMAND|TOKENLEN|TOKEN|PAYLOADLEN|PAYLOAD| */
        char *binaryMessagePt = binaryMessageBuff;
        uint16_t networkOrderTokenLength = htons(DEVICE_BINARY_SIZE);
        uint16_t networkOrderPayloadLength = htons(payloadLength);

        /* command */
        *binaryMessagePt++ = command;

       /* token length network order */
        memcpy(binaryMessagePt, &networkOrderTokenLength, sizeof(uint16_t));
        binaryMessagePt += sizeof(uint16_t);

        /* device token */
        memcpy(binaryMessagePt, deviceTokenBinary, DEVICE_BINARY_SIZE);
        binaryMessagePt += DEVICE_BINARY_SIZE;
        /* payload length network order */
        memcpy(binaryMessagePt, &networkOrderPayloadLength, sizeof(uint16_t));
        binaryMessagePt += sizeof(uint16_t);

        /* payload */
        memcpy(binaryMessagePt, payloadBuff, payloadLength);
        binaryMessagePt += payloadLength;
        if (SSL_write(sslPtr, binaryMessageBuff, (binaryMessagePt - binaryMessageBuff)) > 0)
            rtn = true;
    }
    return rtn; 

} 


Enhanced Notification Format


개선된 형식은 레거시 형식보다 몇가지 발전된 것들이 있습니다:

  • Error response : 레거시 형식처럼, 만약 여러분이 잘못된(malformed) 알림 패킷을 전달한다면, - 예를 들어, 페이로드는 약정한(정해진) 제한을 초과할 것입니다 - APNs  그 연결로 전달하여 응답할 것 입니다. 왜 그 알림이 거부되었는지 어떠한 암시도 주어지지 않습니다. 개선된 형식에는 provider tag 로 임의적인 식별자로 알림을 줍니다. 만약 에러가 발생하면, APNs는 그 식별자와 관련된 에러 코드로 패킷을 반환합니다. 이 응답은 provider 가 위치를 찾아내고 잘못된 알림을 올바르게 할 수 있게 합니다.
  • Notification expiration : APNs 는 store-and-forward 방식을 사용하는데 가장 최근 알림을 단말기의 앱으로 보내기 위해 유지 합니다. 만약 단말기가 전달 시점에 오프라인이라면, APNs 는 단말기가 다음 온라인 상태일 때 알림을 전달합니다. 레거시 형식과 같이, 알림은 알림의 적절성과 상관없이 전달되어 집니다. 다른 말로, 알림은 시간이 지남에 따라 “stale” 하게 될 수 있습니다. 개선된 형식은 expiry 값을 포함하는데 이것은 알림의 유효한 기간을 나타냅니다. APNs 는 expiry 기간이 지났을 때 store-and-forward 안에 있는 알림을 제거 합니다.

Figure B-2 알림 패킷들에 대한 형식을 그렸습니다.



알림 형식의 첫 바이트는 1이라는 명령어 값 입니다. 다른 필드들에 대한 설명은 아래와 같습니다: 
  • Identifier - 알림을 식별 할 수 있는 임의적인 값 입니다. 만약 APNs 가 알림을 해석할 수 없으면 에러-응답 패킷안에 같은 식별자가 반환됩니다.
  • Expiry - 초단위로 고정된 UNIX epoch 날짜 표현인데(UTC) 알림이 더 이상 유효하지 않을 때 제거 될 수 있습니다. 만료 값은 network byte order(big endian)을 사용합니다. 만약 expiry 값이 0이 아니라면, APNs는 적어도 한 번 더 알림을 전달하려고 시도할 것 입니다. 요청에 대해 0으로 명히하는 것은 APNs 가 알림 전체를 저장하지 않겠다는 것 입니다.
  • Token length - 네트워크 순서(big endian)의 디바이스 토큰 길이.
  • Device token - 바이너리 형식의 디바이스 토큰.
  • Payload length - 네트워크 순서(big endian)의 페이로드 길이.  페이로드는 256 bytes 를 초과해서는 안 되고 null 로 끝나서는 안 됩니다.

    • 초기에는 256 bytes 였으나, 현재 iOS 버전은 2KB(2048 bytes) 까지 지원하고 있다.(iOS8 이후부터...)
  • Payload - 알림 페이로드.


Listing B-2 바이너리 인터페이스를 통해 개선된 형식으로 알림 보내기.

static bool sendPayload(SSL *sslPtr, char *deviceTokenBinary, char *payloadBuff, size_t payloadLength)
{
  bool rtn = false;
  if (sslPtr && deviceTokenBinary && payloadBuff && payloadLength)
  {
      uint8_t command = 1; /* command number */
      char binaryMessageBuff[sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint16_t) +
          DEVICE_BINARY_SIZE + sizeof(uint16_t) + MAXPAYLOAD_SIZE];
      /* message format is, |COMMAND|ID|EXPIRY|TOKENLEN|TOKEN|PAYLOADLEN|PAYLOAD| */
      char *binaryMessagePt = binaryMessageBuff;
      uint32_t whicheverOrderIWantToGetBackInAErrorResponse_ID = 1234;
      uint32_t networkOrderExpiryEpochUTC = htonl(time(NULL)+86400); // expire message if not delivered in 1 day
      uint16_t networkOrderTokenLength = htons(DEVICE_BINARY_SIZE);
      uint16_t networkOrderPayloadLength = htons(payloadLength);

      /* command */
      *binaryMessagePt++ = command;

     /* provider preference ordered ID */
     memcpy(binaryMessagePt, &whicheverOrderIWantToGetBackInAErrorResponse_ID, sizeof(uint32_t));
     binaryMessagePt += sizeof(uint32_t);

     /* expiry date network order */
     memcpy(binaryMessagePt, &networkOrderExpiryEpochUTC, sizeof(uint32_t));
     binaryMessagePt += sizeof(uint32_t);

     /* token length network order */
      memcpy(binaryMessagePt, &networkOrderTokenLength, sizeof(uint16_t));
      binaryMessagePt += sizeof(uint16_t);

      /* device token */
      memcpy(binaryMessagePt, deviceTokenBinary, DEVICE_BINARY_SIZE);
      binaryMessagePt += DEVICE_BINARY_SIZE;

      /* payload length network order */
      memcpy(binaryMessagePt, &networkOrderPayloadLength, sizeof(uint16_t));
      binaryMessagePt += sizeof(uint16_t);

      /* payload */
      memcpy(binaryMessagePt, payloadBuff, payloadLength);
      binaryMessagePt += payloadLength;
      if (SSL_write(sslPtr, binaryMessageBuff, (binaryMessagePt - binaryMessageBuff)) > 0)
          rtn = true;
  }
  return rtn; 

} 


반응형
반응형

The Remote Notification Payload

 각각의 APNs remote 알림은 하나의 페이로드를 포함합니다. 페이로드는, 어떻게 시스템이 사용자가에 알려야만 하는 지에 대한 정보와 함께, 여러분이 제공하기를 바라는 커스텀 정보를 포함하고 있습니다.

여러분이 사용하는 provider API 에 의존하는 알림을 위한 최대 페이로드 크기는, 다음과 같습니다:

  • HTTP/2-based APNs provider API
    • Regular push notification : 4KB(4096 bytes)
    • Voice over Internet Protocol(VoIP) notification : 5KB(5120 bytes)
  • Legacy APNs binary interface
    • Regular push notification : 2KB(2048 bytes)

APNs 는  여러분이 사용하는 인터페이스 그리고 여러분이 보내는 알림의 종류에 대해 최대 크기를 초과하는 알림들에 대해서는 거부합니다.


Payload Keys
각각의 알림에 대해서, JSON dictionay object 로 구성되어 있습니다(RFC 4627 에 정의된). 이 dictionary는 aps 키에 의해서 식별되어 집니다. aps dictionary 는 하나 또는 그 이상의 특징들을 담을 수 있는데 다음의 사용자 알림 형태에 명시되어 있습니다. :
  • 사용자에게 하나의 alert 메시지를 보여준다.
  • 숫자를 앱 아이콘 배지로 한다.
  • 소리를 재생한다.

조용한 remote 알림을 제공하기 위해서, remote-notification 값을 여러분의 Info.plist 파일에 UIBackgroundModes 배열에 추가한다. 이 배열에 대해 좀 더 배우려면, UIBackgroundModes 에 대해서 보세요.

만약 알림이 도착했는데도 특정 앱이 실행중이지 않더라도, alert 메시지, 소리, 배지값이 실행되거나 보여진다. 많약에 앱이 실행중이라면, 시스템은 알림을 NSDictionary 객체로 앱을 delegate 하기 위해 보냅니다.

Provider 는 개인화 페이로드 값을 애플이 예약한 aps dictionary 바깥에 명시화할 수 있습니다. 개인화 값들은 JSON 구조를 사용해야만 하고 원시 타입이어야만 합니다: dictionary(object), array, string, number, 그리고 Boolean. 여러분은 개인화 페이로드 데이터에 일반사용자 정보(또는 민감한 정보)를 포함해서는 안 됩니다. 대신에, 컨텍스트를 설정하거나(사용자 인터페이스에 대한) 내부 메트릭스의 목적으로는 사용 가능합니다. 예를들어, 개인화 페이로드 값은 인스턴스 메시지 클라이언트 앱에서 사용되어지는 대화식별자일 수 있으며 또한 provider 가 알림을 보낼 때 식별할 수 있는 타임스탬프로 사용될 수 있습니다. alert 메시지와 관련된 동작은 파괴적이어서는 안 됩니다. - 예를 들면, 단말기의 데이터를 지워서는 안 됩니다.

요점: 알림을 전달하는 것은 최선의 노력이지, 보장하지 않습니다. 이것은 여러분의 앱으로 데이터를 전달하려는 의도가 아니라, 오직 사용자에게 새로운 데이터가 왔다는 걸 알려줄 뿐입니다.

표 5-1 aps 페이로드의 키들의 목록과 예상 값들.

표 5-1 aps dictionary 의 키와 값
Key
Value Type
Comment
alert
string or dictionary
만약에 속성이 포함되어 있으면, 시스템은 표준alert 이나 배너로 표시하는데, 이는 사용자 설정에 기반합니다.
alert의 값으로 string 이나 dictionary 로 명시할 수 있습니다.
  • 만약에 string 으로 명시하면, 두 개의 버튼을 가진 메시지 텍스트 alert이 될 것입니다. : Colse and View. 만약 사용자가 View 를 tab하면, 앱이 실행될 것 입니다
  • 만약에 dictionary 로 명시하면, dictionary 의 key 에 대한 설명이 있는 Table 5-2를 참고하세요.
JSON의 \U 표기는 지원되지 않습니다. 텍스트 대신에 실제 UTF-8 캐릭터를 입력하세요.
badge
number
앱 아이콘의 배지로 표현되는 숫자.
만약에 속성이 누락됬으면, 배지는 변하지 않습니다. 배지를 삭제하기 위해서는, 속성의 값을 0으로 셋팅하세요.
sound
string
앱 번들 안의 또는 앱의 데이터 컨테이너 안의 Library/Sounds 폴더 안의 사운드파일 이름입니다. alert 되면서 파일 안의 소리가 재생됩니다. 만약에 소리파일이 없으면 default 로 값이 명시화 되며, 기본 alert 소리가 재생됩니다. 오디오는 오디오 데이터 형식들 중 하나이어야만 하고 그 형식들은 시스템 소리에 호환되야합니다.; 더 자세한 내용은 Preparing Custom Alert Sounds 를 보세요.
content-available
number
1이라는 값으로 제공되는 이키는 새로운 내용을 이용할 수 있다는 걸 나타냅니다. 이 키와 값을 포함하는 것의 의미는 여러분의 앱이 백그라운드나 재실행 상태에서 실행되었을 때, application:didReceiveRemoteNotification:fetchCompleteHandler : 가 호출된다는 것을 말합니다.
category
string
string 값으로 제공되는 이 키는 개인화 행동들을 정의하기 위해 여러분이 UIMutableUserNotificationCategory 객체의 identifier 속성을 표현합니다. 개인화 활동들을 사용하는 것을 더 배우려면, Registering Your Actionable Notification Types 를 보세요.

표 5-2 alert dictionary 에 대한 키들의 목록과 예상 값들.

표 5-2 alert 속성의 자식 속성들.
Key
Value
Comment
title
string
알림의 목적을 설명하는 짧은 문자열입니다. 애플시계는 알림 인터페이스의 일부로 문자열을 보여줍니다. 문자열은 간략하게 보여져야하고 빠르게 이해할 수 있도록 만들어져야만 합니다. 이 키는 iOS 8.2부터 추가되었습니다.
body
string
alert 메시지의 텍스트 입니다.
title-loc-key
string or null
이 키는 지역화를 위한 Localizable.strings 파일의 title string 입니다. 이 키는 title-loc-args 배열에 명시된 변수들을 다루기 위해 %@ 그리고 %n$@ 규정자 의 형식이 될 수 있습니다.  더 많은 정보를 보려면 Localized Formmated Strings 를 보세요. 이 키는 iOS 8.2 부터 추가되었습니다.    
title-loc-args
array of strings or null
title-lox-key 의 형식 규정자를 대신하기 위한 다양한 문자열 값들 입니다. 더 많은 정보는 Localized Formmated Strings 를 보세요. 이 키는 iOS 8.2 부터 추가되었습니다.
action-loc-key
string or null
만약에 문자열이 명시되어 있다면, 시스템은 Close 와 View 버튼을 포함한 alert을 보여줄 것 입니다. 문자열은 View 대신에 오른쪽 버튼의 제목 사용하기 위해 현재 지역에서 지역화된 문자열을 얻기 위한 키로 사용됩니다.
loc-key
string 
현재 위치에 대한 Localizable.strings 파일의 alert 메시지 문자열에 대한 키 입니다(사용자의 언어에 따라서 설정됩니다). 키 문자열은 loc-args 배열에 명시된 변수로 %@ 그리고 %n$@ 규정자 의 형식일 수 있습니다. 더 많은 정보를 보려면 Localized Formmated Strings 를 보세요.
loc-args
array of strings
low-key 안에 형식있는 규정자? 로서 변할 수 있는 문자열 값을 나타냅니다. 더 많은 정보를 보려면 Localized Formmated Strings 를 보세요.
launch-image
string
앱 번들 안의 이미지 파일의 파일명으로, 파일이름 확장 또는 없이~.  이미지는 실행 이미지로 사용되어지는데, 사용자가 action button을 탭하거나 action slider 를 이동시킬 때 입니다.

Configuring a Silent Notification
 aps dictionary 는 content-available 속성을 담을 수 있습니다. 1로 설정된 content-available 속성은 원격 알림 행동을 묵음 알림으로 만듭니다. 묵음 알림이 도착했을 때, iOS는 백그라운드의 앱을 깨우고 서버로부터 새로운 데이터를 가져오거나 백그라운드 정보 처리를 수행합니다. 사용자는 묵음 알림으로부터의 결과로 나온 새로운 또는 변경된 정보에 대해서 이야기하지 않는데, 그러나 다음 번 앱을 열었을 때 찾을 수 있을 것 입니다.
 묵음 알림에 대해서, 확실하게 다루어야 할 게 있는데 aps dictionary 에 alert, sound, badge 가 없어야 합니다. 만약 이 지침을 따르지 않는다면, 부정확하게 설정된 알림이 throttle 되고 백그라운드의 앱에 전달되지 않을 것이고 묵음 대신에 사용자에게 보이게 될 것 입니다.



Localized Formatted Strings



Examples of JSON Payloads
다음으로는 알림들의 페이로드 일부분의 예제들이 Table 5-1 에 목록화된 속성들의 실제적인 사용이 보여지고 있습니다. “acme” 키 이름의 속성들은 개인화 페이로드 데이터의 예제들 입니다.

Note: 예제들은 가독성을 위해 공백과 줄바꿈으로 형식화되어 있습니다. 실사용에서, 페이로드의 크기를 줄이기 위해서, 네트워크 성능 향상을 위해서 공백과 줄바꿈을 빼기도 합니다.

Example 1. 간단한 pas dictionary를 가진 페이로드가 있는데, 기본적인 alert 버튼(Close and View)을 가진 alert 메시지이 추천하는 형태 입니다. 이것은 alert 값으로 dictionary보다 문자열을 사용합니다.

{
    "aps" : { "alert" : "Message received from Bob" },
    "acme2" : [ "bang",  "whiz" ]
}

Example 2. 예제의 페이로드는 단말기가 왼쪽에 Close 버튼 오른쪽엔 “action” 버튼에 대한 지역화된 제목을 alert 메시지로 보여주는 것을 요청하는데 aps dictionary를 사용합니다. 이 경우에, “PLAY”는 지역화에 상응되는 것을 가져오기 위해 현재 선택된 언어를 위한 Localizable.strings 파일의 키로 사용됩니다. aps dictionary는 또한 숫자5의 앱아이콘 배지로 요청합니다. 애플 시계에서는, 제목키는 사용자에게 새로운 요청을 alert 합니다.

{
    "aps" : {
        "alert" : {
            "title" : "Game Request",
            "body" : "Bob wants to play poker",
            "action-loc-key" : "PLAY"
        },
        "badge" : 5
    },
    "acme1" : "bar",
    "acme2" : [ "bang",  "whiz" ]
}

Example 3. 예제의 페이로드는 단말기가 Close and View 버튼의 alert 메시지를 보여줘야만 합니다. 숫자9의 앱아이콘 배지와 알림이 전달됬을 때 번들 alert 소리를 요청합니다.

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
    "acme1" : "bar",
    "acme2" : 42
}

Example 4. 예제의 페이로드는 alert dictionary 의 자식 속성으로 loc-key 와 loc-args 는 형식화된 지역화 문자열을 앱 번들로부터 가져오고 적절한 위치의 변수 문자열 값(loc-args)으로 교체합니다. 이것은 또한 개인화 소리와 개인화 속성도 명시화 합니다.

{
    "aps" : {
        "alert" : {
            "loc-key" : "GAME_PLAY_REQUEST_FORMAT",
            "loc-args" : [ "Jenna", "Frank"]
        },
        "sound" : "chime.aiff"
    },
    "acme" : "foo"
}

Example 5. 예제의 페이로드는 알림 행동들의 그룹을 명확하게 하기 위한 category 키를 사용합니다.

{
  "aps" : {
      "category" : "NEW_MESSAGE_CATEGORY"
      "alert" : {
        "body" : "Acme message received from Johnny Appleseed",
        "action-loc-key" : "VIEW"
      },
      "badge" : 3,
      "sound" : “chime.aiff"
  },
  "acme-account" : "jane.appleseed@apple.com",
  "acme-message" : "message123456"
}





반응형
반응형

About Local and Remote Notifications

Local 알림과 remote 알림은 유저알림이라 불리는 두 종류인데, broadcast 알림과 구별되고(NSNotificationCenter class에 의해 관리되는) key-value 의 observing 알림입니다. 사용자 알림은 앱이 실행하지 않을 때 foreground로 가능하게 하여 사용자들이 정보를 알게 합니다. 정보는 하나의 메시지로 되어 있는데, 예를들어 곧 있을 달력 이벤트, 또는 원격서버의 새로운데이터 입니다. local 알림 이던 remote 알림이던지 유저알림은 운영체제(iOS)에 의해서 표현되어지는데 똑같이 보고 소리낼 수 있습니다. 알림은 alert 메시지를 표시하거나 app icon 에 배지를 달 수 있습니다. alert 나 배지숫자가 보여졌을 때 소리를 낼 수 있습니다.

At a Glance (한 눈에 보기)
Local 과 Remote 알림은 사용자에게 똑같이 나타나는데, 그러나 Local 과 Remote 알림은 다른 사용경험을 전달하고 서로 다르게 설정하고 관리할 수 있습니다.

Local and Remote Notification Contrasted
많은 앱들은 foreground가 아닐 때 사용자들에게 관심있는 이벤트들이 발생하는 시간기반이나 상호연결된 환경에서 돌아갑니다.

Local과 Remote 알림은 다른 설계 요구사항들이 제공되는데 다음과 같습니다. : 
  • local 알림은 계획되어져서 앱 스스로에게 전달하는데, 인터넷 환경이 아니어도 됩니다.
  • remote 알림은 push 알림이라고도 불리는데, 단말기의 외부로부터 도착합니다. push 알림은 여러분이 관리하는 원격서버(app의 provider)에서 생겼고 ApplePushNotificationService(APNS)를 통해서 여러분의 단말기의 앱으로 푸시되어집니다.

(중략...)

Apple Push Notification Service
 Apple Push Notification service(APNs)는 remote 알림을 받을 수 있는 등록된 앱들을 가진 단말기들로 전파합니다. 단말기의 각각의 앱들은 인증받은 그리고 암호화된 IP로 연결된 서비스를 구축하고 지속성 있는 연결을 통해서 알림을 받습니다. Provider(사용자의 서버)는 클라이언트 앱을 위해서 의도되어진 들어오는 데이터를 모니터링하면서 지속적이고 안전한 채널을 통해서 APNs에 연결합니다. 앱에 새로운 데이터가 도착했을 때, provider는 APNs 의 채널을 통해 알림을 준비하고 보내는데, 특정 단말기로 알림을 푸시하기도 합니다.

 APNs Provider API는 비동기이고, 2015년 12월에 서비스를 시작했고, 여러분의 provider 서버에서 APNs로 remote 알림 요청들을 HTTP/2를 사용해서 보냅니다. provider는 각각 발신 알림으로 구성되어 있고 APNs 의 채널을 통해서 보냅니다. 


반응형

+ Recent posts