자습서: Azure Notification Hubs 및 Google Cloud Messaging을 사용하여 Android 디바이스에 알림 푸시(더 이상 사용되지 않음)Tutorial: Push notifications to Android devices by using Azure Notification Hubs and Google Cloud Messaging (deprecated)

경고

2018년 4월 10일 기준으로 Google은 GCM(Google Cloud Messaging)을 더 이상 지원하지 않습니다.As of April 10, 2018, Google has deprecated Google Cloud Messaging (GCM). GCM 서버 및 클라이언트 API는 더 이상 사용되지 않으며 2019년 5월 29일에 제거될 예정입니다.The GCM server and client APIs are deprecated and will be removed as soon as May 29, 2019. 자세한 내용은 GCM 및 FCM 질문과 대답을 참조하세요.For more information, see GCM and FCM Frequently Asked Questions.

개요Overview

이 자습서에서는 Azure Notification Hubs를 사용하여 Android 애플리케이션에 푸시 알림을 보내는 방법을 보여 줍니다.This tutorial shows you how to use Azure Notification Hubs to send push notifications to an Android application. GCM(Google Cloud Messaging)을 사용하여 푸시 알림을 받는 빈 Android 앱을 만듭니다.You create a blank Android app that receives push notifications by using Google Cloud Messaging (GCM).

중요

GCM(Google Cloud Messaging)은 더 이상 사용되지 않으며 제거될 예정입니다.The Google Cloud Messaging (GCM) is deprecated and will be removed soon.

중요

이 항목에서는 GCM(Google Cloud Messaging)을 사용한 푸시 알림을 보여 줍니다.This topic demonstrates push notifications with Google Cloud Messaging (GCM). Google의 FCM(Firebase Cloud Messaging)을 사용하는 경우 Azure Notification Hubs 및 FCM을 사용하여 Android에 푸시 알림 보내기를 참조하세요.If you are using Google's Firebase Cloud Messaging (FCM), see Sending push notifications to Android with Azure Notification Hubs and FCM.

이 자습서에 대해 완료된 코드는 GitHub의 여기서 다운로드할 수 있습니다.The completed code for this tutorial can be downloaded from GitHub here.

이 자습서에서는 다음 작업을 수행합니다.In this tutorial, you do the following actions:

  • Google Cloud Messaging을 지원하는 프로젝트 만들기Create a project that supports Google Cloud Messaging.
  • 알림 허브 만들기Create a notification hub
  • 알림 허브에 앱 연결Connect your app to the notification hub
  • 앱 테스트Test the app

필수 조건Prerequisites

Google Cloud Messaging을 지원하는 프로젝트 만들기Creating a project that supports Google Cloud Messaging

  1. Google 클라우드 콘솔로 이동하고 Google 계정 자격 증명으로 로그인합니다.Navigate to the Google Cloud Console, sign in with your Google account credentials.

  2. 도구 모음에서 프로젝트 만들기를 선택합니다.Select Create Project on the toolbar.

    새 프로젝트 만들기

  3. 프로젝트 이름에 프로젝트 이름을 입력하고 만들기를 클릭합니다.For Project name, enter a name for your project, and click Create.

  4. 도구 모음에서 경고 단추를 선택하고 목록에서 프로젝트를 선택합니다.Select the alerts button on the toolbar, and select your project in the list. 프로젝트에 대한 대시보드가 표시됩니다.You see the dashboard for your project. 다음 URL을 사용하여 대시보드를 직접 탐색할 수도 있습니다. https://console.developers.google.com/home/dashboard?project=<YOUR PROJECT NAME>You can also navigate directly to the dashboard by using the URL: https://console.developers.google.com/home/dashboard?project=<YOUR PROJECT NAME>

    경고에서 프로젝트 선택

  5. 대시보드의 프로젝트 정보 타일에 프로젝트 번호를 기록해 둡니다.Note down the Project number in the Project info tile of the dashboard.

    프로젝트 ID

  6. 대시보드의 API 타일에서 API 개요로 이동을 선택합니다.In the dashboard, on the APIs tile, select Got to APIs overview.

    API 개요 링크

  7. API 페이지에서 API 및 서비스 사용을 선택합니다.On the API page, select ENABLE APIS AND SERVICES.

    [API 및 서비스 사용] 단추

  8. Google Cloud Messaging을 검색하여 선택합니다.Search for and select Google Cloud Messaging.

    Google Cloud Messaging 검색 및 선택

  9. 프로젝트에 대해 Google Cloud Messaging을 사용하려면 사용을 선택합니다.To enable Google Cloud Messaging for the project, select ENABLE.

    Google Cloud Messaging 사용

  10. 도구 모음에서 자격 증명 만들기를 선택합니다.Select Create credentials on the toolbar.

    [자격 증명 만들기] 단추

  11. 자격 증명을 프로젝트에 추가 페이지에서 API 키 링크를 선택합니다.On the Add credentials to your project page, select API key link.

    [자격 증명 만들기] 단추

  12. API 키 페이지에서 만들기/저장을 선택합니다.On API key page, select Create/Save. 다음 예제에서는 IP 주소 옵션을 선택하고 허용된 IP 주소로 0.0.0.0/0을 입력합니다.In the following example, the IP addresses option is selected, and 0.0.0.0/0 is entered for allowed IP addresses. API 키를 적절하게 제한해야 합니다.You should restrict your API key appropriately.

    API 키 - [만들기] 단추

  13. API 키를 클립보드에 복사하고 어딘가에 저장합니다.Copy the API key to the clipboard, and save it somewhere.

    API 키 복사

    이 API 키를 사용하여 Azure 에서 GCM에 인증하고 앱 대신 푸시 알림을 보낼 수 있게 합니다.You will use this API key value to enable Azure to authenticate with GCM and send push notifications on behalf of your app. 프로젝트 대시보드를 다시 탐색하려면 다음 URL을 사용합니다. https://console.developers.google.com/home/dashboard?project=<YOUR PROJECT NAME>To navigate back to the project dashboard, use the URL: https://console.developers.google.com/home/dashboard?project=<YOUR PROJECT NAME>

