[XE7] 자체적으로 원격푸쉬알림(GCM, APN) 전송 구현방법

2014.12.03 09:43

스페인의 델파이 개발자(fgonzalez.visiblogs.com/)가 자체적으로 원격푸쉬 알림 기능을 구현한 동영상을 소개합니다.


RAD Studio에서 원격 푸쉬 알림(Remote Push Notification)을 구현하기 위해서는 XE6 버전에 추가된 BaaS 클라이언트 컴포넌트를 통해 가능했는데요. 

이 동영상에서는 IdHttp(안드로이드), TCPClient(iOS) 컴포넌트 등을 활용해 푸쉬 메시지를 전송하고, System.PushNotification 클래스를 활용해 푸쉬 메시지를 수신하는 내용을 소개합니다.


동영상은 스페인어로 이야기를 합니다. 팁을 드리면 유투브의 자막을 한국어로 설정하고 화면과 코드위주로 보시면 충분히 이해할 수 있습니다.


참고 글


저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키 APN, Firemonkey, gcm, ios, push, Remote Push Notification, 안드로이드

  1. Blog Icon
    석만근

    와우 감사합니다.
    전 서버를 웹페이지로 구현하고 Post방식으로 날렸는데 바로 날리네요;; 구글로 ㅎㅎ
    그리고 왠지 될것 같은데.... 당채 말을 알아들을수가 없네요
    감사합니다. 도움이 많이 될듯합니다.

  2. 그래도 개발자들에게는 코드가 있어 위안이 됩니다^^
    시도해 보시고 팁될만한 것 있으면 공유해주세요.
    감사합니다.^^

  3. Blog Icon
    오진성

    감사합니다 ^^
    잘되네요 근데 궁금증이있는데요
    message를 한글로 보내면 한글이 깨져서 나오든데 ... 어떻게 해결해야하나요 ?

  4. Blog Icon
    정상언

    한글 깨지는 분 저도 고생 좀 했는데
    AData := TStringStream.Create(AJson.ToString) 이부분을

    다음 처럼 하면 되네요
    AData := TStringStream.Create(AJson.ToJSON);

  5. Blog Icon
    키위

    영상을 통해 푸쉬 메세지 전송에 성공 했습니다.
    그런데 푸쉬를 여러개 받으면 받은만큼 아이콘과 알림이 생기는데
    이걸 어떻게 아이콘 하나에 "x개 메세지"로 만들수 있을까요?...
    여기저기 검색을 해봐도 통.. 찾을 수가 없네요.
    보내는놈, 받는놈, manifest file, 서비스.. 어디를 건드려야 하는지도 감이 안잡히네요.ㅡㅡ

  6. Blog Icon
    난다요

    푸시연구 중인데 도저히 모르겠어서 질문올립니다.

    여기 홈페이지에서 동영상 보면서 만들고 있는데요

    다른건 다 이해가 가는데

    DeviceToKen := '';

    이 디바이스토큰값을 어디서 가져오는지 모르겠습니다.

    혹시 아시는분은 자세히 설명좀 부탁드립니다. ㅜㅜ

  7. Blog Icon
    하이요

    종료시에 push를 받고싶은데
    그럴려면 안드로이드 스튜디오의 경우 gradle 파일을 수정하던데...
    델파이에서는 어떻게 해야하나요?

  8. 다음글을 참고해 종료 이벤트를 감지해보세요.
    WillTerminate 이벤트에 푸쉬를 발생하세요.
    http://blog.hjf.pe.kr/114

    푸쉬를 발생하는 내용은 아래 링크를 참고하세요.
    http://docwiki.embarcadero.com/RADStudio/Berlin/en/Mobile_Tutorial:_Using_Notifications_(iOS_and_Android)

[BaaS] 데스크탑(VCL) 어플리케이션에서 특정 유저에게 GCM/APN 전송하기

2014.07.24 17:25

안녕하세요. 험프리.김현수입니다.


