【问题标题】:Does Apple allow to differentiate iPhone 6 from 6s through function calls?Apple 是否允许通过函数调用来区分 iPhone 6 和 6s?
【发布时间】:2021-04-22 20:48:14
【问题描述】:

是否可以通过函数调用获取iPhone型号并区分iPhone 6和6s系列?我想知道用户是 6s 型号还是 6 型号之前的型号,因为用户可以在我的应用程序中使用的功能会因用户使用的 iPhone 型号而异。

【问题讨论】:

标签: ios iphone


【解决方案1】:

当然可以。 Determining iOS device 类型既可能而且很常见。

这是使用已批准和公开的方法完成的,并且非常合法:您的应用不会因此而面临不被批准的风险。

然而,通过使用 respondsToSelector 来测试某个功能是否可以在用户设备上运行要比尝试枚举所有已知存在的可能设备更简洁、更安全。

Apple 不断添加设备,确保在您对此类测试进行硬编码时,您的代码不会在新设备上被破坏。

respondsToSelector 适用于将方法添加到较旧的类或仅存在于较新的设备上,但您还希望与旧版本和旧设备兼容的情况。例如:

if ([myObject respondsToSelector:@selector(fancyNewMethod)]) {
  [myObject fancyNewMethod]; // newer devices only
} else {
  [myObject doTheOldThing]; // older devices
}

【讨论】:

    【解决方案2】:

    您真的不应该依赖设备型号检测来了解某项功能是否可用。它不是面向未来的,即使 3D Touch 在 iPhone 6s / 6s Plus 上可用,用户也可以在设置应用中禁用它。

    您可以使用 UITraitCollection 检查 3D Touch 是否可用且处于活动状态:forceTouchCapability 属性设置为 UIForceTouchCapabilityAvailable。

    您可以在每个视图控制器和视图中访问traitCollection 属性。

    Apple 建议实现 traitCollectionDidChange: 方法,因为值可以动态更改(例如,用户可以离开您的应用,在设置中禁用/启用 3D Touch,然后返回您的应用)。

    - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
    {
        [super traitCollectionDidChange:previousTraitCollection];
    
        // forceTouchCapability is available starting with iOS 9.0
        if ([self.traitCollection respondsToSelector:@selector(forceTouchCapability)]) {
            if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
                // 3D Touch is available AND enabled
            } else {
                // 3D Touch is either unavailable or disabled
            }
        } else {
            // Before iOS 9.0
        }
    }
    

    如需完整参考,请参阅 Apple 的 Adopting 3D Touch 指南。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2016-11-12
      • 2010-10-10
      相关资源
      最近更新 更多