确定设备令牌是否为沙箱或分发
有没有方法可以确定设备令牌是沙盒还是分发?我们正在测试,应用程序有时会使用开发证书签名,而其他应用程序则使用临时证书(分发证书)进行签名。这是因为我们正在将应用程序传递给100个提供的临时测试设备中的一些,并且还将开发签名的应用程序构建到我们的设备。 因为发送推送通知要求我们选择适当的推送服务器和pem文件,所以能够确定令牌是否是沙盒或分发以适当的方式发送通知以便推送通知成功将是非常好的。 我们有时必须使用分发配置文件来签署我们的应用程序,因此测试推送通知系统需要我们正确地发送这些通知。确定设备令牌是否为沙箱或分发
- 打开项目生成设置
- 进入预处理设置
- 在“预处理器宏在预编译头不使用”(假设你是不是在.PCH文件分支代码),添加TOKEN_ENV_SANDBOX = 0释放下和Debug和Ad Hoc下的TOKEN_ENV_SANDBOX = 1。
- 在代码中任何地方只要使用编译器指令
#如果TOKEN_ENV_SANDBOX
的NSLog(@ “TOKEN_ENV == PRODUCTION”)!;
#ENDIF的#if TOKEN_ENV_SANDBOX
的NSLog(@ “TOKEN_ENV == SANDBOX”);
#ENDIF
编辑: 修正上述的问题。
这里是苹果公司说
您可以在Xcode确定你是在由代码签名身份的选择哪种环境。如果您看到“iPhone开发人员:名字姓氏”证书/供应配置文件对,则表示您处于沙箱环境中。如果您看到“iPhone分发:公司名称”证书/供应配置文件对,则表示您处于生产环境中。
将预处理器宏添加到Apple LLVM 7.0下的目标生成设置 - 预处理。然后调试下添加类似:
isRunningInDevModeWithDevProfile=1
然后在你的.PCH,你可以做这样的事情:
// AZ - 01282016 - Determine which environment we are running in for APNS
# ifdef isRunningInDevModeWithDevProfile
# define isAPNSSandbox YES
#else
# define isAPNSSandbox NO
#endif
然后,你需要检查它在你的代码,你可以做到这一点:
NSString *ifAppIsRunningFromXcodeUsingNonReleaseProfile;
if (isAPNSSandbox) {
ifAppIsRunningFromXcodeUsingNonReleaseProfile = @"dev";
} else {
ifAppIsRunningFromXcodeUsingNonReleaseProfile = @"prod";
}
我们通过这个值回到我们的APNS服务器,以便它知道调用苹果的APNS时,该走的路。
我建议这样做的原因是,在这种情况下,如果您将预处理器宏未定义在非Debug目标中,那么当您尝试构建它时不会导致错误。
当然,有更好的形式的解决方案,但这是一个相当安全和快速的方式来获得这个功能和运行。
我阅读了上述所有答案,它们都是正确的,但不回答基本问题:“是设备令牌沙盒还是分发?”。
这是因为他们检测到构建配置,不是令牌质量。
解决这个问题,花了几天后,我到了straigt-正解:
测试你的令牌与真正的苹果推送通知服务器了。您可以使用简单的应用程序来与服务器通话,而您只需要对其进行配置。
我确实使用这个简单的应用程序“Easy APNs Provider”for macOS或其他。在MacOS上应用
https://itunes.apple.com/us/app/easy-apns-provider-push-notification/id989622350?mt=12
我的核心问题是,我不断收到生产令牌Debug和Release配置。
当您检测到问题时,您可能会使证书无效 100%确定它不会被损害。
如何添加即席我的“预处理宏未用于预编译头” – siva 2015-01-09 11:40:29
我可以知道这是否仍然有效吗?我注意到一些用户被标识为沙盒令牌,与App Store的发布版本相同。 – neobie 2016-06-16 14:54:02
为什么对于Ad Hoc,TOKEN_ENV_SANDBOX是0? 和调试,TOKEN_ENV_SANDBOX = 1? 是否有错误? – neobie 2016-06-16 16:31:34