我在我的应用程序中设置了推送通知。我正在尝试确定从application:didRegisterForRemoteNotificationsWithDeviceToken:方法中的APNS接收到的设备令牌是来自沙箱还是来自开发环境。如果我能够区分初始化令牌的环境,我将能够告诉服务器向哪个环境发送推送通知。
我尝试过使用DEBUG宏来确定这一点,但是我看到了一些奇怪的行为,并且不相信它是100%正确的。
#ifdef DEBUG
BOOL isProd = YES;
#else
BOOL isProd = NO;
#endif理想情况下,我可以在代码中检查aps-environment权限(值是开发或生产),但我不确定这是否可能。
确定您的应用程序是与APNS沙箱还是生产环境通信的正确方法是什么?我假设服务器首先需要知道这一点。如果这是错误的假设,请纠正我。
编辑的:苹果关于提供者与APNS的通信的文档详细介绍了与沙箱通信和生产之间的区别。但是,文档并没有提供关于如何与注册令牌(来自iOS客户端应用程序)以及如何与服务器通信保持一致的信息。
发布于 2014-05-28 10:44:36
您可以读取和检查嵌入式供应配置文件。
https://github.com/tcurdt/TCMobileProvision
我就是这样做的:
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"];发布于 2016-11-02 15:51:07
这是一个黑客,但它在XCode 8和Swift 3上工作。
我们基本上是打开embedded.mobileprovision文件,将其转换为字符串,然后检查是否有一个字符串表明应用程序正在使用开发aps-环境。
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
}发布于 2012-04-13 23:43:07
`#ifdef DEBUGGING BOOL isProd = YES; #else BOOL isProd = NO; #endif`https://stackoverflow.com/questions/10146911
复制相似问题