有没有办法确定设备令牌是沙盒还是分发?我们正在测试,应用程序有时使用开发证书签名,而其他应用程序使用临时证书(分发证书)签名。这是因为我们将应用程序传递给提供的 100 个临时测试设备中的一些设备,并且还在我们的设备上构建开发签名应用程序。因为发送推送通知需要我们选择适当的推送服务器和 pem 文件,所以如果能够确定令牌是沙盒还是分发,以适当的方式发送通知,以便推送通知成功,那就太好了。我们有时必须使用分发配置文件来签署我们的应用程序,因此测试推送通知系统需要我们正确传递这些通知。
4 回答
- 打开项目构建设置
- 转到预处理设置
- 在“Preprocessor macros not used in precompiled headers”下(假设您没有在 .pch 文件中分支代码),在 Release 下添加 TOKEN_ENV_SANDBOX=0,在 Debug 和 Ad Hoc 下添加 TOKEN_ENV_SANDBOX=1。
- 在您的代码中,只要使用编译器指令
#if !TOKEN_ENV_SANDBOX
NSLog(@"TOKEN_ENV==PRODUCTION");
#万一#if TOKEN_ENV_SANDBOX
NSLog(@"TOKEN_ENV==SANDBOX");
#万一
编辑:更正了上面的一个问题。
这是苹果不得不说的
您可以通过选择代码签名身份来确定您在 Xcode 中所处的环境。如果您看到“iPhone Developer: Firstname Lastname”证书/配置配置文件对,则您处于沙盒环境中。如果您看到“iPhone Distribution: Companyname”证书/供应配置文件对,则说明您处于生产环境中。
在 Apple LLVM 7.0 - Preprocessing 下将 Preprocessor Macro 添加到 Target 的 Build Settings。然后在调试下添加类似:
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 服务器,以便它知道在调用 Apple 的 APNS 时要走哪条路径。
我建议这样做的原因是,在这种情况下,如果您在非调试目标中未定义预处理器宏,则在您尝试构建它时不会导致错误。
当然,有更好形式的解决方案,但这是启动和运行此功能的一种相当安全且快速的方法。
我阅读了上面的所有答案,它们都是正确的,但没有回答基本问题:“是设备令牌沙箱还是分发? ”。
这是因为它们检测的是构建配置,而不是令牌质量。
在解决了这个问题几天后,我得到了直接的解决方案:
测试您使用真正的 Apple Push Notification Server 获得的令牌。您可以使用与服务器对话的简单应用程序,您只需要对其进行配置。
我确实将这个简单的应用程序“Easy APNs Provider”用于 macOS 或其他任何应用程序。
https://itunes.apple.com/us/app/easy-apns-provider-push-notification/id989622350?mt=12
我在 macOS 应用程序中的核心问题是我不断在调试和发布配置中获取生产令牌。
当您检测到问题所在时,您可以使证书无效以 100% 确保它不会受到损害。