파이어 베이스는 아주 간단하게 주요 인증 (sns, email, 문자발송)등을 쉽게 구현합니다. 로그인을 적용하는 방법은 2가지가 있는데, 첫 번째는 삽입형으로, 웹소스에 FirebaseUI 인증에 접근할 수 있는 UI까지 완전 삽입하는 방법, 두번째는 사용할 로그인 타입의 UI를 직접 만들 수 있는 Firebase SDK 인증 방식이 있습니다.

 

[공식문서]

Firebase 인증소개 : https://firebase.google.com/docs/auth/?authuser=0 .
기본 UI로 로그인 : https://firebase.google.com/docs/auth/web/firebaseui?authuser=0 .

 

 

 

1. 프로젝트 생성.

먼저 파이어 베이스 프로젝트를 추가하겠습니다. 파이어 베이스 콘솔페이지에서, 새 프로젝트를 선택합니다.

 

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

 

콘솔화면에 들어와 웹추가 버튼을 눌러 줍니다.

 

그러면, 파이어 베이스 설정 코드를 붙여 넣어 파이어베이스 SDK를 초기화 할 수 있도록 해 줍니다. 사용할 웹페이지의 Head 태그 사이에 붙여 넣도록 합니다.

 

2. 파이어 베이스 인증 라이브러리 추가.

지금 부터 시작하는 내용은 공식문서의 [ 기본 UI로 로그인 ] 페이지의 내용을 보고 진행하였습니다. 함께 보며 따라하신다면 좋으실 것 같습니다.

위에서 html소스를 붙여 넣은 것은, 파이어 베이스 기본 라이브러리와 생성한 프로젝트의 설정 입니다. 인증을 사용하기 위해서는 인증 라이브러리를 추가해야 합니다. 공식문서에는 3가지 방법을 설명하고 있는 데, 저는 그중 CDN을 통해 추가하도록 하겠습니다. 아래 태그를 <head> 태그 속에 붙여 넣으면 됩니다.

<script src="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.js"></script>
<link type="text/css" rel="stylesheet" href="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.css" />

 

3. 로그인 방법 설정.

파이어 베이스는 현재 이메일/비밀번호 부터 익명의 로그인까지 10가지 (게임센터는 베타) 로그인 방법을 제공합니다. 처음에는 모두 비활성화 되어 있으므로, 사용할 방법을 파이어 베이스에서 설정해야 합니다.

일단 이메일/비밀번호를 사용해 로그인할 수 있도록 설정하겠습니다. 관리자 콘솔에서 Authentication을 선택하고, 로그인 방법 탭을 선택한 후 이메일/비밀번호를 선택합니다.

 

아래와 같이 [이메일/비밀번호]에 사용설정을 한 후 저장 버튼을 눌러 주도록 합니다. (상단 하나만 활성화 합니다.)

 

그 다음 파이어 베이스 인증 라이브러리를 추가합니다.

<script src="https://www.gstatic.com/firebasejs/6.1.1/firebase-auth.js"></script>

 

 

4. 로그인 창 호출.

너무 간단해 당황스럽지만, 이제 마지막 단원입니다. 아래와 같이 로그인 UI를 그려 주는 창을 호출 합니다.

var ui = new firebaseui.auth.AuthUI(firebase.auth());

ui.start('#firebaseui-auth-container', {
    signInFlow: 'popup',
    signInSuccessUrl: 'http://ntct24p006.cafe24.com/corner_v1/service/',
    signInOptions: [
        firebase.auth.EmailAuthProvider.PROVIDER_ID
    ]

    // Other config options...
});

 

그리고, 창이 그려질 위치를 지정해 줍니다.

<div id="firebaseui-auth-container"></div>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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 창업닉군
,