2016-05-31 6 views
0

Ich bin Remote-Benachrichtigung auf Android mit Xamarin implementieren.Nicht aufrufende Methode OnMessageReceived in Xamarin

ich POC tue Walkthrough - Using Remote Notifications in Xamarin.Android

mit Ich erhalte keine Benachrichtigung über Handy bekommen, nach mobilen Erfassung und Meldung durch Absender mit GCM senden.

Gibt es einen Fehler im Code? oder Kann ich meine Benachrichtigung verfolgen, um zu erfahren, warum sie nicht in das Mobilgerät aufgenommen wurde?

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> 

Nachricht des Absenders Code

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

Ich bemerkte, dass Sie die Antwort in Ihrem sendenden Code auskommentiert haben. Erhalten Sie in der Antwort eine Nachrichten-ID, die auf einen erfolgreichen Sendevorgang hinweist? –

+0

Es ist nur Console.WriteLine so auskommentiert. BTW Antwort war Erfolg .. –

Antwort

2

in der RegistrationIntentService.cs Datei, verwenden Sie Application.Context statt this. Es sollte gleichwertig sein, aber kannst du es versuchen?

Auch sehe ich in Ihrem Code die protected override void OnCreate Methode, die die RegistrationIntentService Absicht registriert. Hast du es hier nicht eingefügt oder hast du vergessen es zu implementieren?

HTH

Verwandte Themen