2016-08-03 2 views
2

Я хочу отправить push-уведомление с использованием Parse API и GCM. Я успешно выполнил настройку на сервере и протестировал, отправив push-оповещение формы Parse terminal и получив на устройстве android.Исключение из раскрывающегося списка Parse Push: «unauthorized: требуется мастер-ключ»

Но когда я отправляю push программно, то получил исключение: «несанкционированный: требуется мастер-ключ».

Я используя следующий код:

ParseQuery query = ParseInstallation.getQuery(); 
    query.whereEqualTo("channels", "testing"); 

    // Notification for Android users 
    query.whereEqualTo("deviceType", "android"); 
    ParsePush androidPush = new ParsePush(); 
    androidPush.setMessage("Your suitcase has been filled with tiny robots!"); 
    androidPush.setQuery(query); 
    androidPush.sendInBackground(new SendCallback() { 
     @Override 
     public void done(ParseException e) { 
      if (e == null) { 
       Log.d("GARG","Parse Notification Done. : "); 
      } else { 
       Log.d("GARG","Notification failed.: "+e.getMessage()); 
       e.printStackTrace(); 
      } 
     } 
    }); 

андроид manifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.demo"> 

<permission 
    android:name="com.demo.permission.MAPS_RECEIVE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="com.demo.permission.MAPS_RECEIVE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 


<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<permission 
    android:name="com.demo.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="com.demo.permission.C2D_MESSAGE" /> 

<application 
    android:name=".AppInitializer" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true"> 

<service android:name="com.parse.PushService" /> 
    <meta-data 
     android:name="com.parse.push.notification_icon" 
     android:resource="@drawable/ic_cast_light" /> 

    <meta-data android:name="com.parse.push.gcm_sender_id" 
     android:value="id:211671060483" /> 

    <meta-data 
     android:name="com.parse.APPLICATION_ID" 
     android:value="@string/parse_app_id" /> 
    <meta-data 
     android:name="com.parse.CLIENT_KEY" 
     android:value="@string/parse_client_key" /> 

    <meta-data 
     android:name="com.parse.X-Parse-Master-Key" 
     android:value="@string/parse_master_key" /> 

<receiver android:name="com.parse.ParsePushBroadcastReceiver" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.parse.push.intent.RECEIVE" /> 
      <action android:name="com.parse.push.intent.DELETE" /> 
      <action android:name="com.parse.push.intent.OPEN" /> 
     </intent-filter> 
    </receiver> 


    <receiver 
     android:name="com.parse.GcmBroadcastReceiver" 
     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="com.demo" /> 
     </intent-filter> 
    </receiver> 

</application> 

Initialize Анализировать SDK в андроида

public class AppInitializer extends Application { 

public static JSONObject errorDataProvider; 

@Override 
public void onCreate() { 

    super.onCreate(); 
    Parse.enableLocalDatastore(getApplicationContext()); 
    Parse.initialize(new Parse.Configuration.Builder(getApplicationContext()) 
      .applicationId(Utility.ApplicationId) 
      .clientKey(Utility.ClientKey) 
      .server(Utility.Server_URL) 
      .build() 
    ); 

    ParseInstallation.getCurrentInstallation().saveInBackground(); 

    ParsePush.subscribeInBackground(Utility.PARSE_CHANNEL, new SaveCallback() { 
     @Override 
     public void done(ParseException e) { 
      Log.e("GARG", "Successfully subscribed to Parse!"); 
     } 
    }); 
    } 
} 
+0

https://groups.google.com/forum/#!topic/back4app/AbWfQSRjsAU –

+1

Привет @IntelliJ Amiya я поставил мастер-ключ там, но перед тем же исключением –

+1

@IntelliJ Amiya у вас любая идея о любых применениях Master_Key в коде Android. означает, что нам нужно установить Master_key в приложении для Android, например Application_id и client_key –

ответ

6

Обновлено ОТВЕТА

Привет, я исследовать его немного и обнаружил, что в настоящее время только для отправки нажимного с помощью MasterKey и именно поэтому вы получаете эту ошибку

Для того, чтобы отправить толчок с отмычкой лучшей подходом будет создание функции облачного кода и запуск этой функции с клиентской стороны. так что вам нужно сделать следующее:

  1. Внутри вашего облако кода main.js файла создать новую функцию

Parse.Cloud.afterSave("SendPush", function(request) { 
 

 

 
    var query = new Parse.Query(Parse.Installation); 
 
    query.exists("deviceToken"); 
 

 
    // here you can add other conditions e.g. to send a push to sepcific users or channel etc. 
 

 
    var payload = { 
 
    alert: "YOUR_MESSAGE" 
 
     // you can add other stuff here... 
 
    }; 
 

 

 
    Parse.Push.send({ 
 
     data: payload, 
 
     where: query 
 
    }, { 
 
     useMasterKey: true 
 
    }) 
 
    .then(function() { 
 
     response.success("Push Sent!"); 
 
    }, function(error) { 
 
     response.error("Error while trying to send push " + error.message); 
 
    }); 
 
});

После создания функции облака коды перезагрузите сервер

  1. Trigger это облако код функции с вашего андроид приложение следующим образом:

    HashMap<String,String> map = new HashMap<String, String>(); 
    map.put("PARAM1KEY","PARAM1VALUE"); 
    // here you can send parameters to your cloud code functions 
    // such parameters can be the channel name, array of users to send a push to and more... 
    
    ParseCloud.callFunctionInBackground("SendPush",map, new FunctionCallback<Object>() { 
    
        @Override 
        public void done(Object object, ParseException e) { 
         // handle callback 
        } 
    }); 
    

Это вызовет вызов функции облака кода, который вы создали выше, и внутри кода облака на useMasterKey is true поэтому он должен работать.

обновление: написание

+0

Я уже настроил этот код –

+0

Как насчет главного ключа? Вы также указали главный ключ? –

+0

Да, у меня есть configure masterkey в index.js –

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

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