2014-12-26 4 views
1

У меня есть приложение Xamarin.iOS, которое может успешно получать уведомление Push APNS, когда приложение работает на переднем плане. Тем не менее, я также хочу иметь возможность обрабатывать push-уведомление, когда приложение работает в фоновом режиме или вообще не работает.Удаленные уведомления, когда приложение находится на переднем плане, но не в фоновом режиме

Эта страница на Xamarin, кажется, сказать, что вы действительно можете сделать это:

http://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/updating_an_application_in_the_background/

Я использую стратегию Дистанционные уведомлений, описанной выше. Поэтому я реализовал именно то, что он сказал, включая изменение info.plist, чтобы иметь удаленные уведомления в качестве фоновой операции. Тем не менее, я не получаю никаких вызовов в обратном вызове DidFinishedLaunching или ReceivedRemoteNotification, когда приложение работает в фоновом режиме. Когда приложение работает на переднем плане, все работает нормально. Излишне говорить, что это супер разочаровывает.

Неужели кто-нибудь еще сталкивается с этой проблемой?

Любая помощь очень ценится!

Вот код, я использую для регистрации удаленных уведомлений:

public static void NotifyAppStart() 
    { 
     if (GetRemoteWipePreference()) 
     { 
      if (Utils.CheckOsVersion(8, 0)) 
      { 
       // iOS 8 version 

       UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, new NSSet()); 

       UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); 

       UIApplication.SharedApplication.RegisterForRemoteNotifications(); 

      } 
      else 
      { 
       // Only works on iOS 7 and earlier 

       UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound; 
       UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes); 
      } 


     } 

    } 

А вот код PushSharp Я использую для отправки уведомления толчка на стороне сервера:

push.RegisterAppleService(new ApplePushChannelSettings(appleCert, GetApplePwd() )); 
     push.QueueNotification(new AppleNotification() 
            .ForDeviceToken(token).WithContentAvailable(1) 
            .WithCustomItem(msg, device.device_local_guid) ); 

Замечание: Есть несколько других вопросов о переполнении стека об этой общей области, но ни одна из них на самом деле об этой проблеме.

+0

Вы тестирование в симуляторе? Если да, в симуляторе SDK8 есть ошибка, которая не позволяет приложениям быть в действительности. – Krumelur

+0

Nope - тестирование на устройстве (iPhone 6) – jbro91837

ответ

0
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0)) 
     { 
      var settings = UIUserNotificationSettings.GetSettingsForTypes (UIUserNotificationType.Sound | 
       UIUserNotificationType.Alert | UIUserNotificationType.Badge, null); 

      UIApplication.SharedApplication.RegisterUserNotificationSettings (settings); 
      UIApplication.SharedApplication.RegisterForRemoteNotifications(); 
     } 
     else 
     { 
      UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(UIRemoteNotificationType.Badge | 
       UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert); 
     } 

также вам это

public override void RegisteredForRemoteNotifications (UIApplication application, NSData deviceToken) 
    { 
     var oldDeviceToken = NSUserDefaults.StandardUserDefaults.StringForKey("PushDeviceToken"); 

     var strFormat = new NSString("%@"); 
     var dt = new NSString(MonoTouch.ObjCRuntime.Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr(new MonoTouch.ObjCRuntime.Class("NSString").Handle, new MonoTouch.ObjCRuntime.Selector("stringWithFormat:").Handle, strFormat.Handle, deviceToken.Handle)); 
     var newDeviceToken = dt.ToString().Replace("<", "").Replace(">", "").Replace(" ", ""); 
     string sql; 

     if (string.IsNullOrEmpty(oldDeviceToken) || !deviceToken.Equals(newDeviceToken)) 
     { 
      do someting 
     } 

     if (oldDeviceToken == newDeviceToken) 
     { 
      do someting 
     } else 
     { 
      do something 
     } 

     NSUserDefaults.StandardUserDefaults.SetString(newDeviceToken, "PushDeviceToken"); 
     Console.WriteLine("Device Token: " + newDeviceToken); 
    } 

если ваша программа переднего плана вы можете использовать как этот

void processNotification(NSDictionary options, bool fromFinishedLaunching) 
    { 
     if (null != options && options.ContainsKey(new NSString("aps"))) 
     { 
      NSDictionary aps = options.ObjectForKey(new NSString("aps")) as NSDictionary; 

      string alert = string.Empty; 
      string sound = string.Empty; 
      int badge = -1; 

      if (aps.ContainsKey(new NSString("alert"))) 
       alert = (aps[new NSString("alert")] as NSString).ToString(); 

      if (aps.ContainsKey(new NSString("sound"))) 
       sound = (aps[new NSString("sound")] as NSString).ToString(); 

      if (aps.ContainsKey(new NSString("badge"))) 
      { 
       string badgeStr = (aps[new NSString("badge")] as NSObject).ToString(); 
       int.TryParse(badgeStr, out badge); 
      } 

      if (!fromFinishedLaunching) 
      { 
       if (badge >= 0) 
        UIApplication.SharedApplication.ApplicationIconBadgeNumber = badge; 

       if (sound == "xx.caf") 
       { 
        UIAlertView avAlert = new UIAlertView ("Dogrular App", alert, null, "Tamam", null); 
        avAlert.Show(); 
       } 

       if (sound == "yyy.caf") 
       { 
        UIAlertView avAlert = new UIAlertView ("Dogrular App", alert, null, "Tamam", null); 
        avAlert.Show(); 

        NSUrl request = new NSUrl("https://xxx.com"); 
        UIApplication.SharedApplication.OpenUrl(request); 
       } 
      } 
     } 
    } 
+0

Привет, Спасибо за отзыв - проблема в том, что я пытаюсь заставить это работать, когда оно работает в фоновом режиме, а не переднем плане. Вы знаете, как это сделать? – jbro91837

0

Ваш файл JSON состоит из content-available булевой ключа "ложь"? Пример:

{ 
    "to": "GCM Registration ID", 
    "priority":"high", 
    "data": { 
     "notificationId":123, 
     "title":"Spot you!", 
     "message": "&lt;font color=\"red\"&gt;&lt;b&gt;Test RED Bold text maybe ?&lt;/b&gt;&lt;/font&gt;&lt;br/&gt;Normal second line.&lt;br/&gt;&lt;br/&gt;", 
     "photoUrl": "http://babymetal.net/wp-content/uploads/2015/07/ladybeard-e1427784688234.jpg", 
     "badge": 1 
    }, 
    "dry_run" : false,  
    "time_to_live" : 4, 
    "content_available" : false 
} 

Над возвращением JSon должен быть вызовом ваш метод

public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo) 
Смежные вопросы