objective-c - porque - led notificaciones iphone 7
Notificación remota iOS 8 (7)
¿Cómo puedo obtener el token de dispositivo para notificación remota en iOS 8? Utilicé el método didRegisterForRemoteNotificationsWithDeviceToken
en AppDelegate
en iOS <8, y devolvió el token del dispositivo. Pero en iOS 8, no es así.
Lea el código en UIApplication.h.
Sabrá cómo hacer eso.
Primero:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
agregar código como este
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
#ifdef __IPHONE_8_0
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert
| UIUserNotificationTypeBadge
| UIUserNotificationTypeSound) categories:nil];
[application registerUserNotificationSettings:settings];
#endif
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
si no usa tanto Xcode 5 como Xcode 6 , pruebe este código
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
(Gracias por el recuerdo de @zeiteisen @dmur)
Segundo:
Agregar esta función
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
//register to receive notifications
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
//handle the actions
if ([identifier isEqualToString:@"declineAction"]){
}
else if ([identifier isEqualToString:@"answerAction"]){
}
}
#endif
Y tu puedes obtener el dispositivo conectado en
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
si aún no funciona, use esta función y NSLog el error
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
Creo que la mejor manera de mantener la compatibilidad con versiones anteriores es que podemos seguir este enfoque, está funcionando para que mi caso funcione bien para usted. También es bastante fácil de entender.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
En mi caso, había hecho las actualizaciones necesarias para solicitar el acceso de notificación push para iOS 7 e iOS 8, sin embargo, no había implementado la nueva devolución de llamada para cuando un usuario de iOS 8 concede acceso. Necesitaba agregar este método a mi delegado de la aplicación.
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
La forma de registrarse para iOS 8 y seguir admitiendo versiones anteriores
UIApplication *application = [UIApplication sharedApplication];
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
|UIUserNotificationTypeSound
|UIUserNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
y en la aplicación delegar agregar
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
iOS8 puede recibir notificaciones silenciosas sin pedir permiso. Call - (void)registerForRemoteNotifications
. Después de esta application:didRegisterForRemoteNotificationsWithDeviceToken:
Nota: solo se llama a la devolución de llamada con el token si la aplicación se ha registrado satisfactoriamente para notificaciones de usuario con la función siguiente o si está habilitada la actualización de la aplicación en segundo plano.
Compruebe la configuración de su aplicación si está habilitado cualquier tipo de notificación. Si no, no obtendrás un token de dispositivo.
Ahora puede obtener notificaciones silenciosas con
aps {
content-available: 1
}
en la carga de notificaciones
Pero las notificaciones que aparecen todavía necesitan permiso. Llamada
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerUserNotificationSettings:notificationSettings];
Este código debe pedir permiso.
Ahora debería estar listo para recibir notificaciones push
La respuesta de Madao ( https://.com/a/24488562/859742 ) es correcta, pero ...
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
debería ser más "correcto"
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
Esos indicadores tienen los mismos valores de máscara de bit y es por eso que ambos funcionarían, pero UIUserNotificationSettings
requiere UIUserNotificationType
no UIRemoteNotificationType
.
Aparte de eso, yo llamaría
[application registerUserNotificationSettings:settings];
En el método AppDelegate
(dependiendo de los derechos otorgados),
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
Si está utilizando Xamarin.iOS para compilar su aplicación móvil, puede usar este fragmento de código para solicitar el registro de notificación de inserción
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
{
UIUserNotificationType userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(userNotificationTypes, null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
}
else
{
UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
}
También deberá anular el método DidRegisterUserNotificationSettings
para obtener el token del dispositivo devuelto por el servidor APNS:
public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
{
application.RegisterForRemoteNotifications();
}
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings =
[UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];