确定应用是否与APNS沙盒或生产环境中的通信(Determine whether app is co

2019-06-23 15:02发布

我在我的应用程序设置推送通知。 我想,以确定是否我已经从APNS收到的设备令牌application:didRegisterForRemoteNotificationsWithDeviceToken:方法从沙箱或开发环境来了。 如果我能区分哪些环境初始化的道理,我就可以告诉我的服务器到环境发送推送通知。

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

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

理想情况下,我可以检查aps-environment权利(值是开发或生产)的代码,但我不知道这甚至有可能。

什么是决定你的应用程序是否与APNS沙盒或生产环境沟通的正确方法? 我假设服务器需要首先知道这一点。 请纠正我,如果这是假设是不正确。

编辑 :苹果的文档与APNS提供通信详细介绍与沙盒和生产通信之间的区别。 然而,该文件并没有就如何与注册令牌(从iOS客户端应用程序),并与服务器进行通信一致的信息。

Answer 1:

你可以阅读和检查的嵌入供应曲线。

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"];


Answer 2:

这是一个黑客,但其对工作XCode 8Swift 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
}


Answer 3:

  1. 该APNS环境是根据代码符号应享权利匹配您的验证码登录身份(后确定好这里 ) -同时确定您的构建配置可能会工作,也可能是假的,如果你再配上一个不匹配的权利是构建配置。

  2. 牢记这一点,使用DEBUG为平均数来确定您的权利,就可以(如果你发现DEBUG是棘手的,你可以在添加自己的链接器标志“苹果LLVM ......” - >“其他C标志” - >例如,“调试”),添加-DDEBUGGING然后使用:

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



Answer 4:

正如@ tcurdt的答复中提到,唯一安全的方法来确定是否使用沙箱或不是是检查配置文件。 这里是银行代码,使用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'


文章来源: Determine whether app is communicating with APNS sandbox or production environment