确定设备令牌是沙箱还是分发

时间:2011-05-04 07:04:19

标签: apple-push-notifications devicetoken

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

4 个答案:

答案 0 :(得分:8)

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

    #if!TOKEN_ENV_SANDBOX
      的NSLog(@ “TOKEN_ENV == PRODUCTION”);
      #ENDIF

         

    #if TOKEN_ENV_SANDBOX
      的NSLog(@ “TOKEN_ENV == SANDBOX”);
      #ENDIF

    编辑: 纠正了上述问题。

答案 1 :(得分:1)

这就是Apple必须说的话

  

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

答案 2 :(得分:0)

将预处理器宏添加到Apple LLVM 7.0下的Target目标构建设置 - 预处理。然后在Debug下添加如下内容:

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时要采取的路径。

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

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

答案 3 :(得分:0)

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

这是因为他们检测到构建配置,不是令牌质量

在花了几天时间解决这个问题之后,我找到了直截了当的解决方案:

使用真正的Apple推送通知服务器测试令牌。您可以使用与服务器通信的简单应用程序,只需配置它即可。

我确实使用了这个简单的应用程序" Easy APNs Provider"对于macOS或其他任何内容。

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

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

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