2017-04-12 9 views
0

アプリが(フォアグラウンドとバックグラウンドで)実行されているときに、通知を受け取り、AndroidのNotificationManagerを使用して通知を表示できます。しかし、アプリを通知から外した後、アプリが通知を受け取ると、Unfortunately, MyApp has stopped workingというメッセージが表示されます。アプリを閉じるとGCM通知がクラッシュする

私は既にBaidu Notificationsを設定しているため、アプリをスワイプした後に通知を受け取ることができることを知っています。しかし、GCMを使用すると、アプリがクラッシュするだけです。ここでは、コードに問題がある:

[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()); 
    } 
} 

OnReceive方法で行CreateNotification();をコメントアウトすることで、アプリがクラッシュしませんが、もちろんそれは、通知を作成し、表示されません。

+0

Google Cloud Messagingを使用していてFirebase Could Messagingを使用していない理由は何ですか? –

+0

@MadhavShenoy私は同じことを書いていました。 –

+1

:D FCMでは通知を処理するコードを書く必要はありません。 –

答えて

1

私はコメントで言ったように、FCMの使用はメッセージの処理を担当するので、はるかに簡単です。

私はVisual Studio 2017とXamarin Forms Version 2.3.224を使用しています(2.3.3.193でも動作するはずです)。私は自分のソリューションにNugetパッケージのスクリーンショットを添付しています。フォームプロジェクトではなく、Xamarin.Firebase.MessagingをAndroidプロジェクトに追加しました。 enter image description here

FCMを実行するには、アカウントを作成してgoogle-services.jsonファイルをダウンロードする必要があります。 Xamarinフォームでこれを実装するには、このhere

の詳細私は、Androidで2つのサービス、 1依存関係サービス 2目的のサービスを作成しました。

依存サービスは、PlayServiceが使用可能かどうかをチェックし、FirebaseTokenをフェッチします。

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; 
} 

今、w.r.t. The 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. 
    } 

} 

これは、アプリケーションが起動するとすぐに実行され、通常、アプリケーションの起動後約6〜7秒で完了します。これはFirebaseからトークンを生成し、それをアプリに渡します。

トークンは必要ありませんが(アプリをインストールしたすべての携帯電話にプッシュメッセージを送信できるので)、プッシュメッセージを使ってこの電話だけにプッシュ通知を送信できます。

希望します。

+0

Xamarin.Firebase.Messagingパッケージのバージョンは何ですか?私はアンドロイドプロジェクトに最新の安定版42.1001.0をインストールしようとしましたが、依存パッケージがインストールされていないことを示唆しています。プロジェクトをコンパイルすると20個の警告と9個のエラーがあります。 –

+0

興味深いことに、ソリューションをクリーンアップして再構築してもうまくいきます...しかし、新しいフォームプロジェクトにメッセージングパッケージをインストールしようとするたびに、同じエラーが発生し、これをクリーンアップして再構築しようとすることはありませんでした。私はFCMをxamarinのフォームで使うことはできないと思っています...とにかくおかげさまです。 –

関連する問題