我正在尝试为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?
答案 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