UNITY Firebase push

유니티 2019. 4. 27. 02:28

예전에 게임에 푸쉬를 추가하려면, android iOS 따로 따로 만들어 푸쉬를 추가해야 했습니다. 힘들기도 하지만, 트러블 슈팅에 많은 시간을 소요해야만 했습니다. 하지만, 이제는 Firebase를 통해 추가하면, 한 번에 추가하고 관리할 수 있습니다. 물론, 문제는 여전히 산재해 있습니다. 하지만, 최소한 예전보다는 좋아졌습니다.

 

[선행작업]

프로비저닝 프로파일 만들기 (푸쉬 인증서 설명도 같이 있음) : https://nicgoon.tistory.com/202 .

 

[공식문서]

Unity 프로젝트에 Firebase 추가 : https://firebase.google.com/docs/unity/setup .
GitHub의 Unity용 Firebase 빠른 시작 샘플 : https://github.com/firebase/quickstart-unity .
Unity로 Firebase 클라우드 메시징 클라이언트 앱 설정 : https://firebase.google.com/docs/cloud-messaging/unity/client .

 

[주요링크]

파이어 베이스 : https://firebase.google.com .

 

 

1. 유니티 프로젝트 생성.

유티 프로젝트 생성은 크게 힘들 일이 아닐 것 입니다. 적당한 이름으로 프로젝트를 생성해 주세요. 그리고, 안드로이드를 위한 빌드 셋팅을 해 주도록 합니다.

상단 메뉴에서 File > Bild Settings 를 선택해 주도록 합니다. 그럼 빌드 셋팅 창이 뜨는데, Android를 선택하고 Switch Platform 버튼을 눌러 플랫폼을 변경하도록 합니다.

플랫폼이 변경되면, Player Settings 버튼을 눌러서, Player Settings 창을 호출하도록 합니다.

창이 뜨면, 안드로이드 > Other Settings 버튼을 눌러 Package Name 을 적당한 값으로 변경해 줍니다.

그리고, 다시 Build Settings 창에서, Build And Run 버튼을 눌러 한 번 빌드를해 잘 동작하는 지 확인합니다.

 

2. 파이어 베이스 프로젝트 추가.

첫 화면에서 콘솔로 이동합니다.

콘솔 첫 화면에서 프로젝트 추가 버튼을 눌러 주도록 합니다.

아래와 같이 프로젝트 추가 창이 뜨면, 적당한 값들을 입력하고, 프로젝트 만들기 버튼을 눌러 주도록 합니다.

 

3. 유니티 앱 추가 하기.

프로젝트 창이 뜨면, 유니티 앱 추가 버튼을 눌러 앱을 추가하도록 합니다.

추가 페이지의 앱등록 화면이 뜨면, 아래와 같이 적당한 값들을 넣고, 앱 등록 버튼을 눌러 주도록 합니다.

구성 파일 다운로드 항목에서는 시키는 대로 android, iOS 를 위한 설정 파일을 다운로드 받아 적당한 위치에 배치 합니다. 그리고 다음 버튼을 눌러 주도록 합니다.

다음 항목에서 파이어 베이스 sdk를 다운로드 받습니다. 다운로드 후 폴더를 열어 보면, dotnet3, dotnet4 폴더가 각각 있을 것 입니다. 그 중 dotnet4 속의 FirebaseAnalytics.unitypackage 를 가지고 오도록 합니다. 여기 까지 했다면 다음 버튼을 눌러 주도록 합니다.

여기서, 유니티 Preference > External Tools > Android SDK Tools Installed with Unity 체크 되어 있다면, 오류를 만날 수 있습니다. 잠시, 해제를 해 주면, 오류가 해결되고, 파이어 베이스가 종속성이 있는 모듈을 확인할 수 있도록 해 줍니다. 끝나면, 다시 체크 해 줍니다.

다음 창이 나오면, 문서와 예제 링크가 나옵니다. Unity 문서를 눌러, Unity 프로젝트에 Firebase 추가 페이지를 불러 옵니다.

이 문서를 확인해 보면, 우리는 5단계까지 완료했고, 마지막, 6단계를 하지 않았습니다. 파이어 베이스 기능을 사용하기 위한 앱을 호출 하는 것 인데, 저는 프로젝트에 게임오브젝트를 만들고, Start 메소드에 이 코드를 추가했습니다. 코드는 다음과 같습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Firebase;

public class PushTestScene : MonoBehaviour
{
    
    public FirebaseApp app = null;

    void Start()
    {

        Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {

            var dependencyStatus = task.Result;
            if (dependencyStatus == Firebase.DependencyStatus.Available) {
                // Create and hold a reference to your FirebaseApp,
                // where app is a Firebase.FirebaseApp property of your application class.
                app = Firebase.FirebaseApp.DefaultInstance;

                Debug.Log( "파이어 베이스 앱을 무사히 초기화 하였습니다." );

                // Set a flag here to indicate whether Firebase is ready to use by your app.
            } else {
                UnityEngine.Debug.LogError(System.String.Format(
                "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
                // Firebase Unity SDK is not safe to use here.
            }

        });

    }


}

유니티에서 바로 실행해 보면, 앱이 잘 생성되어 줍니다. 저는 안드로이드, iOS 모두 정상적으로 잘 작동하였습니다.

 

4. Unity로 Firebase 클라우드 메시징 클라이언트 앱 설정.

앞서 다운로드 받았던, Firebase Unity SDK를 추가 하도록 합니다. Asset > Import Package > Custom Package 메뉴 항목을 선택합니다. 그리고 다운로드 받았던, Firebase 패키징 dotnet4 폴더 속에 있는, FirebaseMessaging.unitypackage 파일을 추가해 줍니다. 저는 그냥 이 파일을 유니티에 드래그앤 드랍으로 추가했습니다.

그리고, 파이어 베이스 메시징에 메시지를 받았을 경우 이벤트를 처리하는 코드만 추가하면됩니다. 추가할 코드는 아래와 같습니다.

public void Start() {
  Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
  Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
}

public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token) {
  UnityEngine.Debug.Log("Received Registration Token: " + token.Token);
}

public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
  UnityEngine.Debug.Log("Received a new message from: " + e.Message.From);
}

위 코드와 합치면, 이렇게 됩니다. 저 같은 경우, 앱에서는 로그를 찍기 힘들기 때문에 레이블을 만들어 로그를 표시하도록 하였습니다. 주의 할점은 파이어 베이스로 인해 정의된 메소드들은 모두 메인 쓰레드가 아니므로, 레이블에 직접 접근할 수 없습니다. c#에서는 메인 쓰레드 외에 쓰레드에서 UI에 접근할 때, Invoke를 사용하였지만, 유니티에서는 어떻게 처리할 지 모르겠더군요. 그래서 update에서, 추가될 메시지를 확인해 메인 쓰레드에서 UI를 업데이트하도록 하였습니다.

하나의 스크립트에 모두 정의가 가능했고, 코드는 아래와 같습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


using Firebase;

public class PushTestScene : MonoBehaviour
{
    

    [Header("UI들")]
    public Text mainMessage = null;
    public string addMessage = "";


    [Header("초기화시 설정되는 값들")]
    public FirebaseApp app = null;

