2014-09-16 8 views
5

Sto aggiornando la mia applicazione iOS per funzionare con iOS8 ma riscontro problemi nel ricevere il token del dispositivo per le notifiche remote.MonoTouch Ottieni DeviceToken in iOS8

Ho aggiornato il mio AppDelegate chiamare RegisterUserNotificationSettings per registrare quando si utilizzano iOS 8, lasciando le versioni precedenti di chiamare 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); 
     } 

Ho anche i seguenti metodi della mia classe 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); 
} 

e

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

Tuttavia io non so come ottenere il token del dispositivo in DidRegisterUserNotificationSettings

Ho letto che in ogg-c c'è: didRegisterForRemoteNotificationsWithDeviceToken ma questo non sembra essere disponibile in Xamarin (o almeno non so come chiamarlo) .

risposta

5

Risposta semplice, mi mancava la seguente riga di codice al momento della registrazione:

UIApplication.SharedApplication.RegisterForRemoteNotifications(); 

L'aggiunta di questa linea ha fatto sì che il codice è entrato il gestore RegisteredForRemoteNotifications.

Quindi il codice completo per la registrazione per le notifiche è:

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

Sembrerebbe che gli utenti Objective-C preferiscano chiamare "RegisterForRemotNotifications" all'interno di "DidRegisterUserNotificationSettings" (vedere http://stackoverflow.com/a/24488651/1644813). Non sono sicuro di quale modello di threading venga utilizzato dietro le quinte, ma nel caso che 'RegisterForRemotNotifications' non si completi in modo sincrono usando' DidRegisterUserNotificationSettings' sarebbe una scommessa più sicura. –

0

Non c'è abbastanza codice per essere sicuro di ciò che è sbagliato. Sospetto che tu abbia cambiato ciò che stai chiamando (non solo ha aggiunto nuove chiamate, come descritto in here). Se ciò non aiuta (o non è chiaro), potresti voler aggiornare la tua domanda con altro del codice che stai utilizzando.

Inoltre, si dovrebbe essere in grado di sostituire questo:

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

con:

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

Infine:

Ho letto che in Objective-C v'è: didRegisterForRemoteNotificationsWithDeviceToken ma questo non sembra essere disponibile in Xamarin.

È probabile dire application:didRegisterForRemoteNotificationsWithDeviceToken: che, in Xamarin.iOS, mappe di UIApplicationDelegate.RegisteredForRemoteNotifications, che hai detto che non si chiama più (su iOS 8).

+0

Ho aggiornato la mia domanda con un po 'di codice per fare si spera quello che sto facendo più comprensibile. Non ho rimosso nessuno dei vecchi codici - appena aggiunto nella chiamata a RegisterUserNotificationSettings quando iOS8 e aggiungendo il gestore DidRegisterUserNotificationSettings. – binncheol