2014-09-16 3 views
5

Ich aktualisiere meine iOS-Anwendung, um mit iOS8 zu arbeiten, bekomme aber Probleme beim Abrufen des Geräte-Tokens für Remote-Benachrichtigungen.MonoTouch Get DeviceToken in iOS8

ich meine AppDelegate aktualisiert RegisterUserNotificationSettings rufen zu registrieren, wenn iOS8 verwenden, frühere Versionen verlassen nennen RegisterForRemoteNotificationTypes:

var version8 = new Version (8,0); 

     if (new Version(UIDevice.CurrentDevice.SystemVersion) < version8) 
     { 
      var notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound; 
      UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes); 
     } 
     else 
     { 
      var settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, new NSSet()); 
      UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); 
     } 

Ich habe auch die folgenden Methoden in meiner AppDelegate Klasse:

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) 
    { 
     NSString str = (NSString)Runtime.GetNSObject(Messaging.intptr_objc_msgSend(deviceToken.Handle, new Selector("description").Handle)); 
     _deviceTokenString = str.ToString().Replace("<", "").Replace(">", "").Replace(" ", ""); 
     Trace.trace("Device Token: " + _deviceTokenString); 
} 

und

public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings) 
    { 
     // Get Device Token 
    } 

Allerdings nicht wissen, wie man das Gerät Token in

Ich habe gelesen, dass in objective-c gibt es: didRegisterForRemoteNotificationsWithDeviceToken aber das scheint nicht in Xamarin verfügbar sein (oder zumindest ich weiß nicht, wie man es nennt) .

Antwort

5

Einfache Antwort, ich fehlte die folgende Zeile Code bei der Registrierung:

UIApplication.SharedApplication.RegisterForRemoteNotifications(); 

diese Zeilen Hinzufügen dazu geführt, dass der Code der RegisteredForRemoteNotifications Handler eingetragen.

So ist der vollständige Code für Benachrichtigungen für die Registrierung ist:

var version8 = new Version (8,0); 
     if (new Version(UIDevice.CurrentDevice.SystemVersion) < version8) 
     { 
      var notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound; 
      UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes); 
     } 
     else 
     { 
      var settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, new NSSet()); 
      UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); 
      UIApplication.SharedApplication.RegisterForRemoteNotifications(); 
     } 
+1

Es scheint, dass Objective-C-Benutzer lieber 'RegisterForRemotNotifications' in' DidRegisterUserNotificationSettings' aufrufen (siehe http://stackoverflow.com/a/24488651/1644813). Ich bin mir nicht sicher, welches Threading-Modell hinter den Kulissen verwendet wird, aber für den Fall, dass 'RegisterForRemotNotifications' nicht synchron mit' DidRegisterUserNotificationSettings' abschließt, wäre dies eine sicherere Wette. –

0

Es gibt nicht genug Code, um sicher zu sein, was falsch ist. Ich vermute, dass Sie geändert haben, was Sie anrufen (nicht nur neue Anrufe hinzugefügt, wie beschrieben here). Wenn das nicht hilft (oder nicht klar ist), dann möchten Sie vielleicht Ihre Frage mit mehr Code, den Sie verwenden, aktualisieren.

Auch sollten Sie in der Lage sein, dies zu ersetzen:

NSString str = (NSString)Runtime.GetNSObject(Messaging.intptr_objc_msgSend(deviceToken.Handle, new Selector("description").Handle)); 
_deviceTokenString = str.ToString().Replace("<", "").Replace(">", "").Replace(" ", ""); 

mit:

_deviceTokenString = deviceToken.Description.Replace("<", "").Replace(">", "").Replace(" ", ""); 

Endlich:

Ich habe gelesen, dass in Objective-C gibt es: didRegisterForRemoteNotificationsWithDeviceToken aber das scheint in Xamarin nicht verfügbar zu sein.

Sie meinen wahrscheinlich application:didRegisterForRemoteNotificationsWithDeviceToken:, die in Xamarin.iOS, Karten zu UIApplicationDelegate.RegisteredForRemoteNotifications, die Sie gesagt wird, nicht mehr genannt (auf iOS8).

+0

ich meine Frage mit einigen Code aktualisiert haben hoffentlich zu machen, was ich besser verständlich machen. Ich habe keinen der alten Code entfernt - nur in den Aufruf von RegisterUserNotificationSettings bei iOS8 hinzugefügt und den DidRegisterUserNotificationSettings Handler hinzugefügt. – binncheol