ios - enable - Determine si la aplicación se está comunicando con el entorno aislado de APNS o el entorno de producción
push notifications ios firebase (4)
Tengo notificaciones push configuradas en mi aplicación. Estoy tratando de determinar si el token del dispositivo que recibí de APNS en la application:didRegisterForRemoteNotificationsWithDeviceToken:
método provino de la zona de pruebas o del entorno de desarrollo. Si puedo distinguir qué entorno inicializó el token, podré indicar a mi servidor a qué entorno enviar la notificación de inserción.
He intentado usar la macro DEBUG
para determinar esto, pero he visto un comportamiento extraño con esto y no confío en que sea 100% correcto.
#ifdef DEBUG
BOOL isProd = YES;
#else
BOOL isProd = NO;
#endif
Lo ideal sería poder examinar el derecho de aps-environment
(el valor es Desarrollo o Producción) en el código, pero no estoy seguro de si esto es posible.
¿Cuál es la forma correcta de determinar si su aplicación se está comunicando con el entorno de pruebas o el entorno de producción de APNS? Estoy asumiendo que el servidor necesita saber esto en primer lugar. Por favor corríjame si esta suposición es incorrecta.
Editado : la documentación de Apple sobre Comunicación del proveedor con APNS detalla la diferencia entre la comunicación con la caja de arena y la producción. Sin embargo, la documentación no proporciona información sobre cómo ser coherente con el registro del token (desde la aplicación cliente de iOS) y la comunicación con el servidor.
El entorno APNS se determina de acuerdo con los derechos de signo de código que coinciden con su identidad de signo de código (buena publicación here ). Si bien la identificación de la configuración de compilación puede funcionar, también puede ser falsa si ha hecho coincidir esa configuración de compilación con un derecho no coincidente.
Teniendo esto en cuenta, usar DEBUG como medio para determinar tus derechos debería funcionar (si consideras que DEBUG es complicado, puedes agregar tu propia bandera de vinculador en "Apple LLVM ..." -> "Otras banderas C" -> "Depurar") por ejemplo, agregue -DDEBUGGING y luego use:
#ifdef DEBUGGING BOOL isProd = YES; #else BOOL isProd = NO; #endif
Como se mencionó en la respuesta de @tcurdt, la única forma segura de determinar si usar el sandbox es verificar el archivo de aprovisionamiento. Aquí está el código Swift, utilizando TCMobileProvision:
func isAPNSandbox() -> Bool {
if let mobileProvisionURL = NSBundle.mainBundle().URLForResource("embedded", withExtension: "mobileprovision"),
let mobileProvisionData = NSData(contentsOfURL: mobileProvisionURL),
let mobileProvision = TCMobileProvision(data: mobileProvisionData) {
if let entitlements = mobileProvision.dict["Entitlements"],
let apsEnvironment = entitlements["aps-environment"] as? String
where apsEnvironment == "development" {
return true
}
}
return false
}
Para instalar TCMobileProvision, agregue esto a su Podfile:
pod ''TCMobileProvision'', :git => ''https://github.com/tcurdt/TCMobileProvision.git''
Este es un truco pero está funcionando en XCode 8
con Swift 3
Básicamente, estamos abriendo el archivo embedded.mobileprovision
, convirtiéndolo en una cadena, y luego comprobando una cadena que indique que la aplicación está utilizando el entorno de desarrollo de aplicaciones.
func isDevelopmentEnvironment() -> Bool {
guard let filePath = Bundle.main.path(forResource: "embedded", ofType:"mobileprovision") else {
return false
}
do {
let url = URL(fileURLWithPath: filePath)
let data = try Data(contentsOf: url)
guard let string = String(data: data, encoding: .ascii) else {
return false
}
if string.contains("<key>aps-environment</key>/n/t/t<string>development</string>") {
return true
}
} catch {}
return false
}
Puede leer y verificar el perfil de aprovisionamiento incorporado.
https://github.com/tcurdt/TCMobileProvision
Esto es lo que hago:
NSString *mobileprovisionPath = [[[NSBundle mainBundle] bundlePath]
stringByAppendingPathComponent:@"embedded.mobileprovision"];
TCMobileProvision *mobileprovision = [[TCMobileProvision alloc] initWithData:[NSData dataWithContentsOfFile:mobileprovisionPath]];
NSDictionary *entitlements = mobileprovision.dict[@"Entitlements"];
NSString *apsEnvironment = entitlements[@"aps-environment"];
BOOL production = entitlements && apsEnvironment && [apsEnvironment isEqualToString:@"production"];