알림 허브 만들기Create a notification hub

  1. Azure Portal에 로그인합니다.Sign in to the Azure portal.

  2. 왼쪽 메뉴에서 모든 서비스를 선택하고, 모바일 섹션에서 Notification Hubs를 선택합니다.Select All services on the left menu, and then select Notification Hubs in the Mobile section. 서비스 이름 옆의 별표 아이콘을 선택하여 서비스를 왼쪽 메뉴의 즐겨찾기 섹션에 추가합니다.Select the star icon next to the service name to add the service to the FAVORITES section on the left menu. Notification Hubs즐겨찾기에 추가한 후 왼쪽 메뉴에서 선택합니다.After you add Notification Hubs to FAVORITES, select it on the left menu.

    Azure Portal - Notification Hubs 선택

  3. Notification Hubs 페이지의 도구 모음에서 추가를 선택합니다.On the Notification Hubs page, select Add on the toolbar.

    Notification Hubs - 추가 도구 모음 단추

  4. Notification Hub 페이지에서 다음 단계를 수행합니다.On the Notification Hub page, do the following steps:

    1. 알림 허브에 이름을 입력합니다.Enter a name in Notification Hub.

    2. 새 네임스페이스 만들기에 이름을 입력합니다.Enter a name in Create a new namespace. 네임스페이스에는 하나 이상의 허브가 포함되어 있습니다.A namespace contains one or more hubs.

    3. 위치 드롭다운 목록 상자에서 값을 선택합니다.Select a value from the Location drop-down list box. 이 값은 허브를 만들려는 위치를 지정합니다.This value specifies the location in which you want to create the hub.

    4. 리소스 그룹에서 기존 리소스 그룹을 선택하거나 새 리소스 그룹의 이름을 만듭니다.Select an existing resource group in Resource Group, or create a name for a new resource group.

    5. 만들기를 선택합니다.Select Create.

      Azure Portal - 알림 허브 속성 설정

  5. 알림(벨 아이콘)을 선택하고, 리소스로 이동을 선택합니다.Select Notifications (the bell icon), and then select Go to resource. Notification Hubs 페이지의 목록을 새로 고치고 허브를 선택할 수도 있습니다.You can also refresh the list on the Notification Hubs page and select your hub.

    [Azure Portal] - [알림] -> [리소스로 이동]

  6. 목록에서 액세스 정책을 선택합니다.Select Access Policies from the list. 사용할 수 있는 두 가지 연결 문자열을 적어 둡니다.Note that the two connection strings are available to you. 나중에 푸시 알림을 처리하는 데 필요합니다.You'll need them later to handle push notifications.

    중요

    애플리케이션에서 DefaultFullSharedAccessSignature 정책을 사용하지 마세요.Do not use the DefaultFullSharedAccessSignature policy in your application. 이는 백 엔드에서만 사용할 수 있습니다.This is meant to be used in your back end only.

    Azure Portal - 알림 허브 연결 문자열

알림 허브에 대한 GCM 설정 구성Configure GCM setting for the notification hub

  1. 알림 설정에서 Google(GCM) 을 선택합니다.Select Google (GCM) in NOTIFICATION SETTINGS.

  2. Google Cloud Console에서 얻은 API 키를 입력합니다.Enter API Key you got from the Google Cloud Console.

  3. 도구 모음에서 저장을 선택합니다.Select Save on the toolbar.

    Azure Notification Hubs - Google(GCM)

이제 알림 허브가 GCM과 작동하도록 구성되었으며, 푸시 알림을 받고 보내도록 앱을 등록하기 위한 연결 문자열이 있습니다.Your notification hub is now configured to work with GCM, and you have the connection strings to both register your app to receive and send push notifications.

알림 허브에 앱 연결Connect your app to the notification hub

새 Android 프로젝트 만들기Create a new Android project

  1. Android Studio에서 새 Android Studio 프로젝트를 시작합니다.In Android Studio, start a new Android Studio project.

    Android Studio - 새 프로젝트

  2. 휴대폰 및 태블릿 폼 팩터와 지원할 최소 SDK를 선택합니다.Choose the Phone and Tablet form factor and the Minimum SDK that you want to support. 그런 후 Next 를 클릭합니다.Then click Next.

    Android Studio - 프로젝트 만들기 워크플로

  3. 빈 활동을 기본 활동으로 선택하고 다음, 마침을 차례로 클릭합니다.Choose Empty Activity for the main activity, click Next, and then click Finish.

