IT

Android 플랫폼에서 푸시 알림

itgroup 2023. 8. 21. 21:04
반응형

Android 플랫폼에서 푸시 알림

서버에서 푸시 알림을 받는 앱을 만들고 싶습니다.저는 이것을 할 수 있는 몇 가지 방법을 찾았습니다.

  1. SMS - 들어오는 SMS를 가로채고 서버에서 꺼내기 시작합니다.
  2. 정기적으로 서버 폴링

각각의 한계가 있습니다.SMS - 도착 시간에 대한 보증 없음.폴이 배터리를 방전시킬 수 있습니다.

더 좋은 제안이 있습니까?정말 고마워요.

Google의 공식 답변은 Android Cloud to Device Messaging Framework(사용되지 않음) Google Cloud Messaging(사용되지 않음) Firebase Cloud Messaging입니다.

Android >= 2.2(Play Store가 있는 전화기에서)에서 작동합니다.

(유사한 질문에 대한 답변에서 교차 게시 - Android는 거의 실시간으로 알림을 푸시합니까?)

저는 최근에 MQ로 게임을 시작했습니다.이러한 작업을 수행하는 방법으로 Android용 TT http://mqtt.org (SMS가 아닌 데이터 기반의 푸시 알림, 폴링이 아닌 거의 즉시 메시지 전달 등)

도움이 될 경우를 대비하여 이에 대한 배경 정보가 포함된 블로그 게시물이 있습니다.

http://dalelane.co.uk/blog/ ?p=938

(참고: MQTT는 IBM 기술이며, IBM에서 근무하고 있습니다.)

Android 푸시 알림에 대한 나의 이해/경험은 다음과 같습니다.

  1. C2DM GCM - 목표 안드로이드 플랫폼이 2.2+라면, 그렇게 하세요.단 한 번의 포착으로 장치 사용자는 항상 Google 계정으로 기록해야 메시지를 받을 수 있습니다.

  2. MQTT - Pub/Sub 기반 접근 방식으로, 장치에서 활성화된 연결이 필요하며, 현명하게 구현되지 않을 경우 배터리가 소모될 수 있습니다.

  3. 집사 - 지역사회 지원이 제한되어 장기적으로 좋지 않을 수 있습니다.

편집: 2013년 11월 25일 추가

GCM - Google에서 다음과 같이 말합니다.

3.0 이전 장치의 경우 사용자가 모바일 장치에 Google 계정을 설정해야 합니다.Android 4.0.4 이상을 실행하는 기기에서는 Google 계정이 필요하지 않습니다.*

Android 클라우드와 장치 간 메시징 프레임워크

중요: C2DM은 2012년 6월 26일부로 공식적으로 더 이상 사용되지 않습니다.이는 C2DM이 새 사용자 및 할당량 요청 수락을 중지했음을 의미합니다.C2DM에는 새로운 기능이 추가되지 않습니다.그러나 C2DM을 사용하는 앱은 계속 작동합니다.기존 C2DM 개발자는 Google Android 클라우드 메시징(GCM)이라고 하는 새로운 버전의 C2DM으로 마이그레이션할 것을 권장합니다.자세한 내용은 C2DM-to-GCM 마이그레이션 문서를 참조하십시오.개발자는 새로운 개발을 위해 GCM을 사용해야 합니다.

다음 링크를 확인하십시오.

http://developer.android.com/guide/google/gcm/index.html

여기에 기록을 얻는 방법에 대한 몇 가지 단계를 작성했습니다.처음부터 시작하는 ID 및 알림

  1. Google 클라우드에서 앱 만들기/등록
  2. 개발과 함께 Cloud SDK 설정
  3. GCM에 대한 프로젝트 구성
  4. 장치 등록 ID 가져오기
  5. 푸시 알림 전송
  6. 푸시 알림 수신

아래 URL 링크에서 전체 튜토리얼을 찾을 수 있습니다.

Android 푸시 알림 시작하기 : 최신 Google 클라우드 메시징(GCM) - 단계별 완료 튜토리얼

enter image description here

등록 ID(푸시 알림용 장치 토큰)를 가져오기 위한 코드 캡처.

GCM에 대한 프로젝트 구성


Android Manifest 파일 업데이트

프로젝트에서 GCM을 활성화하려면 매니페스트 파일에 몇 가지 권한을 추가해야 합니다. AndroidManifest.xml로 이동하고 아래 코드를 추가하십시오. 권한 추가