    void Start()
    {

        mainMessage.text = "";



        Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
        Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;



        Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {

            var dependencyStatus = task.Result;
            if (dependencyStatus == Firebase.DependencyStatus.Available) {
                // Create and hold a reference to your FirebaseApp,
                // where app is a Firebase.FirebaseApp property of your application class.
                app = Firebase.FirebaseApp.DefaultInstance;

                
                    lock(mainMessage)
                    {
                        addMessage += "파이어 베이스 앱을 무사히 초기화 하였습니다.";
                    }
                    // mainMessage.text = "파이어 베이스 앱을 무사히 초기화 하였습니다." ;
                    // this.SendMessage( "update_mainMessage", "파이어 베이스 앱을 무사히 초기화 하였습니다." );
                
                

                // Set a flag here to indicate whether Firebase is ready to use by your app.
            } else {

                lock( mainMessage )
                {
                    addMessage += string.Format("Could not resolve all Firebase dependencies: {0}", dependencyStatus);
                }
                // mainMessage.text = string.Format( "Could not resolve all Firebase dependencies: {0}", dependencyStatus ) ;

                // UnityEngine.Debug.LogError(System.String.Format(
                // "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
                // Firebase Unity SDK is not safe to use here.
            }

        });

    }


    public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token) {
        // UnityEngine.Debug.Log("Received Registration Token: " + token.Token);
        lock(mainMessage)
        {
            addMessage += string.Format( "Received Registration Token: " + token.Token );
        }
    }

    public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
        // UnityEngine.Debug.Log("Received a new message from: " + e.Message.From);
        lock(mainMessage)
        {


            var notification = e.Message.Notification;

            addMessage += string.Format(
                "Received a new message from: {0}, title: {1}, message: {2}" , e.Message.From
                , notification.Title
                , notification.Body
                );


        }
    }



    void Update()
    {

        lock(mainMessage)
        {
            // 추가할 메시지가 없는 경우 종료합니다.
            if( string.IsNullOrEmpty( addMessage ) ) return;

            // 기존 메시지에 메시지를 더해 주도록 합니다.
            mainMessage.text += addMessage;

            // 메시지를 지워 줍니다.
            addMessage = "";
        }

    }



}

그리고, 클라우드 메시지를 파이어 베이스에서 보내면 메시지가 잘 받아 집니다.

 

5. Android 메시지 보내기.

실제로 잘 받아 지는 지 테스트를 해봅시다. 안드로이드로 앱을 배포하고, 앱이 켜지면 아래 내용을 따라 실행해 주세요.

클라우드 콘솔에서, 왼쪽 메뉴중 Cloud Messaging 을 선택해 Cloud Messaging 페이지를 불러 옵니다. 불러온 페이지에서, Send your first message를 선택합니다.

나온 알림 작성 페이지의 각 항목에 적당한 값들을 입력하고 다음 버튼을 눌러 주도록 합니다.

다음 페이지에서 안드로이드 앱을 선택해 주고, 검토 버튼을 눌러 줍니다.

그럼 메시지 검토 창이 뜰텐데, 여기서 게시를 선택해 주도록 합니다.

저는 아래와 같이 무사히 결과를 받았습니다.

 

6. iOS 메시지 보내기.

위 프로비저닝 프로파일 만들기에서, 프로 비저닝은 이미 끝내서, 준비해야 합니다.

메시지를 iOS에 발신하기 위해서는, APN 키가 필요합니다. 애플 개발자 사이트로 접속해 Certificates, Identifiers & Profiles 로 이동합니다. 여기서 왼쪽 메뉴 중 Keys > All을 선택합니다. 그리고, + 버튼을 눌줍니다.

새 키 생성창에서 적당한 값들을 입력하고, Continue 버튼을 눌러 주도록 합니다.

그럼 만들것인지 다시 한 번 묻는 창이 나오는 데, Confirm을 눌러 주도록 합니다.

그럼 키 생성이 완료되었다는 창과 함께 키를 다운로드 받을 수 있습니다. Download 버튼을 눌러 키를 다운받습니다. 그리고, Key ID늘 잘 메모해 둡니다. 

파이어 베이스 콘솔로 돌아와 콘솔창에서 톱니바퀴 버튼을 눌러 프로젝트 설정 메뉴를 선택합니다.

설정키에서 클라우드 메시징 탭을 선택하고, APN 인증 키의 업로드 버튼을 선택해 줍니다.

APN 인증 키 업로드 다이얼로그가 뜨면 적당한 값들을 넣고, 업로드 버튼을 눌러 주도록 합니다.

이제 유니티로 돌아와 IOS로 플랫폼을 변경합니다.

플랫폼이 변경되면, 빌드를 눌러 xcode 프로젝트를 생성합니다.

내어 보내진 프로젝트에서, push를 허용해 줍니다.

그리고, 푸쉬 관련 프레임워크를 추가합니다. 다만, 공식 문서나, 기존에는 PushKit.framework를 사용했었습니다. 하지만, 파이어베이스에서는, UserNotifications.framework를 추가하라고 합니다. 일단, 저는 UserNotifications.framework를 추가하였습니다.

이렇게 빌드를해 정상적으로 앱을 호출된다면, 다음으로 넘어 가시면 됩니다.

이제 파이어 베이스에서 메시지를 보내어 봅시다. 파이어베이스 콘솔에서, 왼쪽의 Cloud Messaging 를 선택해 Cloud Messaging 페이지가 호출되면, 새 알림 버튼을 눌러 주도록 합니다.

그 다음 알림 전송 페이지가 호출되면, 적당한 값들을 넣고, 다음을 눌러 줍니다.

타겟 항목이 뜨면 iOS 앱을 선택하고, 검토를 눌러 줍니다.

메시지 검토 다이얼로그가 뜨면, 게시버튼을 눌러 메시지를 보냅니다.

저는 여기까지 메시지가 잘 도착하였습니다. 안드로이드와 마찮가지로.

 

 

 

'유니티' 카테고리의 다른 글

유니티 구글 플레이 연동  (0) 2019.04.29
unity Tapjoy offerwall  (1) 2019.04.29
탭조이 유니티 계정생성하기  (0) 2019.04.28
adpopcorn Unity 연동 - android  (0) 2019.04.28
adpopcorn Unity 연동 - 계정추가 (1/3)  (0) 2019.04.28
Posted by 창업닉군
,

iOS Firebase Push 사용하기

iOS 2019. 4. 26. 17:58

iOS 로 앱을 만들고, 푸쉬를 보내도 아무런 문제가 없습니다. 하지만, firebase와 통합을 하면, firebase를 통해 안드로이드 iOS까지 모두 문자를 보내 관리할 수 있습니다. 더구나, 유니티로 푸쉬를 보내려면, Firebase로 관리하면 깔끔 하므로, 그렇게 하는것이 좋습니다.

 

[선행작업]

프로비저닝 프로파일 만들기 (푸쉬 인증서 설명도 같이 있음) : https://nicgoon.tistory.com/202 .

 

[공식 문서]

iOS에서 Firebase 클라우드 메시징 클라이언트 앱 설정 : https://firebase.google.com/docs/cloud-messaging/ios/client?authuser=0 .
iOS 앱에서 메시지 수신 : https://firebase.google.com/docs/cloud-messaging/ios/receive?authuser=0 .

 

[주요링크]

파이어 베이스 : http://firebase.google.com/ .

 

 

 

1. xcode를 프로젝트 생성.

프로젝트를 생성하기전 푸쉬 관련 인증서 및 프로비저닝 파일을 모두 만들어 두시기 바랍니다.

먼저 싱글뷰 타입으로 프로젝트를 생성하기 바랍니다.

 

2. Firebase 프로젝트 생성.

파이어 베이스 첫 화면에서 콘솔로 이동 버튼을 눌러 콘솔로 이동합니다.

프로젝트 추가를 눌러 프로젝트를 생성합니다

프로젝트 추가 창이 뜨면, 적당한 값들을 입력하고, 프로젝트 만들기 버튼을 눌러 주도록 합니다.

그럼 프로젝트가 추가 되고 해당 프로젝트가 선택된 상태의 프로젝트 화면이 표시 됩니다.

 

3. 앱생성 및 Firebase SDK 추가.

아래의 프로젝트가 선택된 화면 상태에서, iOS 추가 버튼을 눌러 해당 프로젝트에 iOS앱을 추가하도록 합니다.

앱등록 항목이 뜨면, xcode를 만들때 입력한 iOS와 일치하는 번들 ID를 입력하도록 합니다. 그리고, 앱 등록 버튼을 눌러 주도록 합니다.

