2

Я использую Parse.com с помощью приложения Ionic и PushPlugin и пытаюсь реализовать Push Push-уведомления Parse с помощью GCM с пользовательским идентификатором отправителя.Упорядочить push-уведомления не показаны в фоновом режиме на android

Когда я отправляю сообщение всем устройствам или используя REST API с cURL, Уведомления iOS запускаются нормально, когда приложение находится в фоновом режиме, но уведомления об андроидах не являются.

Вот что я пытался с API покоя Во-первых для IOS, которая работает хорошо:

curl -X POST \ 
    -H "X-Parse-Application-Id: APP-ID" \ 
    -H "X-Parse-REST-API-Key: API-KEY" \ 
    -H "Content-Type: application/json" \ 
    -d '{ 
     "where": { 
      "deviceType": "ios" 
     }, 
     "data": { 
      "alert": "Hello World!" 
     } 
     }' \ 
    https://api.parse.com/1/push 

Уведомление IOS принимается и отображается, даже если приложение закрыто или открыто в фоновом режиме.

Теперь, когда я пытаюсь тот же таргетинг для андроид устройств:

curl -X POST \ 
    -H "X-Parse-Application-Id: APP-ID" \ 
    -H "X-Parse-REST-API-Key: API-KEY" \ 
    -H "Content-Type: application/json" \ 
    -d '{ 
     "where": { 
      "deviceType": "android" 
     }, 
     "data": { 
      "alert": "Hello World!" 
     } 
     }' \ 
    https://api.parse.com/1/push 

Уведомление принимается устройством и частично вошли в adb logcat, но не отображается в панели уведомлений или иным образом подтверждены. Я попытался изменить 'alert' на 'message', но это не повлияло.

Однако, если я пытаюсь использовать GCM HTTP API с Почтальон или локон, все работает хорошо:

curl 'https://android.googleapis.com/gcm/send' \ 
    -H 'authorization: key=API-KEY' \ 
    -H 'content-type: application/json' \ 
    -d '{ 
     "registration_ids" : [ 
      "DEVICE-REGISTRATION-ID" 
     ], 
     "data" : { 
      "message": "You Go I Go, Buddy!" 
     } 
     }' 

При входе adb logcat бревна отличаются при использовании GCM API и Push Notifications API PARSE в:

с Parse:

I/GCM  (10319): GCM message co.yougoigo.mobile 0:1423318254669687%bd9ff524f9fd7ecd 
V/GCMBroadcastReceiver(11506): onReceive: com.google.android.c2dm.intent.RECEIVE 
V/GCMBroadcastReceiver(11506): GCM IntentService class: com.plugin.gcm.GCMIntentService 
V/GCMBaseIntentService(11506): Acquiring wakelock 
V/GCMBaseIntentService(11506): Intent service name: GCMIntentService-GCMIntentService-3 
D/GCMIntentService(11506): onMessage - context: [email protected] 

И с GCM Curl вызова:

I/GCM  (10319): GCM message co.yougoigo.mobile 0:1423318321652064%bd9ff524f9fd7ecd 
I/ActivityManager( 745): Start proc co.yougoigo.mobile for broadcast co.yougoigo.mobile/com.plugin.gcm.CordovaGCMBroadcastReceiver: pid=11788 uid=10187 gids={50187, 9997, 3003} abi=armeabi-v7a 
V/GCMBroadcastReceiver(11788): onReceive: com.google.android.c2dm.intent.RECEIVE 
V/GCMRegistrar(11788): Setting the name of retry receiver class to com.plugin.gcm.CordovaGCMBroadcastReceiver 
V/GCMBroadcastReceiver(11788): GCM IntentService class: com.plugin.gcm.GCMIntentService 
V/GCMBaseIntentService(11788): Acquiring wakelock 
V/GCMBaseIntentService(11788): Intent service name: GCMIntentService-GCMIntentService-1 
D/GCMIntentService(11788): onMessage - context: [email protected] 
E/GCMIntentService(11788): Number format exception - Error parsing Notification ID: Invalid int: "null" 
V/GCMBaseIntentService(11788): Releasing wakelock 

В настоящее время проявляется следующим образом:

<?xml version='1.0' encoding='utf-8'?> 
<manifest android:hardwareAccelerated="true" android:versionCode="4" android:versionName="0.0.4" package="co.yougoigo.mobile" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="CordovaApp" android:theme="@android:style/Theme.Black.NoTitleBar" android:windowSoftInputMode="adjustResize"> 
      <intent-filter android:label="@string/launcher_name"> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:exported="true" android:name="com.plugin.gcm.PushHandlerActivity" /> 
     <receiver android:name="com.plugin.gcm.CordovaGCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
       <category android:name="co.yougoigo.mobile" /> 
      </intent-filter> 
     </receiver> 
     <service android:name="com.plugin.gcm.GCMIntentService" /> 
     <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/fb_app_id" /> 
     <activity android:label="@string/fb_app_name" android:name="com.facebook.LoginActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 
    </application> 
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <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="com.google.android.c2dm.permission.RECEIVE" /> 
    <permission android:name="co.yougoigo.mobile.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
    <uses-permission android:name="co.yougoigo.mobile.permission.C2D_MESSAGE" /> 