<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="android.permission.VIBRATE" />

<uses-permission android:name=“.permission.RECEIVE" />
<uses-permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE" />
<permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

GCM 브로드캐스트 수신기 선언 추가

응용 프로그램 태그에 GCM 브로드캐스트 수신기 선언 추가

<application
        <receiver
            android:name=".GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" ]]>
            <intent-filter]]>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="" />
            </intent-filter]]>

        </receiver]]>
     
<application/>

GCM 서비스 선언 추가

<application
     <service android:name=".GcmIntentService" />
<application/>

등록 ID(푸시 알림을 위한 장치 토큰) 가져오기

지금 시작/플래시 활동으로 이동

상수 및 클래스 변수 추가

private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
public static final String EXTRA_MESSAGE = "message";
public static final String PROPERTY_REG_ID = "registration_id";
private static final String PROPERTY_APP_VERSION = "appVersion";
private final static String TAG = "LaunchActivity";
protected String SENDER_ID = "Your_sender_id";
private GoogleCloudMessaging gcm =null;
private String regid = null;
private Context context= null;

새로 만들기 및 다시 시작할 때

@Override
protected void onCreate(Bundle savedInstanceState)
{
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_launch);
     context = getApplicationContext();
         if (checkPlayServices()) 
     {
            gcm = GoogleCloudMessaging.getInstance(this);
            regid = getRegistrationId(context);

            if (regid.isEmpty())
            {
                registerInBackground();
            }
            else
            {
            Log.d(TAG, "No valid Google Play Services APK found.");
            }
      }
 }

@Override protected void onResume()
{
       super.onResume();       checkPlayServices();
}


# Implement GCM Required methods (Add below methods in LaunchActivity)

private boolean checkPlayServices() {
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                        PLAY_SERVICES_RESOLUTION_REQUEST).show();
            } else {
                Log.d(TAG, "This device is not supported - Google Play Services.");
                finish();
            }
            return false;
        }
        return true;
 }

private String getRegistrationId(Context context) 
{
   final SharedPreferences prefs = getGCMPreferences(context);
   String registrationId = prefs.getString(PROPERTY_REG_ID, "");
   if (registrationId.isEmpty()) {
       Log.d(TAG, "Registration ID not found.");
       return "";
   }
   int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
   int currentVersion = getAppVersion(context);
   if (registeredVersion != currentVersion) {
        Log.d(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

private SharedPreferences getGCMPreferences(Context context) 
{
    return getSharedPreferences(LaunchActivity.class.getSimpleName(),
                Context.MODE_PRIVATE);
}

private static int getAppVersion(Context context) 
{
     try 
     {
         PackageInfo packageInfo = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
      } 
      catch (NameNotFoundException e) 
      {
            throw new RuntimeException("Could not get package name: " + e);
      }
}


private void registerInBackground() 
{     new AsyncTask() {
     Override
     protected Object doInBackground(Object... params) 
     {
          String msg = "";
          try 
          {
               if (gcm == null) 
               {
                        gcm = GoogleCloudMessaging.getInstance(context);
               }
               regid = gcm.register(SENDER_ID);               Log.d(TAG, "########################################");
               Log.d(TAG, "Current Device's Registration ID is: "+msg);     
          } 
          catch (IOException ex) 
          {
              msg = "Error :" + ex.getMessage();
          }
          return null;
     }     protected void onPostExecute(Object result) 
     { //to do here };
  }.execute(null, null, null);
}

참고: REGISTRATION_KEY를 저장하십시오. GCM에 PN 메시지를 보내는 것이 중요합니다. 또한 이 메시지는 모든 장치에서 고유한 것으로, GCM만 푸시 알림을 전송합니다.

푸시 알림 수신

GCM 브로드캐스트 수신기 클래스 추가

이미 매니페스트 파일에서 "GcmBroadcastReceiver.java"를 선언했으므로 이 클래스 업데이트 수신기 클래스 코드를 다음과 같이 생성합니다.

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) 
    {        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmIntentService.class.getName());        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
        Toast.makeText(context, “wow!! received new push notification", Toast.LENGTH_LONG).show();
    }
}

GCM 서비스 클래스 추가

이미 매니페스트 파일에서 "GcmBroadcastReceiver.java"를 선언했으므로 이 클래스 업데이트 수신기 클래스 코드를 다음과 같이 생성합니다.

public class GcmIntentService extends IntentService
{     public static final int NOTIFICATION_ID = 1;     private NotificationManager mNotificationManager;     private final static String TAG = "GcmIntentService";     public GcmIntentService() {
     super("GcmIntentService");     
     }     @Override
     protected void onHandleIntent(Intent intent) {
          Bundle extras = intent.getExtras();
          Log.d(TAG, "Notification Data Json :" + extras.getString("message"));

          GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
          String messageType = gcm.getMessageType(intent);          if (!extras.isEmpty()) {          if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR
               .equals(messageType)) {
               sendNotification("Send error: " + extras.toString());
          } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED
          .equals(messageType)) {
          sendNotification("Deleted messages on server: "
          + extras.toString());          // If it's a regular GCM message, do some work.
          } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE
          .equals(messageType)) {
          // This loop represents the service doing some work.
          for (int i = 0; i < 5; i++) {
               Log.d(TAG," Working... " + (i + 1) + "/5 @ "
               + SystemClock.elapsedRealtime());               try {
                    Thread.sleep(5000);
               } catch (InterruptedException e) {
               }
             }
             Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
             sendNotification(extras.getString("message"));
           }
        }        // Release the wake lock provided by the WakefulBroadcastReceiver.
        GcmBroadcastReceiver.completeWakefulIntent(intent);
     }     // Put the message into a notification and post it.
     // This is just one simple example of what you might choose to do with
     // a GCM message.
     private void sendNotification(String msg) {          mNotificationManager = (NotificationManager) this
          .getSystemService(Context.NOTIFICATION_SERVICE);
          PendingIntent contentIntent = PendingIntent.getActivity(this, 0,          new Intent(this, LaunchActivity.class), 0);

          NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(          this)
          .setSmallIcon(R.drawable.icon)
          .setContentTitle("Ocutag Snap")
          .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
          .setContentText(msg)
          .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);

          mBuilder.setContentIntent(contentIntent);          mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
     }
}

