remote - Problemas para recibir notificaciones push en iOS10 y iOS9
push notifications ios swift tutorial (3)
¿Ha comprobado que la Configuración de compilación> Autorizaciones de firma de código tiene una referencia al archivo de autorizaciones? [AppName] .entitlements.
Y que el archivo de derechos contiene la información correcta:
(clave: entorno APS, valor: desarrollo)
Aparte de eso, puedes intentar regenerar certificados push. Tuvimos que crear nuevos certificados para que funcionara en producción después de la actualización de IOS 10 (pero no en un entorno de espacio aislado).
Tratando de configurar notificaciones push para iOS10. Lo tenía funcionando previamente para las versiones inferiores a 10.
Lea algunas guías mi configuración es así:
// Register for the defined notifications
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.current()
center.delegate = UIApplication.shared.delegate as! AppDelegate
center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
if error == nil {
UIApplication.shared.registerForRemoteNotifications()
}
}
} else {
// Fallback on earlier versions
let notificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: [autoCancelCategory])
UIApplication.shared.registerUserNotificationSettings(notificationSettings)
UIApplication.shared.registerForRemoteNotifications()
}
Esto se llama al inicio de sesión ^ en uno de mis controladores de vista.
Y ahora en AppDelegate
, se ajusta a UNUserNotificationCenterDelegate
, tengo estos métodos:
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
print("Got a push!")
}
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("Got a push!")
}
Y también tengo:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let settings = UserDefaults.standard
settings.setValue(deviceToken, forKey: "deviceToken")
}
El token del dispositivo se carga en el servidor como Data
, y esto ha funcionado bien para versiones anteriores.
He comprobado que el token en el servidor coincide con el del teléfono.
He habilitado notificaciones push para todos los destinos en Capabilities
, también he marcado Add the push Notifications entitlement to your entitlements file
.
No recibiendo nada en absoluto aunque en el empuje.
¿Alguna idea de lo que podría estar haciendo mal aquí? Cualquier puntero sería realmente apreciado!
¡Gracias!
EDITAR: También he notado que las notificaciones push no funcionan en iOS9.
Acabo de notar que está registrando el delegado más tarde que la application(_:willFinishLaunchingWithOptions:)
o la application(_:didFinishLaunchingWithOptions:)
se llaman los métodos.
Tal vez es por eso que sus métodos de delegado no están siendo golpeados?
Ver los docs :
Importante
Debe asignar su objeto delegado al objeto UNUserNotificationCenter no más tarde antes de que la aplicación termine de iniciarse. Por ejemplo, en una aplicación de iOS, debe asignarla en el método de la aplicación ( : willFinishLaunchingWithOptions :) o aplicación ( : didFinishLaunchingWithOptions :).
Para responder a esto, tal vez sea útil para otros. Mi ficha estaba equivocada. La codificación ha cambiado con las actualizaciones recientes. Realicé una búsqueda en todo el desbordamiento de pila para esto y, según tengo entendido, tuve que convertir los Data
en una String
usando la base64string
. Sin embargo, me di cuenta de que esta cadena tenía algunos caracteres impares, como /
. Finalmente terminé haciendo una extensión de Data
:
extension Data {
func hexString() -> String {
return self.reduce("") { string, byte in
string + String(format: "%02X", byte)
}
}
}
Esto convierte los Data
al formato correcto. Entonces, si esta es la forma en que realiza su conversión, además de establecer todos los derechos, recuerde agregar los nuevos métodos:
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
print("Got a push!")
}
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("Got a push!")
}
y establezca el objeto delegado en didFinishLaunchingWithOptions
todo debería estar listo.