为多个iOS版本开发应用程序

问题描述 投票:0回答:5

我正在运行 iOS 5.1 的 iPhone 4 和运行 iOS 6.0 的 iPad 4 上测试应用程序。我环顾四周,惊讶地没有发现类似的问题:

1-我的应用程序有一些在 iOS 6.0 中已弃用的方法,因此我相信我必须构建一些 if/then 条件来使用 [[UIDevice currentDevice] systemVersion] 测试系统版本,然后使用版本适当的方法。这是最有效的方法吗?

2-我的理解是,只有一个目标,“项目”部署目标和“目标”部署目标具有相同的目的。我需要其中之一或两者都为 iOS 5.1,因为这是支持的最低 iOS 版本。令人困惑的是,如果目标是基于 iOS 5.1 构建的,那么它如何在 iOS 6.0 的 iPad4 上运行:

  • iPad OS 在运行之前是否会检查目标版本,或者只是尝试运行代码而碰巧 iOS 5.1 目标没有任何与 6.0 不兼容的代码?

  • 即使是这种情况,5.1 目标如何支持我构建的用于有条件替换已弃用方法的 6.0 方法?

非常感谢!

ios build deprecated target
5个回答
28
投票

已弃用的方法

如果您的目标是在这些方法被弃用之前发布的 iOS 版本,则可以使用已弃用的方法。但假设您的部署目标设置正确,您将不会收到任何编译器错误,除非那些已弃用的方法对于您的目标版本“始终”已弃用。换句话说,如果您在代码中看到弃用警告,则需要修复它们或检查部署目标设置是否正确。不要忽视他们!

Xcode 设置级别 您提到您可以在目标和项目级别定义部署目标设置。目标级别的 Xcode 构建设置将覆盖项目设置。因此,仅在其中一个级别定义部署目标,然后转到另一个级别并单击删除,这样就不会出现重复的值。如果您只有一个目标,那么在目标或项目级别定义它并不重要。

向后和向前兼容性

最后,有许多因素会影响向后和向前兼容性。有时会有新的 iOS 6 方法,例如

supportedInterfaceOrientations

,这些方法在旧版 iOS 版本上会被忽略。其他时候您需要添加显式检查:

如果您正在调用对象上的方法,并且该方法仅在 iOS 6 中引入,则需要添加如下所示的 
respondsToSelector:

检查:
  • // only available on iOS 6 if ([locationManager respondsToSelector:@selector(pausesLocationUpdatesAutomatically)]) { locationManager.pausesLocationUpdatesAutomatically = YES; }

    如果你想检查当前 iOS 版本上是否存在特定的类,你可以检查 +class 方法的返回值,如下所示:
    
    
    // Only available on iOS 6 if ([UICollectionView class]) { // ... } else { // class doesn't exist in this iOS version }
  • 如果您想检查某个特定函数是否可用,请对其执行一个简单的 if 语句:
    
    
    // Only available in iOS 6 if (ABAddressBookCreateWithOptions) { ABAddressBookCreateWithOptions(...); } else { ABAddressBookCreate(...); }
  • 最后,如果你想检查一个常量是否可用,请检查它的地址:
    
    
    // Only available in iOS 4 if (&UIApplicationProtectedDataDidBecomeAvailable) { // subscribe to notification }
  • 您的 Base SDK 设置应始终设置为“最新”。
    
    
    如果您遵循所有这些准则,您将能够解决大多数问题,而无需添加显式版本检查。检查 iOS 版本或设备 ID 非常脆弱,很可能会导致您的应用程序在未来版本中崩溃。你真的想避免它。

您可以使用

4
投票
来检测操作系统版本,这样就可以了。您可以使用
    respondsToSelector:
  1. 来查看存在哪些方法,使用

    NSClassFromString() != nil

     来查看类是否存在,以及在该方法不可用时回退,而不是检测操作系统版本。
    iOS 是向后兼容的,因此 iOS 6 可以很好地运行 iOS 5 应用程序。但是,如果您想使用 iOS 6 特定功能但仍支持 iOS 5.1,则必须: 

  2. 使用 6.0 SDK 进行编译,以便编译器了解新的 API
  3. 将您的目标版本设置为支持的最低版本,即。 5.1.任何高于该数字的系统都将运行该代码。任何更低的都不会尝试。

      使用 1. 中描述的方法之一确保每个设备执行操作系统支持的代码。
    • 我希望这是清楚的,如果您有更多问题,请不要犹豫
您必须做的是检测功能,而不是iOS版本,请查看此线程:



0
投票

iOS 向后兼容。如果您为 iOS 5.1 编译应用程序,它也可以在 iOS 6 上完美运行。无需重新实现已弃用的类。

但是,如果您将部署版本从 5.0 更改为 6.0,如果您使用已弃用的方法,Xcode 会向您显示警告

0
投票
如果您想使用仅在 iOS 6 中可用的方法,您可以使用此检查:

if ([self respondsToSelector:@selector(doSomething:)]) { [self doSomething]; }

© www.soinside.com 2019 - 2024. All rights reserved.