프로젝트에 Google Play Services 추가Add Google Play services to the project

  1. Android Studio의 메뉴에서 도구를 선택하고, SDK Manager를 선택합니다.In Android Studio, select Tools on the menu, and then select SDK Manager.

  2. 프로젝트에서 사용되는 Android SDK의 대상 버전을 선택합니다.Select the target version of the Android SDK that is used in your project. 그런 다음 패키지 세부 정보 표시를 선택합니다.Then select Show Package Details.

    Android SDK Manager - 대상 버전 선택

  3. Google API를 선택합니다(아직 설치되지 않은 경우).Select Google APIs, if it's not already installed.

    Android SDK Manager - Google API 선택

  4. SDK 도구 탭으로 전환합니다. Google Play 서비스를 아직 설치하지 않은 경우 다음 이미지처럼 Google Play 서비스를 선택합니다.Switch to the SDK Tools tab. If you haven't already installed Google Play Services, select Google Play Services as shown in the following image. 그런 다음 적용을 선택하여 설치합니다.Then select Apply to install. 이후 단계에서 사용할 수 있도록 SDK 경로를 기록해 둡니다.Note the SDK path, for use in a later step.

    Android SDK Manager - Google Play 서비스 선택

  5. 변경 확인 대화 상자가 나타나면 확인을 선택합니다.If you see the Confirm Change dialog box, select OK. 구성 요소 설치 관리자가 요청된 구성 요소를 설치합니다.The Component Installer installs the requested components. 구성 요소가 설치되면 완료를 선택합니다.Select Finish after the components are installed.

  6. 확인을 선택하여 새 프로젝트 설정 대화 상자를 닫습니다.Select OK to close the Settings for New Projects dialog box.

  7. app 디렉터리에서 build.gradle 파일을 연 다음 dependencies 아래에 다음 줄을 추가합니다.Open the build.gradle file in the app directory, and then add the following line under dependencies.

    implementation 'com.google.android.gms:play-services-gcm:16.0.0'
    
  8. 도구 모음에서 지금 동기화 아이콘을 선택합니다.Select Sync Now icon in the toolbar.

    Gradle과 동기화

  9. AndroidManifest.xml 파일을 연 다음 application 태그에 다음 태그를 추가합니다.Open the AndroidManifest.xml file, and then add the following tag to the application tag.

    <meta-data android:name="com.google.android.gms.version"
         android:value="@integer/google_play_services_version" />
    

Azure Notification Hubs 라이브러리 추가Adding Azure Notification Hubs libraries

  1. Build.Gradle 파일에서 종속성 섹션에 다음 줄을 추가합니다.In the Build.Gradle file for the app, add the following lines in the dependencies section.

    implementation 'com.microsoft.azure:notification-hubs-android-sdk:0.6@aar'
    implementation 'com.microsoft.azure:azure-notifications-handler:1.0.1@aar'
    
  2. 종속성 섹션 뒤에 다음 리포지토리를 추가합니다.Add the following repository after the dependencies section.

    repositories {
        maven {
            url "https://dl.bintray.com/microsoftazuremobile/SDK"
        }
    }
    

프로젝트의 AndroidManifest.xml 업데이트Updating the project's AndroidManifest.xml

  1. GCM을 지원하기 위해, 코드에 Google 인스턴스 ID API를 사용하여 등록 토큰 가져오기에 사용되는 인스턴스 ID 수신기 서비스를 구현합니다.To support GCM, implement an Instance ID listener service in the code that is used to obtain registration tokens using Google's Instance ID API. 이 자습서에서 클래스 이름은 MyInstanceIDService입니다.In this tutorial, the name of the class is MyInstanceIDService.

    AndroidManifest.xml 파일의 <application> 태그 내부에 다음 서비스 정의를 추가합니다.Add the following service definition to the AndroidManifest.xml file, inside the <application> tag. <your package> 자리 표시자를 AndroidManifest.xml 파일의 맨 위에 표시된 실제 패키지 이름으로 바꿉니다.Replace the <your package> placeholder with your actual package name shown at the top of the AndroidManifest.xml file.

    <service android:name="<your package>.MyInstanceIDService" android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.gms.iid.InstanceID"/>
        </intent-filter>
    </service>
    
  2. 애플리케이션이 인스턴스 ID API에서 GCM 등록 토큰을 수신하면 토큰을 사용하여 Azure Notification Hub에 등록합니다.Once the application receives the GCM registration token from the Instance ID API, it uses the token to register with the Azure Notification Hub. 등록은 RegistrationIntentService라는 IntentService를 사용하여 백그라운드에서 수행됩니다.The registration in the background is done using an IntentService named RegistrationIntentService. 이 서비스는 GCM 등록 토큰을 새로 고칩니다.This service is responsible for refreshing the GCM registration token.

    AndroidManifest.xml 파일의 <application> 태그 내부에 다음 서비스 정의를 추가합니다.Add the following service definition to the AndroidManifest.xml file, inside the <application> tag. <your package> 자리 표시자를 AndroidManifest.xml 파일의 맨 위에 표시된 실제 패키지 이름으로 바꿉니다.Replace the <your package> placeholder with your actual package name shown at the top of the AndroidManifest.xml file.

    <service
        android:name="<your package>.RegistrationIntentService"
        android:exported="false">
    </service>
    
  3. 알림을 수신할 수신기를 정의합니다.Define a receiver to receive notifications. 다음 수신기 정의를 <application> 태그 안의 AndroidManifest.xml 파일에 추가합니다.Add the following receiver definition to the AndroidManifest.xml file, inside the <application> tag. <your package> 자리 표시자를 AndroidManifest.xml 파일의 맨 위에 표시된 실제 패키지 이름으로 바꿉니다.Replace the <your package> placeholder with your actual package name shown at the top of the AndroidManifest.xml file.

    <receiver android:name="com.microsoft.windowsazure.notifications.NotificationsBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="<your package name>" />
        </intent-filter>
    </receiver>
    
  4. </application> 태그 아래에 다음 필수 GCM 권한을 추가합니다.Add the following necessary GCM permissions below the </application> tag. <your package>AndroidManifest.xml 파일 맨 위에 있는 패키지 이름으로 바꿉니다.Replace <your package> with the package name shown at the top of the AndroidManifest.xml file.

    이러한 권한에 대한 자세한 내용은 Android용 GCM 클라이언트 앱 설치를 참조하세요.For more information on these permissions, see Setup a GCM Client app for Android.

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    
    <permission android:name="<your package>.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="<your package>.permission.C2D_MESSAGE"/>
    

