2014-09-16 10 views
5

Aktualizuję moją aplikację na iOS8 do pracy z iOS8, ale mam problemy z pobieraniem tokena urządzenia dla zdalnych powiadomień.MonoTouch Pobierz DeviceToken w iOS8

I zostały zaktualizowane moje AppDelegate zadzwonić RegisterUserNotificationSettings zarejestrować przy użyciu systemów iOS 8, pozostawiając poprzednie wersje zadzwonić 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); 
     } 

Mam także następujące metody w mojej klasie AppDelegate:

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

i

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

Jednak ja nie wiem, jak zdobyć token urządzenia w DidRegisterUserNotificationSettings

Przeczytałem, że w cel-c jest: didRegisterForRemoteNotificationsWithDeviceToken, ale to nie wydaje się być dostępne w Xamarin (lub przynajmniej nie wiem jak to nazwać) .

Odpowiedz

5

Prosta odpowiedź, brakowało mi następującą linię kodu podczas rejestracji:

UIApplication.SharedApplication.RegisterForRemoteNotifications(); 

Dodanie tej linii oznaczało, że wprowadzony kod programu obsługi RegisteredForRemoteNotifications.

Więc kompletny kod rejestracji dla powiadomień jest:

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

Wygląda na to, że ludzie z Objective-C wolą wywoływać 'RegisterForRemotNotifications' wewnątrz' DidRegisterUserNotificationSettings' (patrz http://stackoverflow.com/a/24488651/1644813). Nie jestem pewien, jaki model wątku jest używany za kulisami, ale w przypadku, gdy 'RegisterForRemotNotifications' nie zakończy synchronicznie przy użyciu' DidRegisterUserNotificationSettings' będzie bezpieczniejszym wyborem. –

0

Nie ma wystarczającej ilości kodu, aby upewnić się, co jest nie tak. Podejrzewam, że zmieniłeś to, do czego dzwonisz (nie tylko dodałeś nowe połączenia, takie jak opisane here). Jeśli to nie pomoże (lub nie jest jasne), możesz chcieć zaktualizować swoje pytanie za pomocą kodu, którego używasz.

także powinieneś być w stanie zastąpić to:

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

z:

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

koniec:

Czytałem, że w Objective-C znajduje się: didRegisterForRemoteNotificationsWithDeviceToken ale wydaje się, że nie jest to dostępne w Xamarin.

Najprawdopodobniej oznaczać application:didRegisterForRemoteNotificationsWithDeviceToken: które w Xamarin.iOS, mapy do UIApplicationDelegate.RegisteredForRemoteNotifications, co powiedział pan nie nazywa się już (na systemów iOS 8).

+0

zaktualizowałem moje pytanie z jakiegoś kodu nadzieją zrobić to, co robię bardziej zrozumiałe. Nie usunąłem żadnego ze starych kodów - właśnie dodano w wywołaniu RegisterUserNotificationSettings, gdy iOS8 i dodałem obsługę obsługi DidRegisterUserNotificationSettings. – binncheol