8

有没有办法确定设备令牌是沙盒还是分发?我们正在测试,应用程序有时使用开发证书签名,而其他应用程序使用临时证书(分发证书)签名。这是因为我们将应用程序传递给提供的 100 个临时测试设备中的一些设备,并且还在我们的设备上构建开发签名应用程序。因为发送推送通知需要我们选择适当的推送服务器和 pem 文件,所以如果能够确定令牌是沙盒还是分发,以适当的方式发送通知,以便推送通知成功,那就太好了。我们有时必须使用分发配置文件来签署我们的应用程序,因此测试推送通知系统需要我们正确传递这些通知。

4

4 回答 4

8
  1. 打开项目构建设置
  2. 转到预处理设置
  3. 在“Preprocessor macros not used in precompiled headers”下(假设您没有在 .pch 文件中分支代码),在 Release 下添加 TOKEN_ENV_SANDBOX=0,在 Debug 和 Ad Hoc 下添加 TOKEN_ENV_SANDBOX=1。
  4. 在您的代码中,只要使用编译器指令

#if !TOKEN_ENV_SANDBOX
NSLog(@"TOKEN_ENV==PRODUCTION");
#万一

#if TOKEN_ENV_SANDBOX
NSLog(@"TOKEN_ENV==SANDBOX");
#万一

编辑:更正了上面的一个问题。

于 2011-05-14T18:39:50.820 回答
1

这是苹果不得不说的

您可以通过选择代码签名身份来确定您在 Xcode 中所处的环境。如果您看到“iPhone Developer: Firstname Lastname”证书/配置配置文件对,则您处于沙盒环境中。如果您看到“iPhone Distribution: Companyname”证书/供应配置文件对,则说明您处于生产环境中。

于 2013-02-21T03:36:10.777 回答
0

在 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 时要走哪条路径。

我建议这样做的原因是,在这种情况下,如果您在非调试目标中未定义预处理器宏,则在您尝试构建它时不会导致错误。

当然,有更好形式的解决方案,但这是启动和运行此功能的一种相当安全且快速的方法。

于 2016-01-28T18:01:54.377 回答
0

我阅读了上面的所有答案,它们都是正确的,但没有回答基本问题:“是设备令牌沙箱还是分发? ”。

这是因为它们检测的是构建配置,而不是令牌质量

在解决了这个问题几天后,我得到了直接的解决方案:

测试您使用真正的 Apple Push Notification Server 获得的令牌。您可以使用与服务器对话的简单应用程序,您只需要对其进行配置。

我确实将这个简单的应用程序“Easy APNs Provider”用于 macOS 或其他任何应用程序。

https://itunes.apple.com/us/app/easy-apns-provider-push-notification/id989622350?mt=12

我在 macOS 应用程序中的核心问题是我不断在调试和发布配置中获取生产令牌。

当您检测到问题所在时,您可以使证书无效以 100% 确保它不会受到损害。

于 2017-02-05T11:09:46.450 回答