코드 추가Adding code

  1. 프로젝트 뷰에서 > src > 기본 > java를 확장합니다.In the Project View, expand app > src > main > java. java 아래의 패키지 폴더를 마우스 오른쪽 단추로 클릭하고 새로 만들기, Java 클래스를 차례로 클릭합니다.Right-click your package folder under java, click New, and then click Java Class. NotificationSettings(이)라는 새 클래스를 추가합니다.Add a new class named NotificationSettings.

    Android Studio - 새 Java 프로젝트

    NotificationSettings 클래스에 대한 다음 코드에서 세 개의 자리 표시자를 업데이트합니다.Update the three placeholders in the following code for the NotificationSettings class:

    • SenderId: 이전에 Google 클라우드 콘솔에서 얻은 프로젝트 번호입니다.SenderId: The project number you obtained earlier in the Google Cloud Console.

    • HubListenConnectionString: 허브에 대한 DefaultListenAccessSignature 연결 문자열입니다.HubListenConnectionString: The DefaultListenAccessSignature connection string for your hub. Azure Portal에 있는 허브의 설정 페이지에서 액세스 정책을 클릭하여 이 연결 문자열을 복사할 수 있습니다.You can copy that connection string by clicking Access Policies on the Settings page of your hub on the Azure portal.

    • HubName: Azure Portal의 허브 페이지에 표시되는 알림 허브 이름을 사용합니다.HubName: Use the name of your notification hub that appears in the hub page in the Azure portal.

      NotificationSettings 코드:NotificationSettings code:

      public class NotificationSettings {
         public static String SenderId = "<Your project number>";
         public static String HubName = "<Your HubName>";
         public static String HubListenConnectionString = "<Your default listen connection string>";
      }
      
  2. MyInstanceIDService라는 또 다른 새 클래스를 추가합니다.Add another new class named MyInstanceIDService. 이 클래스는 인스턴스 ID 수신기 서비스 구현입니다.This class is the Instance ID listener service implementation.

    이 클래스에 대한 코드는 IntentService를 호출하여 백그라운드에서 FCM 토큰을 새로 고칩니다.The code for this class calls IntentService to refresh the GCM token in the background.

    import android.content.Intent;
    import android.util.Log;
    import com.google.android.gms.iid.InstanceIDListenerService;
    
    public class MyInstanceIDService extends InstanceIDListenerService {
    
        private static final String TAG = "MyInstanceIDService";
    
        @Override
        public void onTokenRefresh() {
    
            Log.i(TAG, "Refreshing GCM Registration Token");
    
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);
        }
    };
    
  3. RegistrationIntentService라는 프로젝트에 또 다른 새 클래스를 추가합니다.Add another new class to your project named, RegistrationIntentService. 이 클래스는 FCM 토큰 새로 고침알림 허브 등록을 처리하는 IntentService를 구현합니다.This class implements IntentService that handles refreshing the GCM token and registering with the notification hub.

    이 클래스에 대해 다음 코드를 사용합니다.Use the following code for this class.

    import android.app.IntentService;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.preference.PreferenceManager;
    import android.util.Log;
    
    import com.google.android.gms.gcm.GoogleCloudMessaging;
    import com.google.android.gms.iid.InstanceID;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    
    public class RegistrationIntentService extends IntentService {
    
        private static final String TAG = "RegIntentService";
    
        private NotificationHub hub;
    
        public RegistrationIntentService() {
            super(TAG);
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            String resultString = null;
            String regID = null;
    
            try {
                InstanceID instanceID = InstanceID.getInstance(this);
                String token = instanceID.getToken(NotificationSettings.SenderId,
                        GoogleCloudMessaging.INSTANCE_ID_SCOPE);
                Log.i(TAG, "Got GCM Registration Token: " + token);
    
                // Storing the registration id that indicates whether the generated token has been
                // sent to your server. If it is not stored, send the token to your server,
                // otherwise your server should have already received the token.
                if ((regID=sharedPreferences.getString("registrationID", null)) == null) {
                    NotificationHub hub = new NotificationHub(NotificationSettings.HubName,
                            NotificationSettings.HubListenConnectionString, this);
                    Log.i(TAG, "Attempting to register with NH using token : " + token);
    
                    regID = hub.register(token).getRegistrationId();
    
                    // If you want to use tags...
                    // Refer to : https://azure.microsoft.com/documentation/articles/notification-hubs-routing-tag-expressions/
                    // regID = hub.register(token, "tag1", "tag2").getRegistrationId();
    
                    resultString = "Registered Successfully - RegId : " + regID;
                    Log.i(TAG, resultString);
                    sharedPreferences.edit().putString("registrationID", regID ).apply();
                } else {
                    resultString = "Previously Registered Successfully - RegId : " + regID;
                }
            } catch (Exception e) {
                Log.e(TAG, resultString="Failed to complete token refresh", e);
                // If an exception happens while fetching the new token or updating the registration data
                // on a third-party server, this ensures that we'll attempt the update at a later time.
            }
    
            // Notify UI that registration has completed.
            if (MainActivity.isVisible) {
                MainActivity.mainActivity.ToastNotify(resultString);
            }
        }
    }
    
  4. MainActivity 클래스에서 클래스 시작 부분에 다음 import 문을 추가합니다.In your MainActivity class, add the following import statements at the beginning of the class.

    import com.google.android.gms.common.ConnectionResult;
    import com.google.android.gms.common.GoogleApiAvailability;
    import com.google.android.gms.gcm.*;
    import com.microsoft.windowsazure.notifications.NotificationsManager;
    import android.util.Log;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.content.Intent;
    
  5. 클래스의 맨 위에 다음과 같은 프라이빗 멤버를 추가합니다.Add the following private members at the top of the class. 이 코드는 Google 권장 사항에 따라 Google Play Services의 가용성을 확인합니다.This code checks the availability of Google Play Services as recommended by Google.

    public static MainActivity mainActivity;
    public static Boolean isVisible = false;
    private GoogleCloudMessaging gcm;
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    private static final String TAG = "MainActivity";
    
  6. MainActivity 클래스에서 Google Play Services 가용성에 다음 메서드를 추가합니다.In your MainActivity class, add the following method to the availability of Google Play Services.

    /**
        * Check the device to make sure it has the Google Play Services APK. If
        * it doesn't, display a dialog that allows users to download the APK from
        * the Google Play Store or enable it in the device's system settings.
        */
    private boolean checkPlayServices() {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                        .show();
            } else {
                Log.i(TAG, "This device is not supported by Google Play Services.");
                ToastNotify("This device is not supported by Google Play Services.");
                finish();
            }
            return false;
        }
        return true;
    }
    
  7. MainActivity 클래스에서 IntentService를 호출하기 전에 Google Play 서비스를 확인하는 다음 코드를 추가하여 FCM 등록 토큰을 가져오고 알림 허브에 등록합니다.In your MainActivity class, add the following code that checks for Google Play Services before calling your IntentService to get your GCM registration token and register with your notification hub.

    public void registerWithNotificationHubs()
    {
        Log.i(TAG, " Registering with Notification Hubs");
    
        if (checkPlayServices()) {
            // Start IntentService to register this application with GCM.
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);
        }
    }
    
  8. MainActivity 클래스의 OnCreate 메서드에서 활동이 생성되면 등록 프로세스를 시작하는 다음 코드를 추가합니다.In the OnCreate method of the MainActivity class, add the following code to start the registration process when activity is created.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mainActivity = this;
        NotificationsManager.handleNotifications(this, NotificationSettings.SenderId, MyHandler.class);
        registerWithNotificationHubs();
    }
    
  9. MainActivity 에 이러한 추가 메서드를 추가하여 앱 상태를 확인하고 앱에서 상태를 보고합니다.Add these additional methods to the MainActivity to verify app state and report status in your app.

    @Override
    protected void onStart() {
        super.onStart();
        isVisible = true;
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        isVisible = false;
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        isVisible = true;
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        isVisible = false;
    }
    
    public void ToastNotify(final String notificationMessage) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, notificationMessage, Toast.LENGTH_LONG).show();
                TextView helloText = (TextView) findViewById(R.id.text_hello);
                helloText.setText(notificationMessage);
            }
        });
    }
    
  10. ToastNotify 메서드는 "Hello World" TextView 컨트롤을 사용하여 앱에서 영구적으로 상태 및 알림을 보고합니다.The ToastNotify method uses the "Hello World" TextView control to report status and notifications persistently in the app. activity_main.xml 레이아웃에서 해당 컨트롤에 대한 다음 ID를 추가합니다.In your activity_main.xml layout, add the following ID for that control.

    android:id="@+id/text_hello"
    
  11. AndroidManifest.xml에서 정의한 수신기에 대한 하위 클래스를 추가합니다.Add a subclass for the receiver that's defined in the AndroidManifest.xml. MyHandler라는 프로젝트에 또 다른 새 클래스를 추가합니다.Add another new class to your project named MyHandler.

  12. 그런 다음 MyHandler.java의 맨 위에 다음 import 문을 추가합니다.Add the following import statements at the top of MyHandler.java:

    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.NotificationCompat;
    import com.microsoft.windowsazure.notifications.NotificationsHandler;
    import android.net.Uri;
    import android.media.RingtoneManager;
    
  13. MyHandler 클래스에 대해 다음 코드를 추가하여 com.microsoft.windowsazure.notifications.NotificationsHandler의 하위 클래스로 만듭니다.Add the following code for the MyHandler class making it a subclass of com.microsoft.windowsazure.notifications.NotificationsHandler.

    이 코드는 OnReceive 메서드를 재정의하여 처리기에서 받은 알림을 보고합니다.This code overrides the OnReceive method, so the handler reports notifications that are received. 또한 처리기는 sendNotification() 메서드를 사용하여 Android 알림 관리자에 푸시 알림을 보냅니다.The handler also sends the push notification to the Android notification manager by using the sendNotification() method. sendNotification() 메서드는 앱이 실행되지 않을 때, 알림이 수신될 때 실행해야 합니다.The sendNotification() method should be executed when the app is not running and a notification is received.

    public class MyHandler extends NotificationsHandler {
        public static final int NOTIFICATION_ID = 1;
        private NotificationManager mNotificationManager;
        NotificationCompat.Builder builder;
        Context ctx;
    
        @Override
        public void onReceive(Context context, Bundle bundle) {
            ctx = context;
            String nhMessage = bundle.getString("message");
            sendNotification(nhMessage);
            if (MainActivity.isVisible) {
                MainActivity.mainActivity.ToastNotify(nhMessage);
            }
        }
    
        private void sendNotification(String msg) {
    
            Intent intent = new Intent(ctx, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
            mNotificationManager = (NotificationManager)
                    ctx.getSystemService(Context.NOTIFICATION_SERVICE);
    
            PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0,
                    intent, PendingIntent.FLAG_ONE_SHOT);
    
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(ctx)
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setContentTitle("Notification Hub Demo")
                            .setStyle(new NotificationCompat.BigTextStyle()
                                    .bigText(msg))
                            .setSound(defaultSoundUri)
                            .setContentText(msg);
    
            mBuilder.setContentIntent(contentIntent);
            mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
        }
    }
    
  14. Android Studio의 메뉴 모음에서 빌드 > 프로젝트 다시 빌드를 클릭하여 코드에 오류가 없는지 확인합니다.In Android Studio on the menu bar, click Build > Rebuild Project to make sure that no errors are present in your code.

