I have push notifications set up in my app. I'm trying to determine whether the device token I've received from APNS in the application:didRegisterForRemoteNotificationsWithDeviceToken:
method came from the sandbox or development environment. If I can distinguish which environment initialized the token, I'll be able to tell my server to which environment to send the push notification.
I've tried using the DEBUG
macro to determine this, but I've seen some strange behavior with this and don't trust it to be 100% correct.
#ifdef DEBUG
BOOL isProd = YES;
#else
BOOL isProd = NO;
#endif
Ideally, I'd be able to examine the aps-environment
entitlement (value is Development or Production) in code, but I'm not sure if this is even possible.
What's the proper way to determine whether your app is communicating with the APNS sandbox or production environments? I'm assuming that the server needs to know this in the first place. Please correct me if this is assumption is incorrect.
Edited: Apple's documentation on Provider Communication with APNS details the difference between communicating with the sandbox and production. However, the documentation doesn't give information on how to be consistent with registering the token (from the iOS client app) and communicating with the server.
A channel is a type of platform that you can deliver messages to. You can use the APNs sandbox channel to send push notification messages to the sandbox environment of the Apple Push Notification service (APNs).
Production push notifications can only be tested on ipa. You need to create ipa from AdHoc Distribution profile. You need to replace the Push certificate on your Push API server. APNS Distribution certificate is to be used in this case.
Use the location push type for notifications that request a user's location. If you set this push type, the apns-topic header field must use your app's bundle ID with . location-query appended to the end. For more information, see Creating a Location Push Service Extension.
You can read and check the embedded provisioning profile.
https://github.com/tcurdt/TCMobileProvision
This is what I do:
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"];
This is a hack but its working on XCode 8
with Swift 3
We're basically opening the embedded.mobileprovision
file, converting it to a string, then checking for a string that would indicate the app is using the development aps-environment.
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
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With