2017-04-12 6 views
0

Wenn meine App ausgeführt wird (im Vordergrund und Hintergrund), kann ich Benachrichtigungen erhalten und die Benachrichtigungen an den Benutzer mit Android NotificationManager anzeigen. Nach dem Verschieben der App von den Recents, wenn die App eine Benachrichtigung erhält, erhalte ich die Nachricht .GCM Benachrichtigung stürzt App nach dem Schließen der App

Ich weiß, dass die App in der Lage sein sollte, Benachrichtigungen zu erhalten, nachdem sie weggeschwemmt wurde, weil ich Baidu-Benachrichtigungen bereits eingerichtet habe, und ich kann sie empfangen, nachdem ich die App weggewischt habe. Aber mit GCM verursacht es nur einen Absturz der App. Hier ist der Code in Frage:

[BroadcastReceiver(Name = "com.my.pkg.MyGcmReceiver", Exported = true, Permission = "com.google.android.c2dm.permission.SEND")] 
[IntentFilter(new string[] { "com.google.android.c2dm.intent.RECEIVE" }, Categories = new string[] { "com.my.pkg" })] 
public class MyGcmReceiver : GcmReceiver 
{ 
    public override void OnReceive(Context context, Intent intent) 
    { 
     base.OnReceive(context, intent); 
     System.Diagnostics.Debug.WriteLine("MyGcmReceiver - OnReceive called &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"); 
     CreateNotification(); 
    } 

    private void CreateNotification() 
    { 
     NotificationCompat.Builder builder = new NotificationCompat.Builder(Xamarin.Forms.Forms.Context); 

     builder.SetAutoCancel(true); 
     builder.SetDefaults(NotificationCompat.DefaultAll); 
     builder.SetSmallIcon(Resource.Drawable.icon); 
     builder.SetContentTitle("HI"); 
     builder.SetContentText("MSG FROM GCM"); 
     builder.SetPriority((int)NotificationPriority.Max); 

     NotificationManager manager = (NotificationManager)Xamarin.Forms.Forms.Context.GetSystemService(Context.NotificationService); 

     manager.Notify(0, builder.Build()); 
    } 
} 

Durch kommentieren Sie die Zeile CreateNotification(); im OnReceive Methode, die App wird nicht abstürzen, aber natürlich dann ist es nicht zu schaffen, und die Meldung anzeigen.

+0

Warum verwenden Sie Google Cloud Messaging und nicht Firebase Could Messaging? –

+0

@MadhavShenoy Ich schrieb das gleiche. –

+1

: D Mit FCM müssen Sie keinen Code zum Verarbeiten von Benachrichtigungen schreiben –

Antwort

1

Wie ich im Kommentar gesagt habe, scheint die Verwendung von FCM viel einfacher, da es sich um die Verarbeitung der Nachricht kümmert.

Ich verwende Visual Studio 2017 und Xamarin Forms Version 2.3.224 (Es sollte auch mit 2.3.3.193 funktionieren). Ich füge auch einen Screenshot der Nuget-Pakete in meine Lösung ein. Ich habe Xamarin.Firebase.Messaging zum Android-Projekt und nicht zum Formular-Projekt hinzugefügt. enter image description here

Um FCM auszuführen, müssen Sie ein Konto erstellen und die Datei google-services.json herunterladen. Mehr zu diesem here

Um dies zu implementieren in Xamarin Forms erstellt I 2 Dienstleistungen in Android, 1 eine Abhängigkeitsdienst 2 eine Absicht Service.

Der Abhängigkeitsdienst überprüft nur, ob PlayService verfügbar ist, und ruft FirebaseToken ab.

public class PlayServices: IPlayService 
{ 
    public string IsPlayServicesAvailable() 
    { 
     int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(Forms.Context); 
     if (resultCode != ConnectionResult.Success) 
     { 
      if (GoogleApiAvailability.Instance.IsUserResolvableError(resultCode)) 
       return GoogleApiAvailability.Instance.GetErrorString(resultCode); 
      return "This device is not supported"; 
     } 
     return "Available"; 
    } 

    public string FirebaseToken => FirebaseInstanceId.Instance.Token; 
} 

Jetzt, w.r.t. die IntentService

[Service] 
[IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })] 
public class MyFirebaseIidService : FirebaseInstanceIdService 
{ 
    const string TAG = "MyFirebaseIIDService"; 
    public override void OnTokenRefresh() 
    { 
     var refreshedToken = FirebaseInstanceId.Instance.Token; 
     Log.Debug(TAG, "Refreshed token: " + refreshedToken); 
     SendRegistrationToServer(refreshedToken); 
    } 
    void SendRegistrationToServer(string token) 
    { 
     // Add custom implementation, as needed. 
    } 

} 

Das wird so schnell laufen, wie die App startet und schließt im allgemeinen in etwa 6-7 Sekunden, nachdem die App gestartet wird. Dies erzeugt ein Token von Firebase und gibt es an die App.

Obwohl Sie das Token nicht benötigen (da Sie Push-Nachrichten an alle Telefone senden können, auf denen Ihre App installiert ist), können Sie Push-Benachrichtigungen nur an dieses Telefon senden.

Hoffe, das hilft

+0

Was ist die Version des Xamarin.Firebase.Messaging-Pakets? Ich habe versucht, neueste stabile Version 42.1001.0 zu Android-Projekt zu installieren, aber es schlägt vor, dass ein abhängiges Paket nicht installiert werden kann und wenn ich das Projekt kompiliere, gibt es 20 Warnungen und 9 Fehler. –

+0

Interessant, ich bereinige die Lösung und baue sie neu auf, funktioniert jetzt gut ... Doch jedes Mal, wenn ich versuchte, das Messaging-Paket in ein neues Formularprojekt zu installieren, traten die gleichen Fehler auf und ich versuchte nie, sie zu säubern und neu aufzubauen Ich dachte FCM kann nicht mit Xamarin Formen verwendet werden ... Danke trotzdem. –

Verwandte Themen