앱 테스트Testing your app

모바일 애플리케이션 실행Run the mobile application

  1. 앱을 실행하고 등록에 성공한 경우 등록 ID가 보고되는지 확인합니다.Run the app and notice that the registration ID is reported for a successful registration.

    Android에서 테스트 - 채널 등록

  2. 허브에 등록된 모든 Android 디바이스로 보낼 알림 메시지를 입력합니다.Enter a notification message to be sent to all Android devices that have registered with the hub.

    Android에서 테스트 - 메시지 보내기

  3. 알림 보내기를 누릅니다.Press Send Notification. 앱을 실행 중인 모든 디바이스에는 푸시 알림 메시지가 있는 AlertDialog 인스턴스가 표시됩니다.Any devices that have the app running shows an AlertDialog instance with the push notification message. 앱이 실행되지는 않지만 이전에 푸시 알림이 등록된 디바이스는 Android 알림 관리자에서 알림을 받습니다.Devices that don't have the app running but were previously registered for push notifications receive a notification in the Android Notification Manager. 왼쪽 위 모서리에서 아래로 살짝 밀어 알림 메시지를 볼 수 있습니다.The notification messages can be viewed by swiping down from the upper-left corner.

    Android에서 테스트 - 알림

Azure Portal에서 푸시 알림 보내기 테스트Test send push notifications from the Azure portal

