2017-08-22 14 views
1

プラットフォーム: iOSの10.2以降FCMのXamarin.Forms、iOSの背景通知が表示さdoesntの

Xamarinプラグイン: FirebaseのiOSクラウドメッセージングhttps://components.xamarin.com/view/firebaseioscloudmessaging

問題:私はFireBaseコンソールからの通知を送信する場合FireBaseを呼び出す私のコードから。私のiPhoneは背景通知(バブル)を受信しません。しかし、アプリケーションをフォアグラウンドで使用した場合は、ApplicationReceivedRemoteMessage(RemoteMessage remoteMessage)関数から「DisplayAlert」として通知を受け取りました。

したがって、デバイスはFCMに登録されています。デバイスはトークンを持っていますが、デバイスは通知を受信できますが、デバイスはバックグラウンドで通知を受信しませんでした。

**マニフェスト.iOSプロジェクトでVisualStudioを2017年に私はアクティブにバックグラウンドモードとあまりに**起動し、リモート通知を持って

¿それは、この共通の問題ですか? ¿私のプロジェクトで働くことができますか?詳細情報については

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

AppDelegateの

コードは、私のInfo.plistキーをcontais:

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

答えて

-1

を、私はそれを解決するための長い調査の後。

Entile.plistファイルにそのキーを追加する必要があります。

<dict> 
    <key>aps-environment</key> 
    <string>development</string> 
</dict> 
関連する問題