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

时间:2012-04-13 19:12:02

标签: ios push-notification apple-push-notifications

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

我尝试使用DEBUG宏来确定这一点,但我已经看到了一些奇怪的行为,并且不相信它是100%正确的。

#ifdef DEBUG
BOOL isProd = YES;
#else
BOOL isProd = NO;
#endif

理想情况下,我可以在代码中检查aps-environment权利(值是开发或生产),但我不确定这是否可行。

确定您的应用是否正在与APNS沙箱或生产环境进行通信的正确方法是什么?我假设服务器首先需要知道这一点。如果假设不正确,请纠正我。

已编辑:Apple在Provider Communication with APNS上的文档详细说明了与沙箱进行通信和生产之间的区别。但是,该文档未提供有关如何与注册令牌(来自iOS客户端应用程序)以及与服务器通信一致的信息。

4 个答案:

答案 0 :(得分:17)

您可以阅读并检查嵌入式配置文件。

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 :(得分:7)

这是一个黑客攻击,但它正在使用XCode 8

处理Swift 3

我们基本上打开embedded.mobileprovision文件,将其转换为字符串,然后检查表明应用程序正在使用开发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
}

答案 2 :(得分:4)

  1. APNS环境是根据符合您的代码签名标识的代码签名确定的(好帖子here) - 虽然识别您的构建配置可能有效,但如果您匹配,它也可能是错误的使用不匹配的权利构建配置。

  2. 记住这一点,使用DEBUG作为确定权利的手段应该有效(如果发现DEBUG很棘手,可以在“Apple LLVM ...”下添加自己的链接器标志 - &gt; “其他C标志” - &gt;“调试”) 例如,添加-DDEBUGGING然后使用:

  3. #ifdef DEBUGGING BOOL isProd = YES; #else BOOL isProd = NO; #endif

答案 3 :(得分:0)

正如@tcurdt的回答中所提到的,确定是否使用沙箱的唯一安全方法是检查配置文件。这是Swift代码,使用TCMobileProvision:

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'