그럼 구성파일 다운로드 파일이 나오 데, 파일을 다운로드하고, 설명대로 파일을 추가하도록 합니다. 그리고, 다음 버튼을 누르면 됩니다.

Firebase SDK를 설치하기 위해서는 CocoaPods 파일이 설치되어 있어야 합니다. 코코아 Pods는 단 한줄의 명령으로 설치가 가능하며, Xcode가 설치되어 있어야 아래와 같이 설치할 수 있는 것으로 보입니다.

$ sudo gem install cocoapods

xcode로 만든 프로젝트 폴더로 이동합니다. 그리고, Podfile을 생성합니다. (이미 생성되어 있다면 할 필요 없습니다.) 주의할점은 앞에 sudo를 붙여 권한을 얻으려고 하면 오동작 합니다.

pod init

Podfile을 열고 다음 코드를 추가합니다. 

pod 'Firebase/Core'

그런데 처음 열면 어디에 넣어야할 지 모르실 수 있습니다. 하지만, 애플애들이 이런거 놔둘 애들이 아닙니다. 아래와 같이 코드가 되어 있을 것 입니다. #Pods for firebasepush 주석 아래 넣어 두시기 바랍니다.

파일을 저장하고 다음 명령어를 실행하세요. (권한을 얻기 위해 앞에 sudo를 붙이면 오동작합니다.) 정상적으로 동작을 한다면, 알아서, firebase sdk가 설치됩니다. 앞서 프레임 워크 포드가 설치되는데, 이게 시간을 좀 많이 잡아 먹습니다. (이미 설치되어 있다면 설치하지 않을 수도 있습니다.) 이후 파이어 베이스 SDK가 정상적으로 설치가 완료 됩니다.

pod install

설치가 완료되면, 프레임 워크 라이브러리가 자동으로 설정됩니다. 저는 pod를 처음 사용해 보아, 프레임워크를 추가하려고 갔는데, 자동으로 떡 들어와 있었습니다.

여기서 가장 중요한 것은, 아래 페이지에서, [앱에 사용할 .xcworkspace 파일이 생성됩니다. 향후 애플리케이션의 모든 개발 작업에 이 파일을 사용하세요] 라는 문구 입니다. 그대로 하지 않으면 초기화 코드를 추가할 때, import Firebase 구문을 추가하면, Could not build Objective-C module 'Firebase' 라는 오류를 만납니다. xcode를 종료하고, 프로젝트 폴더에서 새로 생긴 [프로젝트명.xcworkspace] 파일을 더블클릭해 프로젝트를 다시 열여 줍니다. 그리고 아래 이미지 처럼 다음 버튼을 눌러 주도록 합니다.

그럼 파이어 베이스 초기화 코드를 추가하는 코드가 표시 되는데, 추가할 것은 프레임워크 추가 구문과 초기화 메소드 추가 호출 부분뿐입니다. 단, 2줄. 그대로 추가하고, 다음 버튼을 눌러 주도록 합니다. (여기서 오류가 난다면, xcode를 xcworkspace 확장자를 가진 파일을 더블클릭해 실행하지 않아서 일 경우가 많습니다.)

다음을 누르면, 앱이 통신을 했는지 확인하려고 계속 대기 화면이 호출됩니다. 기기와 맥북을 연결후 한 번 실행해 줍니다.

이 화면에서 오래 동안 확인을 못하면, 이전을 눌러 준뒤 다시 다음을 눌러 5번 항목으로와 빌드를 하면, 아래와 같은 화면을 볼 수 있습니다. (몇 번 앱을 빌드하고, 실행하고를 반복하면됩니다. - 한 두번 정도 입니다.). 콘솔로 이동 버튼을 눌러 콘솔로 이동하도록 합니다.

 

4. firebase messaging SDK 추가하기

여기서 부터는 iOS에서 Firebse 클라우드 메시징 클라이언트 앱 설정 ( 링크 ) 이라는 공식 문서를 보고 작성하였습니다. 앞으로 공식문서라 함은 iOS에서 Firebase 클라우드 메시징 클라이언트 앱 설정 문서를 가리킵니다.

지금까지 우리는 Firebase 의 기본을 추가했습니다. 이제는 Cloud Messaging 관련 SDK를 추가하도록 하겠습니다. 공식 문서의 앞 페이지 부분은 이미 구현을 하였고, firebase messaging SDK 추가합니다. 문서 내용을 보시면 알겠지만 앞서 파이어 베이스 SDK를 구성할 때 함께 했어도 문제는 없었을 것이지만, 문서가 나눠져 있으므로, 문서대로 하도록 하겠습니다.

앞서 수정했던, podfile 파일을 열어 다음과 같이 Messaging 을 추가하면됩니다. Core에 Messaging 파일을 추가하도록 합니다.

pod 'Firebase/Core'
pod 'Firebase/Messaging'

그리고, 콘솔을 열어 프로젝트 폴더로 이동한 뒤 다음과 같이 입력해 줍니다. ( 앞에서도 이야기 했지만, sudo 를 통해 권한을 획득하려 하면 오류가 납니다.)

$ pod install

그리고, 파인더에서, 프로젝트명.scworkspace 파일을 더블 클릭해, xcode를 실행하도록 합니다.

 

5. PushKit.framework 등록.

iOS자체 푸쉬는 PushKit 프레임워크를 사용합니다. 이 것만으로 모두, 푸쉬가 구현 가능하며, 많은 분들이 관리상의 이유로 파이어 베이스만 으로, android iOS를 구성합니다. 파이어 베이스 또한 단독으로 푸쉬를 구성한 것은 아니며, PushKit. 프레임 워크를 이용해 푸쉬 기능을 구현했습니다.

그래서 우리 프로젝트에도 Pushkit을 넣어 주어야 정상적으로 푸쉬 기능을 사용할 수 있습니다. 

프로젝트를 선택하고, Capabilities 탭에서, Push를 활성화 합니다.

그리고 Genral 탭을 눌러 프레임 워크를 포함해 주도록 합니다.

 

6. APN 인증키 업로드.

메시지를 보내려면,  APN 인증키와 메시지등을 함께 구글 Apple Push Notification Server로 요청을 해야 합니다. 이 때 메시지와 함께 키를 보내야 하는 데, 이 때사용하는 것이 APN 키 입니다. APN키외에도 인증서를 이용해 메시지를 요청하는 방법이 있지만, Firebase에서는 APN 인증키를 통해 하는 것을 권장하고 있습니다. 저는 2가지 방식을 다 사용해 봤는데, 여러모로 APN 인증키를 사용하는 방법이 편합니다. 

개발자 사이트로 이동해 Certificates, Identifiers & Profile 페이지로 가 Keys All 메뉴를 선택합니다. 해당 페이지가 나오면, + 버튼을 눌러 APN 키 만들기를 시작합니다.

아래의 예시를 참고해 페이지를 작성하고, Continue 버튼을 눌러 주도록 합니다.

다음 페이지는 APNs 관련 설명 이며 키가 만들어 진다는 내용 입니다. Confirm 을 눌러 생성하도록 합니다.

생성하면, 아래와 같은 화면이 나옵니다. Download를 눌러 키를 다운로드 하고, Done 키를 눌러 종료 하도록 합니다.

여기서 다운로드한 파일을 그대로, 파이어 베이스 프로젝트에 셋팅해 주면됩니다. 파이어 베이스 프로젝트 콘솔로가 프로젝트 페이지의 톱니바퀴 버튼을 눌러 뜬 메뉴에서 프로젝트 설정을 선택합니다.

여기서 클라우드 메시징 탭을 선택하고, APN 인증키 업로드 버튼을 눌러 주도록 합니다.

여기서 인증키 업로드창이 뜨는 데, 앞서 내용을 확인해 적절한 값들을 넣어 주고 업로드 버튼을 눌러 키를 업로드합니다.

 

7. 원격 알림등록.

