Печать iOS без появления UIPrintInteractionController

Я изучаю потенциальное приложение для клиента, и у меня возник вопрос, на который я не смог найти ответ. То, что я хотел бы сделать, это печатать автоматически, без отображения UIPrintInteractionController. Важно отметить, что это не будет рабочим приложением. Я знаю, что в противном случае это может нарушить конфиденциальность пользователя, чтобы просто печатать без согласия пользователя, но опять же, это не будет общедоступным приложением в App Store. Я нашел одно приложение, которое, кажется, способно на это, Printer Pro. Пользователю предлагается распечатать тестовую страницу, и страница печатается без появления UIPrintInteractionController — это приложение находится в магазине, поэтому я предполагаю, что есть законный способ сделать это. Кто-нибудь знает, как это делается?


person coder    schedule 30.10.2012    source источник
comment
Вы когда-нибудь получали ответ на этот вопрос?   -  person Kyle Clegg    schedule 14.06.2013
comment
К сожалению нет. Вот соответствующая ссылка stackoverflow.com/questions/5135781/   -  person coder    schedule 14.06.2013


Ответы (2)


Насколько я знаю, в iOS7 невозможно печатать без вызова UIPrintInteractionController и отображения системного диалога печати.

Однако в iOS8 теперь предусмотрена возможность печати напрямую на печать без отображения диалогового окна. Основная идея заключается в том, что вы получаете объект UIPrinter и используете его в сочетании с новым методом - printToPrinter:completionHandler: объекта UIPrintInteractionController для печати без отображения диалогового окна.

Получить объект UIPrinter для вашего принтера можно двумя способами.

Самый простой способ — использовать новый UIPrinterPickerController. Но это покажет диалоговое окно и поэтому не соответствует вашим потребностям.

Альтернативой является создание принтера по его URL-адресу с использованием UIPrinter метода + printerWithURL:. Я не совсем понимаю, как получить этот URL-адрес, но он может содержаться на HTML-страницах администрирования принтера. И я считаю, что вы можете получить его программно, используя Bonjour API. Подробнее здесь:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/NetServices/Introduction.html#//apple_ref/doc/uid/10000119i

Bonjour — это API-интерфейс обнаружения служб, который включает обнаружение принтеров IPP, которые являются протоколом, используемым AirPrint.

Что касается того, как приложение Printer Pro может печатать без диалога в iOS7, я предполагаю, что они взаимодействуют с принтером на очень низком уровне (например, необработанные сообщения HTTP и т. д.).

person jbtrask    schedule 08.10.2014
comment
Это отлично работает, по-видимому, за исключением принтеров, используемых чашками (например, в Ubuntu). Например, я не могу печатать ни на одном из моих двух принтеров, совместно используемых с Ubuntu/CUPS, через printToPrinter: в моем приложении, но мое приложение может печатать напрямую на моих двух принтерах Canon CP910. В то же время родное приложение «Фотографии» может печатать на двух моих принтерах, совместно используемых Ubuntu/CUPS. Так что не все работает с printToPrinter: - person xaphod; 19.07.2015
comment
Обновление: обходной путь, который я нашел, состоит в том, чтобы сохранить как URL-адрес принтера, так и сильную ссылку на UIPrinter. Если URL-адрес не может быть подключен, попробуйте UIPrinter напрямую. Вызывает тревогу, что это работает ... похоже на ошибку iOS 8, поскольку нет причин, по которым URL-адрес нельзя использовать AFAIK. - person xaphod; 19.07.2015

Выполните следующие действия, чтобы напечатать документы без запроса.

Первый поиск устройств с помощью приведенного ниже кода...

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);
            }
        }];
    }
}
person Victor Sebastian    schedule 15.11.2016