2016-05-31 2 views
0

Я использую удаленное уведомление на android с помощью xamarin.Невызовистый метод OnMessageReceived в xamarin

Я делаю ДОУ с использованием Walkthrough - Using Remote Notifications in Xamarin.Android

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

Есть ошибки в коде? или Могу ли я отслеживать свое уведомление, чтобы получить подробную информацию о том, почему он не пришел на мобильный?

MyGcmListenerService.cs

[Service(Exported = false), IntentFilter(new[] { "com.google.android.c2dm.intent.RECEIVE" })] 
public class MyGcmListenerService : GcmListenerService 
{ 
    public override void OnMessageReceived(string from, Bundle data) 
    { 
     var message = data.GetString("message"); 
     Log.Debug("MyGcmListenerService", "From: " + from); 
     Log.Debug("MyGcmListenerService", "Message: " + message); 
     SendNotification(message); 
    } 
.... 

AndroidManifest.xml код

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yourcompany.LeaveApplication" android:installLocation="auto" android:versionCode="1" android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="15" /> 

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="com.yourcompany.LeaveApplication.permission.C2D_MESSAGE" /> 
    <permission android:name="com.yourcompany.LeaveApplication.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
    <application android:label="XamarinLeaveApp" > 
     <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" 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.yourcompany.LeaveApplication" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

Message отправителе

var jGcmData = new JObject(); 
var jData = new JObject(); 

jData.Add("message", MESSAGE); 
jGcmData.Add("to", "/topics/global"); 
jGcmData.Add("data", jData); 

var url = new Uri("https://gcm-http.googleapis.com/gcm/send"); 
try 
{ 
    using (var client = new HttpClient()) 
    { 
     client.DefaultRequestHeaders.Accept.Add(
      new MediaTypeWithQualityHeaderValue("application/json")); 

     client.DefaultRequestHeaders.TryAddWithoutValidation(
      "Authorization", "key=" + API_KEY); 

     Task.WaitAll(client.PostAsync(url, 
      new StringContent(jGcmData.ToString(), Encoding.Default, "application/json")) 
       .ContinueWith(response => 
       { 
        var response1 = response; 
        // Console.WriteLine(response); 
        //Console.WriteLine("Message sent: check the client device notification tray."); 
       })); 
    } 
} 

RegistrationIntentService.cs

[Service(Exported = false)] 
class RegistrationIntentService : IntentService 
{ 
    static object locker = new object(); 

    public RegistrationIntentService() : base("RegistrationIntentService") { } 

    protected override void OnHandleIntent(Intent intent) 
    { 
     try 
     { 
      Log.Info("RegistrationIntentService", "Calling InstanceID.GetToken"); 
      lock (locker) 
      { 
       var instanceID = InstanceID.GetInstance(Application.Context); 

       var token = instanceID.GetToken(
        "<project number", GoogleCloudMessaging.InstanceIdScope, null); 

       Log.Info("RegistrationIntentService", "GCM Registration Token: " + token); 
       SendRegistrationToAppServer(token); 
       Subscribe(token); 
      } 
     } 
     catch (Exception e) 
     { 
      Log.Debug("RegistrationIntentService", "Failed to get a registration token"); 
      return; 
     } 
    } 

    void SendRegistrationToAppServer(string token) 
    { 
     // Add custom implementation here as needed. 
    } 

    void Subscribe(string token) 
    { 
     var pubSub = GcmPubSub.GetInstance(Application.Context); 
     pubSub.Subscribe(token, "/topics/global", null); 
    } 
} 
+0

Я заметил, что вы прокомментировали ответ в своем отправляемом коде. Получаете ли вы идентификатор сообщения в ответе, указывающем успешную отправку? –

+0

Просто Console.WriteLine так прокомментировал. Ответ BTW был успешным. –

ответ

2

в файле RegistrationIntentService.cs, вы используете Application.Context вместо this. Это должно быть эквивалентно, но можете ли вы попробовать?

Кроме того, я не вижу в вашем коде метода protected override void OnCreate, который регистрирует намерение RegistrationIntentService. Разве вы не вставляли его здесь или не забыли его реализовать?

HTH

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