공식 문서에서는 적절한 시점에 원격 알림을 등록하라고 되어 있습니다. 예제에서는 AkppDelegate.swift 파일의 func application 속에 등록하고 있습니다. 소스를 그대로 복사해 해당 위치에 추가합니다.

        if #available(iOS 10.0, *) {
            // For iOS 10 display notification (sent via APNS)
            UNUserNotificationCenter.current().delegate = self
            
            let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
            UNUserNotificationCenter.current().requestAuthorization(
                options: authOptions,
                completionHandler: {_, _ in })
        } else {
            let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            application.registerUserNotificationSettings(settings)
        }
        
        application.registerForRemoteNotifications()

그리고 파이어 베이스 메시징을 프레임워크를 사용할 것임을 코드에 선언합니다. (파이어 베이스 문서에는 잘못되어 있을 수 있습니다. 저는 이 내용이 빠져 있더군요)

import FirebaseMessaging

여기까지 했다면, UNUserNotificationCenter.current().delegate = self 이 부분에 오류가 났을 것 입니다. 해당 델리게이트를 포함해 필요메소드를 정의해 주면 오류가 사라집니다. AppDelegate.swift 파일 끝에, ( AppDelegate 클래스 밖 )에 아래 소스를 복사합니다.

// [START ios_10_message_handling]
@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {
    
    // Receive displayed notifications for iOS 10 devices.
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let userInfo = notification.request.content.userInfo
        
        // With swizzling disabled you must let Messaging know about the message, for Analytics
        // Messaging.messaging().appDidReceiveMessage(userInfo)
        // Print message ID.
        if let messageID = userInfo[gcmMessageIDKey] {
            print("Message ID: \(messageID)")
        }
        
        // Print full message.
        print(userInfo)
        
        // Change this to your preferred presentation option
        completionHandler([])
    }
    
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        // Print message ID.
        if let messageID = userInfo[gcmMessageIDKey] {
            print("Message ID: \(messageID)")
        }
        
        // Print full message.
        print(userInfo)
        
        completionHandler()
    }
}
// [END ios_10_message_handling]

 

그러면, gcmMessageIDKey 값이 없어 오류가 날 것 입니다. AppDelegate 클래스의 멤버로, let gcmMessageIDKey = "gcm.message_id" 을 추가하면됩니다.

 

8. 메시지 대리자 설정.

앱이 시작되는 부분에 추가하면되며, 예제에는 AppDelegate.swift 파일에 application 메소드 속, FirebaseApp.configure() 메소드 아래에 포함되어 있습니다.

Messaging.messaging().delegate = self

이렇게 추가하면 MessagingDelegate 델리게이트를 상속하고 정의 해 주면됩니다. AppDelegate.swift 파일 속 AppDelegate 클래스 밖(문서 끝)에 아래의 코드를 추가해 주도록 합니다. 이 부분은 토큰을 받고 메시지를 받는 부분 입니다.

extension AppDelegate : MessagingDelegate {
  // [START refresh_token]
  func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    print("Firebase registration token: \(fcmToken)")
    
    let dataDict:[String: String] = ["token": fcmToken]
    NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
  }
  // [END refresh_token]
  // [START ios_10_data_message]
  // Receive data messages on iOS 10+ directly from FCM (bypassing APNs) when the app is in the foreground.
  // To enable direct data messages, you can set Messaging.messaging().shouldEstablishDirectChannel to true.
  func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
    print("Received data message: \(remoteMessage.appData)")
  }
  // [END ios_10_data_message]
}

 

9. 메시지 받는 부분 추가.

여기서 부터는 iOS 앱에서 메시지 수신 이라는 문서 ( 링크 ) 를 참고 합니다. 

소스는 AppDelegate.swift에 메소드 2개를 추가하는 것 뿐 입니다.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  completionHandler(UIBackgroundFetchResult.newData)
}

 

10. 메시지 보내기.

앱이 꺼져 있을 때는 아이폰의 헤드업 알림으로 표시가 되고, 켜저 있을 때는 내부 메시지 받는 부분에서 처리가됩니다.

파이어 베이스 콘솔에서, Cloud Messaging 버튼을 눌러, 클라우드 메시지 페이지를 열어 주도록 합니다.

그리고, 뜬 알림작성 페이지에, 적당한 문구를 입력하고 다음을 눌러 줍니다.

2번째 페이지가 뜨면, 우리가 만든 앱을 선택해 주고, 검토 버튼을 눌러 줍니다.

검토 화면이 나오면, 게시 버튼을 눌러 메시지를 보냅니다.

 

메시지가 잘 도착했나요? 저는 잘 도착했습니다. 아이폰은 안드로이드와 달리, 푸쉬를 받지 않도록 해 두면, 앱이 켜진 상태에서도 푸쉬 메시지를 받지 못합니다.

'iOS' 카테고리의 다른 글

iOS in-app purchase  (7) 2019.04.14
Push Notification (iOS, client)  (0) 2019.04.13
애플 앱을 기기에서, 실행하기 위한 방법  (0) 2019.04.12
웹 뷰 추가 및 웹통신 (UIWebView 이용)  (1) 2019.04.05
Posted by 창업닉군
,

 Push Notification 서버를 기본 REST API 형태로 구현하려고 했으나, 애플 공식 문서를 보는 순간, 아, 그냥 node js의 모듈을 이용해야 겠다는 생각이 들었습니다. iOS 서버를 따로 만들어 구동 방식을 이해하고, Fire base 에 통합할 예정이라, 별 고민 없이 node의 모듈을 이용하게 되었습니다.

node js의 apn 이라는 모듈을 이용할 예정이며, 선행작업으로는 프로비저닝 프로파일 및 푸쉬 인증서, 클라이언트 푸쉬구현이 되어 있어야 합니다.

 

선행 작업.

프로비저닝 프로파일 및 푸쉬 인증서 생성 : https://nicgoon.tistory.com/202 (필수)
클라이언트 Push 구현 : https://nicgoon.tistory.com/203 (필수)

 

공식 문서.

푸쉬서버 설치 : https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server .
APNs로 알림요청 : https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns .
푸쉬 메시지 구조 : https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/generating_a_remote_notification .
node-apn 문서 : https://www.npmjs.com/package/apn .

 

참고 문서.

참고 1. https://g-y-e-o-m.tistory.com/72 .
참고 2. http://blog.naver.com/PostView.nhn?blogId=jipmouse&logNo=220829918858 .

 

1. apn 설치.

npm i apn --save

 

2. 인증서 복사.

위의 선행 작업 문서 중, [프로비저닝 프로파일 및 푸쉬 인증서 생성] 링크를 눌러 나타나는 문서에, 푸쉬 인증서 .pem 을 만드는 방법이 있습니다. 여기서 푸쉬 인증서 pem 파일과, 푸쉬 인증서의 key pem 파일(암호를 풀어 놓은 것) 을 만들어 이것을 복사해 둡니다.

저는 인증서 파일의 이름은 [yeslife_ap_cer.pem] 이며, 키 파일의 이름은 [yeslife_ap_key.unencrypted.pem] 입니다.

 

3. apn 프로바이더 만들기.

옵션을 만들어 프로바이더를 생성하는 구조이며, 옵션은 토큰을 넣는 방법, 인증서를 넣는 방법 2가지가 있습니다. 저는 인증서를 넣는 방법을 선택했습니다. 아래 2가지 방법 중 하나로 옵션을 만들면 되겠습니다.

1) 푸쉬 인증서로 보내기.

gateway는 개발단계에서는  gateway.sandbox.push.apple.com 이며, 실제 서비스 할 때는 gateway.push.apple.com 입니다. 해당 내용은 애플 개발자 공식문서 (링크) 에 나와 있습니다.

var option = {
    gateway:"gateway.sandbox.push.apple.com",
    cert:'yeslife_ap_cer.pem',
    key:'yeslife_ap_key.unencrypted.pem'
};

let apn_provider = new apn.Provider( option );

 

2) 토큰 으로 보내기.