Azure Portal을 통해 푸시 알림을 전송하여 앱에서 푸시 알림 받기를 테스트할 수 있습니다.You can test receiving push notifications in your app by sending them via the Azure portal.

  1. 문제 해결 섹션에서 테스트 보내기를 선택합니다.In the Troubleshooting section, select Test Send.

  2. 플랫폼에 대해 Android를 선택합니다.For Platforms, select Android.

  3. 보내기를 선택하여 테스트 알림을 보냅니다.Select Send to send the test notification.

  4. Android 디바이스에서 알림 메시지가 표시되는지 확인합니다.Confirm that you see the notification message on the Android device.

    Azure Notification Hubs - 전송 테스트

푸시 알림은 일반적으로 호환 라이브러리를 사용하는 Mobile Apps 또는 ASP.NET과 같은 백 엔드 서비스에서 전송됩니다.Push notifications are normally sent in a back-end service like Mobile Apps or ASP.NET using a compatible library. 백 엔드에서 라이브러리를 사용할 수 없는 경우 REST API를 직접 사용하여 알림 메시지를 보낼 수도 있습니다.If a library isn't available for your back end, you can also use the REST API directly to send notification messages.

알림을 보내기 위해 검토할 수 있는 다른 자습서 목록은 다음과 같습니다.Here is a list of some other tutorials you might want to review for sending notifications:

에뮬레이터의 푸시 알림Push notifications in the emulator

에뮬레이터 내부에서 푸시 알림을 테스트하려는 경우 에뮬레이터 이미지가 앱에 대해 선택한 Google API 수준을 지원하는지 확인합니다.If you want to test push notifications inside an emulator, make sure that your emulator image supports the Google API level that you chose for your app. 이미지에서 네이티브 Google API를 지원하지 않으면 SERVICE_NOT_AVAILABLE 예외가 발생합니다.If your image doesn't support native Google APIs, you end up with the SERVICE_NOT_AVAILABLE exception.

또한 설정 > 계정에서 실행 중인 에뮬레이터에 Google 계정을 추가했는지 확인합니다.In addition, ensure that you have added your Google account to your running emulator under Settings > Accounts. 그렇지 않으면 GCM 등록 시 AUTHENTICATION_FAILED 예외가 발생할 수 있습니다.Otherwise, your attempts to register with GCM may result in the AUTHENTICATION_FAILED exception.

(선택 사항) 앱에서 바로 푸시 알림 보내기(Optional) Send push notifications directly from the app