</manifest> 

Кто-нибудь есть опыт в получении уведомлений GCM работать на PhoneGap приложений?

+0

Я имею точно такой же опыт. Любая удача в этом? Как вы настроили установку в синтаксическом анализе? –

+0

Причина, по которой уведомления не отображаются, заключается в том, что Parse отправляет уведомления о андроидах другому пользовательскому получателю. Вы должны включить Parse SDK, используя что-то вроде https://github.com/avivais/phonegap-parse-plugin, но для меня плагин ломается. То, что я закончил, - это отправлять уведомления об отключении Android прямо через GCM, а не Parse Push. – BarakChamo

+0

Это было мое подозрение. Я также пытался использовать один и тот же плагин-разборку, но каждый раз, когда он открывается, он разбивается. Я предполагаю, что это значит, что вы не разрабатываете для iOS. Я ищу хорошее гибридное решение. –

ответ

4

Для использования phonegap/cordova PushPlugin с Parse Push вам необходимо осознать, что Parse фактически обертывает его содержимое нестандартным способом. Это приводит к тому, что PushPlugin получает push-уведомление, когда приложение находится на переднем плане, но не тогда, когда оно находится в фоновом режиме.

Исходный фрагмент кода из GCMIntentService.java

@Override 
protected void onMessage(Context context, Intent intent) { 
    Log.d(TAG, "onMessage - context: " + context); 

    // Extract the payload from the message 
    Bundle extras = intent.getExtras(); 
    if (extras != null) 
    { 
     // if we are in the foreground, just surface the payload, else post it to the statusbar 
     if (PushPlugin.isInForeground()) { 
      extras.putBoolean("foreground", true); 
      PushPlugin.sendExtras(extras); 
     } 
     else { 
      extras.putBoolean("foreground", false); 

      // Send a notification if there is a message 
      if (extras.getString("message") != null && extras.getString("message").length() != 0) { 
       createNotification(context, extras); 
      } 
     } 
    } 
} 

Как вы можете видеть, когда проверка PushPlugin.isInForeground() терпит неудачу он проверяет свойство «сообщения» на статисты расслоение.

2 Наблюдения:

  1. Анализировать не включает в себя «сообщение» на уведомления так PushPlugin не вызывает createNotification(content, extras)
  2. Если вы посмотрите на свойства «полезной» пучка также заворачивает это на один уровень глубже, чем «традиционные» уведомления GCM, помещая уведомление объекту с ключевыми «данными».

Вот что расслоение выглядит в формате JSON

{ ... 
    "payload" : { 
    "data" : { 
     "message" : "your message here", 
     "title": "your title here", 
     ..., 
     "customData": { ... } 
    } 
} 

Вы, таким образом, должны сделать некоторые пользовательскую логику для извлечения полезной нагрузки из пакета extras.getString("payload"), а затем создать новый JSONObject (документация здесь: http://developer.android.com/reference/org/json/JSONObject.html).

Вместо проверки bundle.getString("message") вам необходимо проверить наличие наличия полезной нагрузки.данные, а затем разобрать сообщение и заголовок и убедиться, что они находятся в правильных местах для функции createNotification для работы путем переупаковки пакета (или создания твой собственный).

Моя рекомендация состоит в том, чтобы оставить существующий код как есть, но сделать отдельную проверку для отформатированного форматирования уведомления и вызвать пользовательскую функцию createNotification.

Как и в:

if (PushPlugin.isInForeground()) { 
    extras.putBoolean("foreground", true); 
    PushPlugin.sendExtras(extras); 
} else if (extras.getString("message") && extras.getString("message").length() != 0) { 
    extras.putBoolean("foreground", false); 
    createNotification(context, extras); 
} else { 
    JSONObject payload = extras.getString("payload"); 
    JSONObject data = payload.getJSONObject("data"); 
    String message = data.getString("alert") //parse puts the message as an alert if you don't use custom json payload 
    extras.putString("message", alert) 
    createNotification(context, extras) 
} 

Надеется, что это помогает. Честно говоря, я бы хотел, чтобы синтаксис просто отправил данные, как и все остальные, чтобы он был совместим с PushPlugin из коробки.

Исходный код для PushPlugin GCMIntentService.java здесь (официальный GitHub репо): https://github.com/phonegap-build/PushPlugin/blob/master/src/android/com/plugin/gcm/GCMIntentService.java

+0

Это фантастика @ james-gilchrist! У меня действительно мало опыта в разработке Android, и я не знал, с чего начать эту проблему. – BarakChamo

+0

Добро пожаловать. –

 Смежные вопросы

  • Нет связанных вопросов^_^