먼저, 애플 개발자 사이트의 Certificates, Identifiers & Profiles 부분페이지에서 토큰을 생성하고 다운로드 받도록 하겠습니다. Certificates, Identifiers & Profiles 페이지로 에서 Keys, All 을 선택하고, + 버튼을 눌러 주도록 합니다.

나온 페이지에서, Name 과 APNs 항목을 클릭하고, Continue 버튼을 눌러 주도록 합니다.

키를 만들기 전 입력사항이 맞는지 확인하는 페이지에서 Confirm을 눌러 생성하도록 합니다.

키가 만들어 졌습니다. Key ID는 중요하므로, 꼭 적어 두도록 합니다. 그리고 키는 한 번만 다운로드 가능합니다. 옵션은 아래와 같은 요령으로 만들어 주면되겠습니다. Production은 개발인지 실제 서비스하는 지 여부 입니다. (호출 주소가 틀림).

var option = {
    token : {
        key : '.p8 파일 경로',
        keyId:'키를 만들 때 표시된 아이디',
        teamId: "팀명"
    },
    production: false
};

 

4. 보낼 내용 및 장치 토큰 저장해 두기.

앱이 켜지면,  APNs 에 앱이 등록되는 데, 성공하면, 토큰을 받아 옵니다. 이 값을 deviceToken 값에 저장해 줍니다.

보낼 내용은 apn.Notification 객체에 저장이 되는 데, 이 부분은 공식 문서의 payload 부분을 참고 하면 되겠습니다.

// 앱에서 APNs에 앱을 등록하고, 얻은 값.
let deviceToken = 'A89B3B5731AD3821D0AA316CFBC6E54E750C216ED6308112CE437BAC3730005F';



// 보낼 데이터를 만들어 줍니다.
var note = new apn.Notification();

// 보내기 실패할 경우 언제까지 재시돌 할 것인지 여부.
note.expiry = Math.floor( Date.now() / 1000 ) + 3600;

// 앱의 아이콘에 표시될 숫자. ( 우리가 흔히 몇 개의 메시지가 있다고 인식하는 )
note.badge = 3;

// 메시지가 도착했을 때 나는 소리.
note.sound = "ping.aiff";

// 메시지 내용.
note.alert = "왓쇼이 왓쇼이";

// 누가 보냈는지 여부.
note.payload = {"messageFrom" : "메시지"};

// ios app 번들 명.
note.topic = "com.tistory.yeslife.hello";

 

 

5. 메시지 보내기.

apn.provider의 send 메소드를 이용해 보내면 됩니다.

// 실제 메시지를 보내도록 합니다.
apn_provider.send(note, deviceToken).then( function( result ){

    console.log("결과 : " + result);
    console.log( result );

}).catch( function (err){

    throw( err );
    
});

 

별다른 문제가 없다면, 메시지가 성공적으로 도착합니다.

 

 

 

 

 

 

 

'Node.js' 카테고리의 다른 글

node.js nodemailer gmail  (0) 2019.05.24
node js OAuth 2.0 Login  (0) 2019.04.16
Android 결제 서버 개발  (0) 2019.04.09
node.js FCM (Push Notification) 서버 환경 구축하기  (1) 2019.04.06
express 사용시 주의 사항.  (0) 2019.03.04
Posted by 창업닉군
,

Push Notification (일명 : 푸쉬)는 서버에서 사용자에게 일방적으로 메시지를 보내는 기능 입니다. 주로, 운영자가 특정 소식을 전할 때 사용됩니다. 사인할 프로비저닝 파일이 필요하며, App id에는 Push를 사용할 것으로 설정이되어 있어야 합니다. (앱 아이디 수정도 가능합니다.)

 

선행작업.

프로비저닝 프로파일 만들기 (푸쉬 인증서 설명도 같이 있음) : https://nicgoon.tistory.com/202 (숙지하셔야 합니다.)

 

공식문서

유저 노티피케이션 : https://developer.apple.com/documentation/usernotifications ( 이 문서에 스텝이 있습니다.).
푸쉬 킷 : https://developer.apple.com/documentation/pushkit ( 함께 사용되지만, 참고만 있습니다. )

 

참고 문서

예제1: https://faith-developer.tistory.com/153 (끝부분만 보시면됩니다.).
예제2: http://monibu1548.github.io/2018/05/29/push-cert/ ( 역시 끝 부부만 보시면됩니다.)

 

1. 준비.

Xcode 프로젝트를 생성합니다. 위의 [프로비저닝 프로파일 만들기], 를 참고해, 프로젝트를 듭니다. 저는 [com.tistory.yeslife.hello] 라는 번들 아이디로 프로젝트를 만들었습니다. 이 페이지에서 참고한 기준 문서는 유저 노티피케이션 입니다. 아래 Topics 부분을 보면, 순서로 나열된 것이 있습니다.

 

2. 프레임 워크 추가.

프로젝트 > Build Phases 탭을 차례로 선택하고, Link Binary With Libraries를 확장 시킵니다.

+ 버튼을 눌러, UserNotifications.framework 와 PushKit.framework를 추가해 줍니다.

 

3. Capabilities 탭을 선택해 푸쉬를 활성화 해 줍니다.

프로젝트 > Capabilities 탭을 차례로 선택해 줍니다. 그리고, 페이지를 스크롤해 Push Notifications를 활성화 해 줍니다. (Provisioning Profile이 서정되어 있지 않다면, 활성화 할 수 없습니다.).

 

4. 사용자에게 알림을 사용할 것인지 묻기.

UserNotifications 문서 토픽에 보면, 첫 스텝으로 Asking Permission to Use Notifications 문서 ( 링크 ) 가 있습니다. 그 문서를 참고해 사용할 것인지 묻는 코드를 작성하였습니다.

 

1) 앱 델리 게이트 부분에 사용자 물음 추가. (Application 메소드 속에 넣으면 좋습니다.).

// 유저 노티피 케이션 센터를 가지고 옵니다.
let center = UNUserNotificationCenter.current()

// 사용 여부를 묻습니다.
center.requestAuthorization(options: [.alert, .sound])
{ (granted, error) in

    // 승인 받았는지 여부를 여기서 확인할 수 있습니다.
    guard granted else {
        print( "유저가 푸쉬 알림을 허락하지 않았습니다." )
        return
    }

    print( "유저가 푸쉬 알림을 허락하였습니다." )

}

 

5. 장치를 푸쉬 서버에 등록.

유저가 푸쉬를 허락한 경우, 장치를 APNs에 등록하고, 등록된 키 값을 받아 오는 부분 입니다. 공식 문서는 Registering Your App with APNs 부분을 확인하시면 되겠습니다. 

1) 위에서 푸쉬 알림 허락한 부분에 등록을 요청하는 코드를 등록 합니다.

주의 할 점은, 응답이 왔을 때 메인 쓰레드 (UI)와 동기화 처리가 필요하므로, DispatchQueue.main.async 메소드 속에서 호출해야 합니다.

위에서 작성했던 코드가 아래와 같이 됩니다.

let notificationCenter = UNUserNotificationCenter.current()
        
        notificationCenter.getNotificationSettings
        { (settings) in
            
            // Do not schedule notifications if not authorized.
            let center = UNUserNotificationCenter.current()
            
            // Request permission to display alerts and play sounds.
            center.requestAuthorization(options: [.alert, .sound])
            { (granted, error) in
                
                
                // 유저가 푸쉬를 사용하지 않겠다고 한 경우, 여기서 처리합니다.
                guard granted else {
                    print("유저가 푸쉬 알림을 승인하지 않았습니다.")
                    return
                }
                
                
                // 푸쉬를 처리한 경우, 여기서 처리 합니다.
                print("유저가 푸쉬를 승인하였습니다.")
                
                
                // 메인 쓰레드 UI와 Thread 동기화 처리 될 수 있도록, DispatchQueue.main.async 메소드로 감싸 줍니다.
                DispatchQueue.main.async {
                    
                    // APNs 에 스마트폰을 등록하는 메소드 입니다. (네트워크)
                    UIApplication.shared.registerForRemoteNotifications()
                    
                }
                
                
            }
        }

 

