Я изучаю потенциальное приложение для клиента, и у меня возник вопрос, на который я не смог найти ответ. То, что я хотел бы сделать, это печатать автоматически, без отображения UIPrintInteractionController
. Важно отметить, что это не будет рабочим приложением. Я знаю, что в противном случае это может нарушить конфиденциальность пользователя, чтобы просто печатать без согласия пользователя, но опять же, это не будет общедоступным приложением в App Store. Я нашел одно приложение, которое, кажется, способно на это, Printer Pro
. Пользователю предлагается распечатать тестовую страницу, и страница печатается без появления UIPrintInteractionController
— это приложение находится в магазине, поэтому я предполагаю, что есть законный способ сделать это. Кто-нибудь знает, как это делается?
Печать iOS без появления UIPrintInteractionController
Ответы (2)
Насколько я знаю, в iOS7 невозможно печатать без вызова UIPrintInteractionController
и отображения системного диалога печати.
Однако в iOS8 теперь предусмотрена возможность печати напрямую на печать без отображения диалогового окна. Основная идея заключается в том, что вы получаете объект UIPrinter
и используете его в сочетании с новым методом - printToPrinter:completionHandler:
объекта UIPrintInteractionController
для печати без отображения диалогового окна.
Получить объект UIPrinter
для вашего принтера можно двумя способами.
Самый простой способ — использовать новый UIPrinterPickerController
. Но это покажет диалоговое окно и поэтому не соответствует вашим потребностям.
Альтернативой является создание принтера по его URL-адресу с использованием UIPrinter
метода + printerWithURL:
. Я не совсем понимаю, как получить этот URL-адрес, но он может содержаться на HTML-страницах администрирования принтера. И я считаю, что вы можете получить его программно, используя Bonjour API. Подробнее здесь:
Bonjour — это API-интерфейс обнаружения служб, который включает обнаружение принтеров IPP, которые являются протоколом, используемым AirPrint.
Что касается того, как приложение Printer Pro может печатать без диалога в iOS7, я предполагаю, что они взаимодействуют с принтером на очень низком уровне (например, необработанные сообщения HTTP и т. д.).
Выполните следующие действия, чтобы напечатать документы без запроса.
Первый поиск устройств с помощью приведенного ниже кода...
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
UIPrinterPickerController *printPicker = [UIPrinterPickerController printerPickerControllerWithInitiallySelectedPrinter:nil];
[printPicker presentAnimated:YES completionHandler:
^(UIPrinterPickerController *printerPicker, BOOL userDidSelect, NSError *error) {
if (userDidSelect) {
//User selected the item in the UIPrinterPickerController and got the printer details.
[UIPrinterPickerController printerPickerControllerWithInitiallySelectedPrinter:printerPicker.selectedPrinter];
// Here you will get the printer and printer details.ie,
// printerPicker.selectedPrinter, printerPicker.selectedPrinter.displayName, printerPicker.selectedPrinter.URL etc. So you can display the printer name in your label text or button title.
NSURL *printerURL = printerPicker.selectedPrinter.URL;
NSLog(@"printerURL--->%@",printerURL.absoluteString);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[printerURL absoluteString] forKey:@"printURL"];
[defaults synchronize];
}
}];
}
И распечатайте документы без запроса, используя приведенный ниже код...
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
UIPrinter *currentPrinterObj = [UIPrinter printerWithURL:[NSURL URLWithString:[defaults stringForKey:[defaults stringForKey:@"printURL"]]]];
UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
if(currentPrinterObj) {
[controller printToPrinter:currentPrinterObj completionHandler:^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
if(completed) {
} else {
NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
}
}];
}
}