ios:添加打印,但保持与ios 3的兼容性

时间:2010-11-28 16:22:44

标签: iphone printing backwards-compatibility

我正在尝试为ios应用添加打印功能。 虽然打印本身工作正常,该应用程序适用于ios> 4,我还没想出如何保持ios 3.1的兼容性......

我想问题是这样的:completionHandler:(UIPrintInteractionCompletionHandler)

  

您实现处理的UIPrintInteractionCompletionHandler类型的块   结束打印作业(例如,重置状态)和   处理打印中遇到的任何错误。

一旦我添加了块:

void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
};

该应用甚至不会在iOS 3.1上启动 可能是因为那里没有街区。

是的,我确保在iOS 3.1上启动时不会运行此代码...

if (([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.2) && ([UIPrintInteractionController isPrintingAvailable]))

所以我想知道是否有办法为iOS> 4.2提供打印支持,但是要让它在iOS 3.1上运行?

也许有办法使用方法而不是“块”? 或者如何才能在支持的iOS设备上提供正确的打印方式,并保持向后兼容iOS 3.1?

4 个答案:

答案 0 :(得分:6)

只需将 -weak_framework UIKit 添加到“其他链接器标志”下的项目设置中,并确保使用条件代码打印API。 条件代码应检查功能可用性,而不是OS版本:

    if (NSClassFromString(@"UIPrintInteractionController")){
    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
    ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
    };
}

将您的项目目标设置为iOS 3,您就可以了。

答案 1 :(得分:2)

检测AirPrint是否可用的最佳做法是使用NSClassFromString。如果您通常使用此方法,那么您始终可以知道所需的类是否可用,而无需硬编码哪些功能与哪个版本相对应。示例代码:

 Class printControllerClass = NSClassFromString(@"UIPrintInteractionController");
 if (printControllerClass) {
   [self setupCanPrintUI];
 } else {
   [self setupCannotPrintUI];
 }

这样你的应用程序仍然可以在以前的iOS版本上运行,但它无法从它们打印。

我已经能够使用这种技术并在iOS 3.0设备上运行它而没有任何块代码问题(基于^的东西)。在我的构建设置中,我将Base SDK设置为iOS 4.2,并将Deployment Target设置为iOS 3.0。

我在this blog post on printing in iOS末尾发布了一个示例Xcode项目。这是在iOS 3.0和另一台iOS 4.2设备上成功运行的项目。您可能必须更改info.plist中的包标识符以使代码签名适用于您,但这与打印内容无关。

答案 2 :(得分:1)

将项目设置中的部署目标设置为iOS 3.x.但是,将Base SDK设置为4.2。现在您可以使用4.2类和运行3.x的iPhone也可以安装您的应用程序。 请记住,当您在iPhone 3.x上使用4.2类时,应用程序将崩溃(因此请继续检查系统版本)。

答案 3 :(得分:0)

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare:@"3.2" options: NSNumericSearch];
  if (order == NSOrderedSame || order == NSOrderedDescending && [[UIDevice currentDevice]isMultitaskingSupported]) {
   // >4.2
  }
               else {
                       //< 4.2
                }

注意: 还将UIKit框架设置从“必需”更改为“弱”,这将有助于您在iOs上运行应用程序&lt; 4.2以及iOs&gt; = 4.2