确定应用程序是否正在与APNS沙箱或生产环境进行通信
我在我的应用程序中设置了推送通知。 我试图确定我在application:didRegisterForRemoteNotificationsWithDeviceToken:
从APNS收到的设备令牌application:didRegisterForRemoteNotificationsWithDeviceToken:
方法是否来自沙盒或开发环境。 如果我能区分哪个环境初始化令牌,我将能够告诉服务器哪个环境发送推送通知。
我试过使用DEBUG
macros来确定这一点,但我已经看到了一些奇怪的行为,不要相信它是100%正确的。
#ifdef DEBUG BOOL isProd = YES; #else BOOL isProd = NO; #endif
理想情况下,我可以在代码中检查aps-environment
权利(价值是开发还是生产),但我不确定这是否可能。
什么是确定您的应用程序是否正在与APNS沙箱或生产环境进行通信的正确方法? 我假设服务器首先需要知道这一点。 如果这是假设是错误的,请纠正我。
编辑 :苹果公司的提供者与APNS沟通的文档详细说明了与沙盒和生产沟通的区别。 但是,文档不提供有关如何与注册令牌(从iOS客户端应用程序)和与服务器通信一致的信息。
您可以阅读并检查embedded式configuration文件。
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"];
-
APNS环境是根据与您的代码签名身份相匹配的代码签名权利来确定的( 在此处为良好职位) – 虽然确定您的构buildconfiguration可能有效,但如果您将构buildconfiguration与不匹配的权利相匹配,则也可能是错误的。
-
牢记这一点,使用DEBUG作为一种手段来确定您的权利应该工作(如果您发现DEBUG是棘手的,您可以添加一个自己的链接器标志“Apple LLVM …” – >“其他C标志” – > “debugging”)例如,添加-DDEBUGGING,然后使用:
#ifdef DEBUGGING BOOL isProd = YES; #else BOOL isProd = NO; #endif
这是一个黑客,但它的工作与Swift 3
XCode 8
我们基本上打开embedded.mobileprovision
文件,将其转换为一个string,然后检查一个string,表明该应用程序正在使用开发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 }
正如@ tcurdt的答案中所提到的,确定是否使用沙箱的唯一安全方法是检查供应文件。 这里是使用TCMobileProvision的Swift代码:
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 }
要安装TCMobileProvision,将其添加到您的Podfile中:
pod 'TCMobileProvision', :git => 'https://github.com/tcurdt/TCMobileProvision.git'