일반적으로, 백 엔드 서버를 사용하여 알림을 보냅니다.Normally, you would send notifications using a backend server. 경우에 따라, 클라이언트 애플리케이션에서 직접 푸시 알림을 보낼 수 있기를 원하기도 합니다.For some cases, you might want to be able to send push notifications directly from the client application. 이 섹션은 Azure 알림 허브 REST API를 사용하여 클라이언트에서 알림을 보내는 방법을 설명합니다.This section explains how to send notifications from the client using the Azure Notification Hub REST API.

  1. Android Studio 프로젝트 뷰에서 > src > 기본 > 자원 > 레이아웃을 확장합니다.In Android Studio Project View, expand App > src > main > res > layout. activity_main.xml 레이아웃 파일을 열고 텍스트 탭을 클릭하여 파일의 텍스트 내용을 업데이트합니다.Open the activity_main.xml layout file and click the Text tab to update the text contents of the file. 아래 코드로 업데이트하여 알림 허브에 푸시 알림 메시지를 보내는 새 ButtonEditText 컨트롤을 추가합니다.Update it with the code below, which adds new Button and EditText controls for sending push notification messages to the notification hub. 이 코드를 맨 아래의 </RelativeLayout>바로 앞에 추가합니다.Add this code at the bottom, just before </RelativeLayout>.

    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/send_button"
    android:id="@+id/sendbutton"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:onClick="sendNotificationButtonOnClick" />
    
    <EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/editTextNotificationMessage"
    android:layout_above="@+id/sendbutton"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="42dp"
    android:hint="@string/notification_message_hint" />
    
  2. Android Studio 프로젝트 뷰에서 > src > 기본 > 자원 > 을 확장합니다.In Android Studio Project View, expand App > src > main > res > values. strings.xml 파일을 열고 새 ButtonEditText 컨트롤에서 참조하는 문자열 값을 추가합니다.Open the strings.xml file and add the string values that are referenced by the new Button and EditText controls. 파일 맨 아래에서 </resources> 바로 앞에 다음 줄을 추가합니다.Add the following lines at the bottom of the file, just before </resources>.

    <string name="send_button">Send Notification</string>
    <string name="notification_message_hint">Enter notification message text</string>
    
  3. NotificationSetting.java 파일에서 NotificationSettings 클래스에 다음 설정을 추가합니다.In your NotificationSetting.java file, add the following setting to the NotificationSettings class.

    허브에 DefaultFullSharedAccessSignature 연결 문자열을 사용하여 HubFullAccess을 업데이트합니다.Update HubFullAccess with the DefaultFullSharedAccessSignature connection string for your hub. 알림 허브에 대한 설정 페이지에서 액세스 정책을 클릭하여 Azure Portal에서 이 연결 문자열을 복사할 수 있습니다.This connection string can be copied from the Azure portal by clicking Access Policies on the Settings page for your notification hub.

    public static String HubFullAccess = "<Enter Your DefaultFullSharedAccess Connection string>";
    
  4. MainActivity.java 파일에서 시작 부분에 다음 import 문을 추가합니다.In your MainActivity.java file, add the following import statements at the beginning of the file.

    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import android.util.Base64;
    import android.view.View;
    import android.widget.EditText;
    
  5. MainActivity.java 파일에서 다음 멤버를 MainActivity 클래스 위에 추가합니다.In your MainActivity.java file, add the following members at the top of the MainActivity class.

    private String HubEndpoint = null;
    private String HubSasKeyName = null;
    private String HubSasKeyValue = null;
    
  6. 알림 허브로 메시지를 보낼 POST 요청을 인증하기 위해 SaS(Software Access Signature) 토큰을 만듭니다.Create a Software Access Signature (SaS) token to authenticate a POST request to send messages to your notification hub. 연결 문자열에서 키 데이터를 구문 분석한 다음, 일반적인 개념 REST API 참조에 설명된 대로 SaS 토큰을 만듭니다.Parse the key data from the connection string and then creating the SaS token, as mentioned in the Common Concepts REST API reference. 다음 코드는 구현 예제입니다.The following code is an example implementation.

    MainActivity.java에서 MainActivity 클래스에 다음 메서드를 추가하여 연결 문자열의 구문을 분석합니다.In MainActivity.java, add the following method to the MainActivity class to parse your connection string.

    /**
        * Example code from https://msdn.microsoft.com/library/azure/dn495627.aspx
        * to parse the connection string so a SaS authentication token can be
        * constructed.
        *
        * @param connectionString This must be the DefaultFullSharedAccess connection
        *                         string for this example.
        */
    private void ParseConnectionString(String connectionString)
    {
        String[] parts = connectionString.split(";");
        if (parts.length != 3)
            throw new RuntimeException("Error parsing connection string: "
                    + connectionString);
    
        for (int i = 0; i < parts.length; i++) {
            if (parts[i].startsWith("Endpoint")) {
                this.HubEndpoint = "https" + parts[i].substring(11);
            } else if (parts[i].startsWith("SharedAccessKeyName")) {
                this.HubSasKeyName = parts[i].substring(20);
            } else if (parts[i].startsWith("SharedAccessKey")) {
                this.HubSasKeyValue = parts[i].substring(16);
            }
        }
    }
    
  7. MainActivity.java에서 MainActivity 클래스에 다음 메서드를 추가하여 SaS 인증 토큰을 만듭니다.In MainActivity.java, add the following method to the MainActivity class to create a SaS authentication token.

    /**
        * Example code from https://msdn.microsoft.com/library/azure/dn495627.aspx to
        * construct a SaS token from the access key to authenticate a request.
        *
        * @param uri The unencoded resource URI string for this operation. The resource
        *            URI is the full URI of the Service Bus resource to which access is
        *            claimed. For example,
        *            "http://<namespace>.servicebus.windows.net/<hubName>"
        */
    private String generateSasToken(String uri) {
    
        String targetUri;
        String token = null;
        try {
            targetUri = URLEncoder
                    .encode(uri.toString().toLowerCase(), "UTF-8")
                    .toLowerCase();
    
            long expiresOnDate = System.currentTimeMillis();
            int expiresInMins = 60; // 1 hour
            expiresOnDate += expiresInMins * 60 * 1000;
            long expires = expiresOnDate / 1000;
            String toSign = targetUri + "\n" + expires;
    
            // Get an hmac_sha1 key from the raw key bytes
            byte[] keyBytes = HubSasKeyValue.getBytes("UTF-8");
            SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA256");
    
            // Get an hmac_sha1 Mac instance and initialize with the signing key
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(signingKey);
    
            // Compute the hmac on input data bytes
            byte[] rawHmac = mac.doFinal(toSign.getBytes("UTF-8"));
    
            // Using android.util.Base64 for Android Studio instead of
            // Apache commons codec
            String signature = URLEncoder.encode(
                    Base64.encodeToString(rawHmac, Base64.NO_WRAP).toString(), "UTF-8");
    
            // Construct authorization string
            token = "SharedAccessSignature sr=" + targetUri + "&sig="
                    + signature + "&se=" + expires + "&skn=" + HubSasKeyName;
        } catch (Exception e) {
            if (isVisible) {
                ToastNotify("Exception Generating SaS : " + e.getMessage().toString());
            }
        }
    
        return token;
    }
    
  8. MainActivity.java에서 MainActivity 클래스에 다음 메서드를 추가하여 알림 보내기 단추 클릭을 처리하고 내장된 REST API를 사용하여 허브에 푸시 알림 메시지를 보냅니다.In MainActivity.java, add the following method to the MainActivity class to handle the Send Notification button click and send the push notification message to the hub by using the built-in REST API.

    /**
        * Send Notification button click handler. This method parses the
        * DefaultFullSharedAccess connection string and generates a SaS token. The
        * token is added to the Authorization header on the POST request to the
        * notification hub. The text in the editTextNotificationMessage control
        * is added as the JSON body for the request to add a GCM message to the hub.
        *
        * @param v
        */
    public void sendNotificationButtonOnClick(View v) {
        EditText notificationText = (EditText) findViewById(R.id.editTextNotificationMessage);
        final String json = "{\"data\":{\"message\":\"" + notificationText.getText().toString() + "\"}}";
    
        new Thread()
        {
            public void run()
            {
                try
                {
                    // Based on reference documentation...
                    // https://msdn.microsoft.com/library/azure/dn223273.aspx
                    ParseConnectionString(NotificationSettings.HubFullAccess);
                    URL url = new URL(HubEndpoint + NotificationSettings.HubName +
                            "/messages/?api-version=2015-01");
    
                    HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
    
                    try {
                        // POST request
                        urlConnection.setDoOutput(true);
    
                        // Authenticate the POST request with the SaS token
                        urlConnection.setRequestProperty("Authorization",
                            generateSasToken(url.toString()));
    
                        // Notification format should be GCM
                        urlConnection.setRequestProperty("ServiceBusNotification-Format", "gcm");
    
                        // Include any tags
                        // Example below targets 3 specific tags
                        // Refer to : https://azure.microsoft.com/documentation/articles/notification-hubs-routing-tag-expressions/
                        // urlConnection.setRequestProperty("ServiceBusNotification-Tags",
                        //        "tag1 || tag2 || tag3");
    
                        // Send notification message
                        urlConnection.setFixedLengthStreamingMode(json.length());
                        OutputStream bodyStream = new BufferedOutputStream(urlConnection.getOutputStream());
                        bodyStream.write(json.getBytes());
                        bodyStream.close();
    
                        // Get response
                        urlConnection.connect();
                        int responseCode = urlConnection.getResponseCode();
                        if ((responseCode != 200) && (responseCode != 201)) {
                            BufferedReader br = new BufferedReader(new InputStreamReader((urlConnection.getErrorStream())));
                            String line;
                            StringBuilder builder = new StringBuilder("Send Notification returned " +
                                    responseCode + " : ")  ;
                            while ((line = br.readLine()) != null) {
                                builder.append(line);
                            }
    
                            ToastNotify(builder.toString());
                        }
                    } finally {
                        urlConnection.disconnect();
                    }
                }
                catch(Exception e)
                {
                    if (isVisible) {
                        ToastNotify("Exception Sending Notification : " + e.getMessage().toString());
                    }
                }
            }
        }.start();
    }
    

다음 단계Next steps

이 자습서에서는 백 엔드에 등록된 모든 Android 디바이스로 브로드캐스트 알림을 보냈습니다.In this tutorial, you sent broadcast notifications to all your Android devices registered with the backend. 특정 Android 디바이스로 알림을 푸시하는 방법을 알아보려면 다음 자습서를 계속 진행합니다.To learn how to push notifications to specific Android devices, advance to the following tutorial: