确定应用程序是否正在与APNS沙箱或生产环境进行通信

我在我的应用程序中设置了推送通知。 我试图确定我在application:didRegisterForRemoteNotificationsWithDeviceToken:从APNS收到的设备令牌application:didRegisterForRemoteNotificationsWithDeviceToken:方法是否来自沙盒或开发环境。 如果我能区分哪个环境初始化令牌,我将能够告诉服务器哪个环境发送推送通知。

我试过使用DEBUGmacros来确定这一点,但我已经看到了一些奇怪的行为,不要相信它是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"]; 
  1. APNS环境是根据与您的代码签名身份相匹配的代码签名权利来确定的( 在此处为良好职位) – 虽然确定您的构buildconfiguration可能有效,但如果您将构buildconfiguration与不匹配的权利相匹配,则也可能是错误的。

  2. 牢记这一点,使用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'