요즘 BaaS 코드아카데미 준비하느라 바쁘면서도 즐겁습니다. 새로운 내용을 공부하고 누군가에게 도움을 줄 수 있다는 것이 보람되네요^^(코드아카데미 참석해 주세요. 좋은 내용이 많습니다. http://tech.devgear.co.kr/404011)


이번에 소개해드릴 내용은 얼마전 어느분께서 데브기어를 통해 질문하신 내용입니다.

질문 내용은 "VCL로 푸시메시지를 브로드캐스트는 되는데 특정 사용자에게 전송 가능하느냐? "라는 질문이었습니다.


이 글을 이해하시기 위해서는  BaaS와 RAD Studio 글을 먼저 읽어보시고, 데스크탑에서 클라우드 메시지 전송 글을 선행해야 이글을 이해하시는데 도움이 많이 됩니다.

VCL 어플리케이션으로 특정 사용자에게 푸시메시지 전송

앞에서 안내해 드린 글을 데스크탑에서 클라우드 메시지 전송 보면 VCL 어플리케이션에서 Kinvey의 PushEndPoint를 이용해 브로드캐스트 메시지를 전송합니다.

특정사용자에게 전송할 때에도 PushEndPoint를 설정해 전송 할 수 있습니다. 

❑ 모바일 수신 설정(Custom Endpoint)

먼저 Kinvey에 접속해 Custom EndPoints(Addons > Business Logic > Custom Endpoints > New)를 추가합니다.

이름을 지정(저는 SpecificUsersMessage로 정했습니다.)하고, 다음의 코드를 입력하고 저장합니다.

function onRequest(request, response, modules){
    // 모듈
  var push = modules.push, 
      collectionAccess = modules.collectionAccess, 
      logger = modules.logger;
 
  // 데이터
  var iOSAps = request.body.iosaps;
  var iOSExtras = request.body.iosextras;
  var androidPayload = request.body.androidpayload;
  var username = androidPayload.username;

  if(username){
    collectionAccess.collection('user').findOne({'username': username}, function (err, user) {
      if (err) {
        logger.error('Query failed: '+ err);
      } else {
        if(user){
          // 사용자가 있으면 대상에게
          logger.info('Pushing message to ' + user.username);
          push.sendPayload(user, iOSAps, iOSExtras, androidPayload);
        } else {
          logger.error('Not found user!!(username: ' + username + ')');
        }
      }
   
      // 콜백함수 안에 있어야 합니다. 밖에 있으면 콜백함수 수행전 먼저 응답합니다.
      response.complete(200);    
    });
  } else {
    // username 미 지정 시 전체
    logger.info('Pushing message to All');
    push.broadcastPayload(iOSAps, iOSExtras, androidPayload);
  }
}

그리고 어플리케이션 제작 전 API Console을 이용해 아래의 코드로 테스트(참고)합니다.

{
  "iosaps": {
    "alert": "안녕하세요."
  }, 
  "iosextras": {
    "username": "testuser"
  }, 
  "androidpayload": {
    "username": "testuser",
    "message": "안녕하세요.",
    "title": "메시지 제목"
  }
}

위 내용 중 username 항목을 변경해 사용하시기 바랍니다.(Kinvey API 콘솔 에디터가 이상하게 복사/붙여넣기가 안되네요. 저만 그런가요? 타이핑해서 넣어서 사용하기 바랍니다.)

❑ VCL 전송 어플리케이션

앞에서 만든 EndPoints를 이용해 푸시메시지 전송하는 VCL 전송어플리케이션을 작성합니다.

VCL 폼의 디자인을 다음과 같이 대상(edtUserName) 항목을 추가하도록 수정합니다.(꼭 같을 필요는 없습니다.)

저는 전체에게 보낼지 대상을 지정할지 선택하기 위해 체크박스를 넣었습니다.


KinveyProvider의 PushEndPoint 속성에 앞에서 작성한 Custom EndPoints(SpecificUsersMessage)를 입력합니다.


메시지 전송 버튼에는 아래의 코드를 이용합니다.

var
  Data: TPushData;
begin
  Data := TPushData.Create;
  try
    Data.Message      := edtMessage.Text;
    Data.GCM.Title    := edtTitle.Text;
    Data.GCM.Message  := edtMessage.Text;

    if CheckBox1.Checked then
      Data.Extras.Add('username', edtUserName.Text);

    BackEndPush1.PushData(Data);
  finally
    Data.Free;
  end;

위 소스의 키포인트는 Data.Extras에 username을 추가하는 것입니다.

Extras 정보에 username을 추가하면 실제 전송되는 JSON 데이터에의 androidpayload와 iosextras에 username항목이 추가되고 Custom Endpoints에서 androidpayload의 username으로 특정 사용자에게 전송하도록 설정되었습니다.


BaaS를 이용하면 여러분들은 별도의 서버 준비 없이 서버기능인 백엔드 기능을 클라우드 기반의 서비스에서 이용할 수 있습니다.

한번 익혀두면 모바일 및 데스크탑에서 유용하게 사용할 수 있으니 도전해 보시기 바랍니다.



관련글

 

저작자 표시 비영리 동일 조건 변경 허락
신고

험프리.김현수 파이어몽키 APN, BAAS, Custom Endpoints, Delphi, gcm, Kinvey, vcl