1

Plate-forme: iOS 10.2+FCM Xamarin.Forms, notification de fond iOS ne montre pas

Xamarin Plugin: Firebase iOS messagerie nuage https://components.xamarin.com/view/firebaseioscloudmessaging

Problème: Lorsque j'envoie une notification de la console Firebase ou à partir de mon code appelant FireBase. Mes iPhones ne reçoivent pas les notifications d'arrière-plan (comme une bulle). Mais, si j'avais l'application en premier plan, j'ai reçu la notification en tant que "DisplayAlert" de la fonction ApplicationReceivedRemoteMessage (RemoteMessage remoteMessage). Par conséquent, l'appareil est enregistré sur FCM, l'appareil possède le jeton, l'appareil peut recevoir les notifications, mais l'appareil n'a pas reçu les notifications en arrière-plan.

** En VisualStudio 2017 au projet .iOS manifeste Je le mode de fond activé et les notifications activées à distance trop **

¿C'est-ce un problème commun? Puis-je résoudre pour travailler à mon projet?

Code de AppDelegate

[Register("AppDelegate")] 
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IUNUserNotificationCenterDelegate, IMessagingDelegate 
{ 
    protected SQLiteAsyncConnection conn; 
    // 
    // This method is invoked when the application has loaded and is ready to run. In this 
    // method you should instantiate the window, load the UI into it and then make the window 
    // visible. 
    // 
    // You have 17 seconds to return from this method, or iOS will terminate your application. 
    // 
    public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
    { 
     global::Xamarin.Forms.Forms.Init(); 
     global::Xamarin.FormsMaps.Init(); 
     CachedImageRenderer.Init(); 
     LoadApplication(new App()); 

     UITabBar.Appearance.SelectedImageTintColor = UIColor.FromRGB(139, 194, 77); 
     UINavigationBar.Appearance.TintColor = UIColor.FromRGB(139,194,77); 

     CrossVersionTracking.Current.Track(); 

     // Firebase component initialize 
     Firebase.Analytics.App.Configure(); 

     // Register your app for remote notifications. 
     if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0)) 
     { 
      // iOS 10 or later 
      var authOptions = UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound; 
      UNUserNotificationCenter.Current.RequestAuthorization(authOptions, (granted, error) => { 
       Console.WriteLine(granted); 
      }); 

      // For iOS 10 display notification (sent via APNS) 
      UNUserNotificationCenter.Current.Delegate = this; 

      // For iOS 10 data message (sent via FCM) 
      Messaging.SharedInstance.RemoteMessageDelegate = this; 
     } 
     else 
     { 
      // iOS 9 or before 
      var allNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound; 
      var settings = UIUserNotificationSettings.GetSettingsForTypes(allNotificationTypes, null); 
      UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); 
     } 

     UIApplication.SharedApplication.RegisterForRemoteNotifications(); 

     Firebase.InstanceID.InstanceId.Notifications.ObserveTokenRefresh((sender, e) => 
        { 

         newToken = Firebase.InstanceID.InstanceId.SharedInstance.Token; 

         //Conectamos con la base de datos. 
         database = new SQLiteClient(); 
         conn = database.GetConnection(); 

        usuario = null; 
         try 
         { 
          var task = Task.Run(async() => 
          { 
           usuario = await conn.Table<Usuario>() 
            .FirstOrDefaultAsync(); 
          }); 
          task.Wait(); 
          if (usuario != null) 
          { 
           usuario.token = newToken; 
           task = Task.Run(async() => 
           { 
            await conn.InsertOrReplaceAsync(usuario); 
           }); 
           task.Wait(); 
          } 
         } 
         catch (Exception ex) 
         { 
          System.Diagnostics.Debug.WriteLine("TOKEN ERROR\tNo se ha podido Guardar el Token" + ex.Message); 
         } 


         System.Diagnostics.Debug.WriteLine("TOKEN\t" + newToken); 

         connectFCM(); 
        }); 

     #endregion 
     return base.FinishedLaunching(app, options); 
    } 

    public override void DidEnterBackground(UIApplication uiApplication) 
    { 
     Messaging.SharedInstance.Disconnect(); 
     Console.WriteLine("Disconnected from FCM"); 
    } 

    public override void OnActivated(UIApplication uiApplication) 
    { 
     connectFCM(); 
     base.OnActivated(uiApplication); 
    } 

    public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) 
    { 
     #if DEBUG 
     Firebase.InstanceID.InstanceId.SharedInstance.SetApnsToken(deviceToken, Firebase.InstanceID.ApnsTokenType.Sandbox); 
     #endif 
     #if RELEASE 
     Firebase.InstanceID.InstanceId.SharedInstance.SetApnsToken(deviceToken, Firebase.InstanceID.ApnsTokenType.Prod); 
     #endif 
    } 
    // iOS 9 <=, fire when recieve notification foreground 
    public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler) 
    { 
     Messaging.SharedInstance.AppDidReceiveMessage(userInfo); 

     // Generate custom event 

     NSString[] keys = { new NSString("Event_type") }; 
     NSObject[] values = { new NSString("Recieve_Notification") }; 
     var parameters = NSDictionary<NSString, NSObject>.FromObjectsAndKeys(keys, values, keys.Length); 

     // Send custom event 
     Firebase.Analytics.Analytics.LogEvent("CustomEvent", parameters); 

     if (application.ApplicationState == UIApplicationState.Active) 
     { 
      System.Diagnostics.Debug.WriteLine(userInfo); 
      var aps_d = userInfo["aps"] as NSDictionary; 
      var alert_d = aps_d["alert"] as NSDictionary; 
      var body = alert_d["body"] as NSString; 
      var title = alert_d["title"] as NSString; 
      debugAlert(title, body); 
     } 

    } 

    // iOS 10, fire when recieve notification foreground 
    [Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")] 
    public void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler) 
    { 
     System.Console.WriteLine(notification.Request.Content.UserInfo); 
     var title = notification.Request.Content.Title; 
     var body = notification.Request.Content.Body; 
     debugAlert(title, body); 
    } 

    private void connectFCM() 
    { 
     Console.WriteLine("connectFCM\tEjecutandose la función."); 
     Messaging.SharedInstance.Connect((error) => 
     { 
      if (error == null) 
      { 
       //TODO: Change Topic to what is required 
       Messaging.SharedInstance.Subscribe("/topics/all"); 
      } 
      //System.Diagnostics.Debug.WriteLine("connectFCM\t" + (error != null ? "error occured" : "connect success")); 
      Console.WriteLine("connectFCM\t" + (error != null ? "error occured" + error.DebugDescription : "connect success")); 

     }); 
    } 
    private void debugAlert(string title, string message) 
    { 
     var alert = new UIAlertView(title ?? "Title", message ?? "Message", null, "Cancel", "OK"); 
     alert.Show(); 
    } 

    public void ApplicationReceivedRemoteMessage(RemoteMessage remoteMessage) 
    { 
     Console.WriteLine("\n*******************************************"); 
     Console.WriteLine("AplicationReceivedRemoteMessage\t" + remoteMessage.AppData); 
     Console.WriteLine("\n*******************************************"); 
     var title = remoteMessage.AppData.ValueForKey(new NSString("title")); 
     var text = remoteMessage.AppData.ValueForKey(new NSString("text")); 
     debugAlert("" + title, "" + text); 
    } 

    [Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")] 
    public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler) 
    { 
     debugAlert("DidreceiveNotificationResponse", response + "" ); 
    } 

Pour plus d'informations, mon info.plist contais la clé:

<key>UIBackgroundModes</key> 
<array> 
    <string>location</string> 
    <string>bluetooth-central</string> 
    <string>bluetooth-peripheral</string> 
    <string>fetch</string> 
    <string>remote-notification</string> 
</array> 

Répondre

-1

Après une longue enquête, je résous.

Il est nécessaire d'ajouter cette clé au fichier Entile.plist.

<dict> 
    <key>aps-environment</key> 
    <string>development</string> 
</dict>