Meteor 웹 서버를 기반으로 Android에서 푸시 알림을 위한 Java 라이브러리를 개발하려는 새로운 오픈 소스 노력이 있습니다.디콘 프로젝트 블로그에서 확인할 수 있으며, Meteor와 프로젝트의 GitHub 저장소에 대한 링크를 찾을 수 있습니다.개발자가 필요하니 널리 알려주세요!

Xtify(http://developer.xtify.com )를 사용할 수 있습니다. 그들은 SDK와 함께 작동하는 푸시 알림 웹 서비스를 가지고 있습니다. 그것은 무료이며 지금까지 저에게 정말 잘 작동했습니다.

아니면..

서버에 대한 연결을 유지하고 몇 분마다 킵얼라이브를 전송하면 서버는 즉시 메시지를 푸시할 수 있습니다.이것이 지메일, 구글 토크 등의 작동 방식입니다.

안드로이드용 구글 클라우드 메시징 GCM을 사용하는 것을 추천합니다. 무료이며, 간단한 사용을 위해서는 매우 쉬울 것입니다.

그러나 사용자 대신 알림을 보내려면 타사 서버를 유지 관리해야 합니다.Android 푸시 알림 서비스를 위한 몇 가지 매우 우수한 산업용 솔루션을 사용하지 않으려면 다음을 수행합니다.

  • Urban Airship - 매월 최대 1M 알림 무료, 이후 1000 알림당 요금이 부과됩니다.
  • PushApp - 월 1M 알림 무료, 월 19.99 알림 무제한
  • PushWoosh - 100만 대 기기 무료, 프리미엄 요금제는 39유로부터입니다.

Diclaimer - 저는 PushApps에서 일하고 있으며 현재 1년 이상 애플리케이션에서 제품을 사용하고 있습니다.

2016년 5월 18일 기준 Firebase는 푸시 알림을 포함한 모바일 개발자를 위한 Google의 통합 플랫폼입니다.

유감스럽게도 당신은 두 가지 가능한 방법을 모두 찾았습니다.구글은 적어도 처음에는 푸시/풀 구현에 사용할 수 있는 GChat api를 구현할 예정이었습니다.안타깝게도, 그 라이브러리는 Android 1.0에 의해 잘렸습니다.

이것이 아직도 유용한지 모르겠습니다.저는 http://www.pushlets.com/ 의 Java 라이브러리를 통해 이와 같은 성과를 얻었습니다.

서비스에서 그것을 한다고 해서 안드로이드가 그것을 종료하는 것을 막을 수는 없지만 청취자 스레드를 죽입니다.

Google C2DM은 현재 감가상각되어 있으며, 이를 위해 새로운 서비스 GCM(Google Cloud Messaging)을 사용할 필요가 없습니다.설명서는 http://developer.android.com/guide/google/gcm/gs.html 를 참조하십시오.

C2DM: 앱 사용자는 gmail 계정을 가지고 있어야 합니다.

MQTT: 연결이 1024에 도달하면 Linux의 "선택 모델"을 사용했기 때문에 작동이 중지됩니다.

안드로이드용 무료 푸시 서비스와 api가 있으며, 사용해 볼 수 있습니다: http://push-notification.org

자유롭고 간편한 방법:

대상 사용자 기반이 크지 않고(1000명 미만) 무료 서비스를 시작하려면 Airbop이 가장 좋고 편리합니다.

에어밥 웹사이트 자사 API를 통해 구글 클라우드 메시징 서비스를 이용하고 있으며, 좋은 성능을 제공합니다.저는 그것을 두 개의 프로젝트에 사용했고 그것을 구현하는 것은 쉬웠습니다.

와 같은 서비스는 훌륭하지만 푸시 알림뿐만 아니라 전체 배포 스택을 제공합니다.

푸시 서비스만 목표로 한다면 에어밥은 잘 작동할 것입니다.

는 푸쉬를 사용해 본 적이 없지만, 또한 훌륭한 선택입니다.1,000,000대의 장치에 무료로 푸시할 수 있습니다.

저는 SMS와 HTTP를 모두 사용할 것을 제안합니다.사용자가 로그인하지 않은 경우 전화기에 SMS를 보내 메시지 대기 중임을 알립니다.

이것이 에릭슨 랩 서비스가 작동하는 방식입니다. https://labs.ericsson.com/apis/mobile-java-push/

사용자가 직접 이를 구현할 경우 수신 SMS를 사용자가 보지 않고 삭제하는 것이 문제입니다.아니면 그들이 당신의 경우를 봐도 괜찮을 수도 있습니다.

이것이 작동하는 것처럼 보입니다: BroadCastReceiver를 사용하여 SMS 삭제 - Android

예, 이렇게 코드를 쓰는 것은 위험할 수 있으며 프로그램이 하지 말아야 할 SMS를 삭제했기 때문에 다른 사람의 삶을 망칠 수 있습니다.

Google Cloud Messaging 또는 GCM을 사용할 수 있으며, 무료이며 사용하기 쉽습니다.또한 PushWoosh와 같은 타사 푸시 서버를 사용하여 유연성을 높일 수 있습니다.

Urban Airship, Xtify, Mainline같은 타사 서버는 Android뿐만 아니라 iOS, Windows Phone에서도 전송할 수 있습니다.

FCM(Firebase Cloud Messaging)은 GCM의 새로운 버전입니다. FCM은 메시지를 안전하고 무료로 보낼 수 있는 교차 플랫폼 메시징 솔루션입니다.GCM의 중앙 인프라를 계승하여 Android, iOS, Web(javascript), Unity 및 C++에서 안정적으로 메시지를 전달합니다.

2018년 4월 10일자로 구글은 GCM을 승인하지 않았습니다.GCM 서버 및 클라이언트 API는 더 이상 사용되지 않으며 2019년 4월 11일에 제거될 예정입니다.Google은 안정적이고 확장 가능한 GCM 인프라를 상속하는 FCM(Firebase Cloud Messaging)으로 GCM 애플리케이션을 마이그레이션할 것을 권장합니다.

자원

푸셔를 사용할 수 있습니다.

웹 및 모바일 애플리케이션에 실시간 데이터 및 기능을 매우 쉽게 추가할 수 있는 호스팅 서비스입니다.
Pusher는 모든 주요 런타임 및 프레임워크에 통합할 수 있는 라이브러리를 제공합니다.

PHP, Ruby, Python, Java, .NET, Go and Node서버에서
JavaScript, Objective-C (iOS) and Java (Android)의뢰인의

언급URL : https://stackoverflow.com/questions/1378671/push-notifications-in-android-platform

반응형