2) APNs로 부터 응답처리.

2개의 메소드 모두 AppDelegate 클래스에 추가하도록 합니다.

// APNs 서버에 등록한 경우 표시.
func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken
    deviceToken: Data) {

    // 토큰 값을 가지고 옵니다.
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})

    // 콘솔에 토큰 값을 표시해 줍니다.
    print("APNs device token: \(deviceTokenString)")


}



// APNs 서버에 등록하지 못한 경우, 오류를 표시.
func application(_ application: UIApplication,
                 didFailToRegisterForRemoteNotificationsWithError
    error: Error) {

    // Try again later.


}

 

6 클라이언트 검증해 보기.

일단 클라이언트 부분의 푸쉬 부분은 끝났지만, 이게 잘 동작하는 지 확인할 필요가 있습니다. 서버까지 구축 후 푸쉬를 보내어 보았는데, 안되면, 과연 서버 문제인지, 클라이언트 문제인지 파악하기 힘들 수 있습니다. 그래서 다른 사람들이 구축해 놓은 서버 프로그램으로 푸쉬가 잘되는지 확인할 수 있습니다. 우리는 http://apns-gcm.bryantan.info 라는 사이트를 이용할 것 입니다.

당연한 이야기 일 수 있습니다만, 앱이 종료된 상태여야 푸쉬가 옵니다. 앱이 켜진 상태에서는 푸쉬를 보내도 푸쉬가 오지 않습니다.!!

그리고, 이 것을 테스트 하기 위해서는 푸쉬 인증서가 필요하며, 위의 인증서 설명 링크를 통해 인증서를 만들 도록 하시기 바랍니다.

먼저 pans-gcm ( http://apns-gcm.bryantan.info ) 에 접속 합니다. 아래와 같은 화면이 나오면, 각 값을 입력해 줍니다.

Device Token에는 기기를 APNs에 등록하고, 받아 왔던 토큰, Message는 보낼 메시지를 넣어주세요. Pem File은 인증서로 만들었던, 파일을 넣어주세요. Environment는 Sandbox를 선택해 줍니다. 그리고 Submit 버튼을 누르면, 메시지가 보내어 집니다.

 

원래 계획은 이곳에 서버 제작도 넣으려고 했으나, 따로 분리하는 것이 좋겠다 생각되어, 클라이언트 제작 내용만 남깁니다. 이 후 서버 제작 부분도 페이지를 만들도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'iOS' 카테고리의 다른 글

iOS Firebase Push 사용하기  (3) 2019.04.26
iOS in-app purchase  (7) 2019.04.14
애플 앱을 기기에서, 실행하기 위한 방법  (0) 2019.04.12
웹 뷰 추가 및 웹통신 (UIWebView 이용)  (1) 2019.04.05
Posted by 창업닉군
,

FCM에는 모바일에 필요한 다양한 서비스를 제공하고 있다. 그 중 가장 많이 사용하는 서비스 중 하나인 Cloud Messaging 서비스의 서버를 node.js를 통해, 제작해 보겠습니다. 이 문서는 비공개 키를 통해 SDK를 초기화해 send 메소드를 통해 보내기를 합니다. 만약 그렇지 않은 경우, 토큰을 받거나, 유지하는 기능까지 구현해야 할 수도 있습니다. 다른 방법으로 하려면 참고해 주시기 바랍니다.

선행작업으로, 안드로이드 기기에 메시지를 받을 앱이 깔려 있어야 합니다.

 

FCM Push notification (android)

서버에서 안드로이드로 메시지를 보내는 방법을 포스팅합니다. 파이어 베이스에서는 쉽다고 홍보하고 있지만, 프로그래머 대부분은 여기서 머리를 싸매게 됩니다. 일단 파이어 베이스 문서(공식)가 별로 자세하지..

nicgoon.tistory.com

 

요구사항 : node 6.0 이상

정식 문서
서버 환경 및 FCM : https://firebase.google.com/docs/cloud-messaging/server?authuser=0
서버에 Firebase Admin SDK 추가 : https://firebase.google.com/docs/admin/setup?authuser=0 .
보내기 요청 작성 : https://firebase.google.com/docs/cloud-messaging/send-message?authuser=0

 

 

1. Firebase Admin SDK  설치

관련 문서인 서버 Firebase Admin SDK 추가 문서를 읽어 보면 다양한 경우에 대한 SDK 서버 설치 관련 옵션이 존재 합니다. 우리는 node.js 로 설치 할 것이 므로, node.js 관련 부분만 보면 되겠습니다.

   1) firebase 관리자 설치.

   $ npm install firebase-admin --save

   2) sdk 초기화를 위한 비 공개 키 다운로드.

   먼저, 프로젝트 설정으로 이동합니다.

   서비스 계정 -> 새 비공개 키 생성을 차례로 선택해 줍니다.

새 비공개 키 생성 창이 뜨면 키 생성 버튼을 눌러 키를 생성합니다.

그럼 키가 다운로드 되는 데 이것을 적당한 위치에 저장합니다.

   3) 소스 추가. 위에서 확인한 내용을 토대로, 아래 소스에 값을 쉽게 넣을 수 있으리라 생각됩니다.

var admin = require('firebase-admin');

var serviceAccount = require('path/to/serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

위 코드를 보면, Admin SDK 초기화 부분에, databaseURL: 'https://<DATABASE_NAME>.firebaseio.com' 부분이 있는데 위 코드에는 왜 빠져 있지 라고 생각하시는 분들이 있을 수 있습니다. 보내기 요청 승인 이라는 문서가 있는 데 이 문서는 지금처럼 자동으로 보내지 않는 경우 토큰으로 처리해야함을 설명하고 있는 문서 이며, 지금과 같이 Admin SDK를 사용하는 경우, Admin ADK를 초기화 하는 설명이 나와 있습니다. 이 부분에, 데이터 베이스 부분을 넣지 않고 설정하고 있습니다. 확인해 본 결과, 메시지를 보낼 때는 이 부분이 필요 없습니다.

 

2. 보내기

메시지 보내는 것은 보낼 메시지를 만드는 부분과 이를 보내는 부분을 구현하면됩니다.  보내는 방법은 개별기기에, 주제별, 조건별로 보낼 수 있습니다. 각각의 방법은 firebase 공식문서를 참고해 주시기 바랍니다. 여기서는 한 기기에 보내기만 합니다. 소스는 아래와 같으며, 설명은 불필요 할 것으로 보입니다.

// 보낼 메시지를 작성하는 부분 입니다.
var fcm_target_token = "cdtmyCPou2I:APA91bHYP7ltSi6Q_nd8lGVJnwrhYcHcQJIRFaseE494PYe1mQKBe1QfhW-8i_gEpJZqSM1XcWZrqkXEVxWt9BTGpQctJ_RVy9V3OZU-ltcITNpANsB0HsCa9gvRpNM3iOGKoDjOGeqa";
var fcm_message = {

  notification: {
    title: '시범 데이터 발송',
    body: '클라우드 메시지 전송이 잘 되는지 확인하기 위한, 메시지 입니다.'
  },
  data:{
    fileno:'44',
    style:'good 입니다요~'
  },
  token:fcm_target_token

};



// 메시지를 보내는 부분 입니다.
fcm_admin.messaging().send(fcm_message)
  .then(function( response ){
    console.log('보내기 성공 메시지:' + response);
  })
  .catch(function( error ){
    console.log( '보내기 실패 메시지:' + error );
  });

 

 

 

 

 

 

Posted by 창업닉군
,

서버에서 안드로이드로 메시지를 보내는 방법을 포스팅합니다. 파이어 베이스에서는 쉽다고 홍보하고 있지만, 프로그래머 대부분은 여기서 머리를 싸매게 됩니다. 일단 파이어 베이스 문서(공식)가 별로 자세하지 않고, 설명 띄엄 띄엄하고, 솔루션도 제공하지 않습니다. 따라서 가장 최신판 책을 한 권 구매하시기 바라며, 이 내용은 그저 트러블 해결 용도로 이용하시기 바랍니다.

참고 사항.

참고 사항 1. 메시지를 보낼 때, 앱이 켜져 있으면, 내부 앱에 메시지가 뿌려지고, 앱이 꺼져 있으면, 상단 알림으로, 메시지가 보내저 소리등이 나게 됩니다. (기본적으로.).

참고 사항 2. 설정에서 알림 받지 않기를 해도 앱이 켜져 있을 때는 알림을 받습니다. 꺼져 있을 때만, 받지 않습니다. 그러므로, 이 것을 이용해 챗팅을 구현해도 상관이 없습니다.

참고 사항 3. 알림을 받기로 허용하면, 앱을 한 번 실행한 뒤 부터 알림이 도착하기 시작합니다. (참고해 주세요).

 

1. FCM 에서 프로젝트 만들기.

   1) 계정 만들기. (생략).

     아마 별로 어려울 것이 없을 것이라 생각이 됩니다.

   2) 프로젝트 생성.

      이름을 잘 정해서 하나 만들어 주시기 바랍니다.

 

2. Android 앱 추가.

   1) Android 앱 등록.

      패키지 명을 잘 등록해 줍니다.

 

   2) 구성파일 다운로드.

      설명에도 나와 있지만, 프로젝트 보기로 전환하고, (중요), 다운로드 파일을 google-services.json 파일을 App 폴더 하위에 추가하도록 합니다.

 

   3) Firebase SDK 추가.

      이 부분은 설명은 참 쉽게 되어 있는 데 (추가하는 것 자체는 쉽습니다.). 입력값 그대로 넣으면 빨간 줄이 쭉쭉 그여질 수 있습니다. 구글 SDK가 업데이트 되면, Firebase SDK 업데이트도 다시 되어야 하는데, 파이어 베이스는 이런일에 둔감합니다. 그래서, 버전이 잘 안맞습니다. 그래서 트러블이 생길 수 있는 데, 이것들은 검색을 통해 확인해야 합니다.

설치할 때, 버전은 이 문서를 참고 하도록 합니다. : https://firebase.google.com/docs/android/setup?authuser=0

일단 시키는 대로 추가하고, 우상단 Sync now를 눌렀는데, 아래와 같이 트러블이 생깁니다.

저와 같이 트러블이 생기는 분은 아래와 같이 몇개의 모듈을 추가해 주면 해결됩니다.

implementation 'com.android.support:animated-vector-drawable:28.0.0'
implementation 'com.android.support:support-media-compat:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'

* 그럼 아래와 같이 밑줄이 사라진 것을 볼 수 있습니다.

 

   4) 앱을 실행하여 설치확인

   이 부분은 일단 건너 뛰도록 합니다.

 

3. FCM을 사용할 수 있도록 서비스를 만들어 등록하기.

공식문서 : https://firebase.google.com/docs/cloud-messaging/android/client?authuser=0

FCM을 사용하려면, 해당 모듈을 등록하고, 서비스 클래스가 2개가 필요합니다.

   1) 조금전까지 설치했던, 모듈들은 모두 FCM Core 입니다. 코어는 파이어 베이스를 사용하기 위해 기본적으로 설치되어 있어야하는 것들 이고, 메시지를 사용하려면, app 수준 모듈에 아래와 같이 모듈을 설치 해줍니다.

   implementation 'com.google.firebase:firebase-messaging:17.3.4'

 

   2) MyFirebaseMessaginService.

   실제 메시지를 받는 서비스의 클래스 입니다. 위 이름이 예제 파일과 같은 이름인데, 바꾸지 않는 것이 좋습니다. 파이어 베이스를 몇 번해 보았지만, 바꾸지 않는 것을 권해 드립니다. 서비스를 만들 때, FirebaseMessagingService클래스를 상속해서 만들도록 합니다.

생성자 외 메소드는 모두 지웁니다. 그리고, Ctrl+o를 눌러, onNewToken, onMessageReceived 가상 메소드들을 재정의 하도록 합니다. (선택하면 자동완성됨).

onNewToken은 메시지에 사용될 토큰을 새로 발급받았을 때, 호출되는 메소드로 이 토큰은 각각의 기기를 식별해 사용하는 메소드 입니다. onMessageReceived 는 메시지를 받았을 때 호출되는 메소드 입니다. 아래는 해당 서비스의 소스 코드 입니다.

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "FCM";

    public MyFirebaseMessagingService() {
    }

    // 새로운 토큰을 확인했을 때 호출되는 메소드.
    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);

        // 토큰 정보를 출력합니다.
        Log.e(TAG, "onNewToken 호출됨: " + token);

    }


    // 새로운 메시지를 받았을 때 호출되는 메소드.
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        // 받은 메시지를 출력합니다.
        Log.e( TAG, "onMessageReceived 호출됨" + remoteMessage );

    }
}

 

   3) 서비스 xml등록.

우리가 위에서 서비스로 앱을 등록해 주었기에, 서비스를 xml에 등록할 필요가 없을 것 같지만, 그렇게 해두면 푸쉬 메시지를 받지 못합니다.  아래 코드를 확인해 푸쉬 메시지를 등록할 수 있게 해 줍니다.

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".MyFirebaseMessagingService"
            android:enabled="true"
            android:exported="true">

            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>

        </service>

   4) 퍼미션 등록

푸쉬 서비스를 이용하기 위해, internet 퍼미션을 등록합니다.

<uses-permission android:name="android.permission.INTERNET" />

 

4. 화면 레이아웃 만들기.

   이 부분은 적당히 만들어 주시 기 바라며, 굳이 만들 필요가 없을 수도 있습니다.

 

5. MainActivity 에  토큰관련 메소드 추가.

   아래 토큰을 받은 시점과 토큰을 받은 후 원하는 시점에, 토큰ID를 가지고 오는 메소드 입니다. (참조해서 쓰면됩니다.)

        // 토큰이 등록되는 시점에 호출되는 메소드 입니다.
        FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this,

                new OnSuccessListener<InstanceIdResult>() {
                    @Override
                    public void onSuccess(InstanceIdResult instanceIdResult) {

                        String newToken = instanceIdResult.getToken();
                        Log.d( TAG, "새토큰" + newToken );

                    }
                }

        );



        // 버튼을 눌렀을 경우, 저장된 토큰을 가지고 오는 메소드를 설정합니다.
        Button btn_1 = findViewById(R.id.button);
        btn_1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {

                String savedToken = FirebaseInstanceId.getInstance().getId();
                Log.d(TAG, "등록되어 있는 토큰ID:" + savedToken);



            }
        });

   

6. 메시지를 받았을 경우 처리하는 메소드 넣기.

   1) MyFirebaseMessagingServiced 서비스에서 메시지를 받은 경우 처리.

    // 새로운 메시지를 받았을 때 호출되는 메소드.
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        // 일단 받은 데이터 중, 내용만 가지고와 출력하는 메소드 입니다. (파이어 베이스 홈페이지에서 보내면 데이터는 값이 없을 수 있습니다.)
        String from = remoteMessage.getFrom();
        Log.d(TAG,
        "title:" + remoteMessage.getNotification().getTitle()
        + ", body:" + remoteMessage.getNotification().getBody()
        + ", data:" + remoteMessage.getData()
        );


        // 액티비티 쪽으로 메시지를 전달하는 메소드를 호출합니다.
        sendToActivity(
                getApplicationContext()
                , remoteMessage.getFrom()
                , remoteMessage.getNotification().getTitle()
                , remoteMessage.getNotification().getBody()
                , remoteMessage.getData().toString()
                );

    }



    // Activity 쪽으로 메소드를 전달하는 메소드 입니다.
    private void sendToActivity(Context context, String from, String title, String body, String contents ){


        Intent intent = new Intent(context, MainActivity.class);
        intent.putExtra("from", from);
        intent.putExtra("title", title);
        intent.putExtra("body", body);
        intent.putExtra("contents", contents);


        intent.addFlags(
                Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP
        );


        context.startActivity(intent);


    }

   2)  Activity에서 받은 메시지를 처리하는 경우.  (소스에 주석을 넣어 두었으므로, 참조하면되겠다.)

    // 서비스로 부터 인텐트를 받았을 때의 처리.
    @Override
    protected void onNewIntent(Intent intent) {
        println( "onNewIntent 호출됨" );

        // 인텐트를 받은 경우만, 값을 Activity로 전달하도록 합니다.
        if( intent != null )
        {
            processIntent( intent );
        }


        super.onNewIntent(intent);

    }



    // 인텐트를 처리하도록 합니다.
    private void processIntent( Intent intent ){

        String from = intent.getStringExtra("from");
        if( from == null )
        {

            // from 값이 없는 경우, 값을 전달하지 않습니다. (푸쉬 노티 메시지가 아닌것을 판단하고 처리하지 않는듯).
            Log.d( TAG, "보낸 곳이 없습니다." );
            return;

        }


        // 메시지를 받은 것우 처리를 합니다.
        Log.d( TAG, "여기서 메시지 응답 처리를 하면 됩니다." );


    }

 

7. 이렇게 하고, FCM 사이트로가 클라우드 메시지를 보내면, 메시지를 무사히 보낼 수 있습니다. 자세한 사항은 FCM의 클라우드 메시지를 확인해 보시면 되겠습니다.

 

 

 

 

   

Posted by 창업닉군
,

선행 작업.
파이어 베이스 프로젝트 생성 : http://nicgoon.tistory.com/171
안드로이드 프로젝트 생성 및 안드로이드 프로젝트에 파이어 베이스 추가 : http://nicgoon.tistory.com/172

 문서를 참고 하시기 바랍니다.

 

 

위 선행작업이 완료되었다면, 파이어 베이스로(https://console.firebase.google.com) 접속 합니다. 아래와 같은 창이 뜨면 자신이 설정할 프로젝트를 선택해 줍니다.

그럼 프로젝트 창이 뜨는 데, 왼쪽 아래의 Notification 항목을 선택해 줍니다.

그럼 아래와 같은 창을 만납니다. 일단 이 곳에서는 자신의 앱이 설치된 스마트폰에 메시지를 보낼 수 있습니다. 테스트 과정에 사용해 보기 좋으며, 이를 참고해서 추후 웹서버를 구성하면 좋습니다. 일단 클라이언트 부분을 완성해야 하므로, 아래에 표시된 문서 보기를 눌러 줍니다.

아래 화면이 나오면 조금 더 내려서, [ANDROID 설정] 버튼을 눌러줍니다.
바로 가기 주소 : https://firebase.google.com/docs/cloud-messaging/android/client

 

-> [firebase message service] 플러그인 추가.
앱 수준의 [Build.gradle] 에 플러그인을 추가하면, 되며, 차 후 다른 서비스의 플러그인을 추가할 때도, 이 곳에 플러그인을 추가하면 됩니다.

 

 

-> 메시지를 수신하고 처리하는 서비스와, 토큰을 관리하는 서비스를 추가한다.
    액티비티 아래 부분에 추가하는 것이 가장 적당하다.

 

-> 옵션 사항으로, 메시지가 왔을 때 메시지 리스트에 쌓을 스택 바에 표시될 아이콘에 관한 설정을 할 수 있다.
<Application> 태그 사이에 추가하고, 아이콘을 설정한 메타 태그 속 [android:resource=@] 값은 이미지 값을 설정해 둔다.

-> 토큰을 관리하는 [FirebaseInstanceIdService] 파일을 생성하고, 필요한 코드를 추가합니다.
이는 설명을 잘 읽어 보고, 아래 내용의 파일을 액티비티가 있는 폴더에 그대로 생성합니다.

https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseInstanceIDService.java#L35-L45

 

-> [MyFirebaseMessagingService.java] 파일 추가.
해당 문서에는 나와 있지 않지만, 위의 매니페스트에서 서비스가 실행됨을 정의했으므로, 당연히 파일을 추가해야 한다.
아래의 파일을 액티비티가 있는 폴더에 생성해 추가한다.

https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java

 

이 파일을 추가 후 아래 표시될 아이콘을 변경해 주어야 한다.

 

아래 이미지 처럼 /App 폴더 속 [Build.gradle] 파일에 [compile 'com.firebase:firebase-jobdispatcher:0.6.0']을
추가해 줍니다.

 

마지막으로, 메인 액티비티가 있는 폴더에, 아래 파일을 추가해 주고, 실행하면됩니다.

https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyJobService.java

 

-> 파이어 베이스 콘솔을 통해 메시지를 보냅니다.

여기까지하고 앱을 실행시키고, 메시지를 보내면, 메시지가 오는 것을 확인할 수 없습니다.
다만 Android Monitor에 찍힌 값을 보면 메시지가 왔을 때 본문을 확인할 수 있습니다.
( Android Monitor에서 [onMessageReceived]값을 검색어로 입력 하면 확인 가능.  )

 

-> 메시지 푸쉬 부분을 구현하기 위해, [MyFirebaseMessagingService.java] 파일의 [onMessageReceived]
파일의 코드를 수정합니다.

그리고 메시지를 보내면, 메시지가 오는 것을 확인할 수 있습니다.

'Android > FCM 연동' 카테고리의 다른 글

안드로이드 FCM push Message (2/3)  (0) 2017.08.27
안드로이드 FCM push Message (1/3)  (0) 2017.08.27
Posted by 창업닉군
,

안드로이드에 push message를 보내려면, 구글에 로그인하고, firebase(https://console.firebase.google.com/)에 접속합니다. 그럼 아래와 같은 창을 만나게 됩니다.

 

일단 자신의 앱에 사용할 서비스를 설정할 프로젝트를 만들어 준다. 당연히 앱 이름과 비슷하거나, 같다면, 관리하기 편하다. 화면 하단의 [프로젝트 추가](큰 파란 버튼) 버튼을 누릅니다.

그럼 아래와 같이 프로젝트 만들기 창이 뜹니다. [프로젝트 이름] 항목과 [국가/지역] 항목을 선택한 후 [프로젝트 만들기] 버튼을 눌러 줍니다.

프로젝트가 생성되어 프로젝트 창이 뜨면 아래와 같은 창이 뜹니다.

우리가 할 작업은 안드로이드에 Push를 추가하는 것 이므로, [Android 앱에 Firebase 추가] 이미지를 선택해 줍니다.

아래 이미지 참조

프로젝트 생성 창이 뜨면, Android 패키지 이름을 적으면 오른쪽 아래의 앱 등록 버튼이 활성화되는 데, 이 버튼을 눌러 다음 페이지로 넘어 갑니다. (나머지는 선택사항으로 테스트용으로만 사용할 경우 필요 없습니다.

 

아래 페이지는 구글 서비스 설정파일을 등록하는 것 인데, 아직 안드로이드 프로젝트를 만들지 않았다면, 필요할 때 언제든지 확인이 가능하므로, 오른쪽 아래의 [계속] 버튼을 눌러 다음으로 넘어 갑니다.

마지막으로 파이어 베이스 플러그인을 사용하기 위해, Gradle을 추가하는 설정을 방법을 알려 주는 페이지 입니다.
이 후에 확인이 가능 하므로, [완료] 버튼을 눌러 다음으로 넘어 가도록 합니다.

 

 

 

'Android > FCM 연동' 카테고리의 다른 글

안드로이드 FCM push Message (3/3)  (0) 2017.08.28
안드로이드 FCM push Message (2/3)  (0) 2017.08.27
Posted by 창업닉군
,