Search code examples
objective-cprintingios8airprintuiprintinteractioncntrler

Skipping the Printing UI in IOS 8?


I could find some code for skipping the Printing UI and direct print through the Air Printer.But the code was incomplete. The code is below,

 UIPrinterPickerController *printPicker = [UIPrinterPickerController printerPickerControllerWithInitiallySelectedPrinter:self.savedPrinter];
    [printPicker presentAnimated:YES completionHandler:
        ^(UIPrinterPickerController *printerPicker, BOOL userDidSelect, NSError *error) {
        if (userDidSelect) {
            self.savedPrinter = printerPicker.selectedPrinter;
        }
    }];

In this code, self.savedPrinter mentioned. But how can i get the saved printer here. Please give me a complete answer or sample solution for this.


Solution

  • I got the solution for the question,which i asked above.Here is the solution,

    First of all, you have to set the UIPrinterPickerController delegate; ie UIPrinterPickerControllerDelegate in your class.The next step is select the printer from the UIPrinterPickerController. So you have to add some code in your method.Here I am using button action in my settings viewcontroller.

    - (IBAction)btnSettingsTapped:(id)sender
       {
          //Search printer method.
          [self searchForPrinters];
       }
    
         - (void) searchForPrinters
            {
               // For checking the ios version is greater than ios 7.Because skipping the   Printing UI is ony in ios8 and later.
              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.
    
            [btnSettingsPrint setTitle:printerPicker.selectedPrinter.displayName forState:UIControlStateNormal];
    
            NSURL *printerURL = printerPicker.selectedPrinter.URL;
    
            }
          }];
       }
    }
    

    If you want to set print functionality in any other view,You have to store the printer URL details and fetch the printer object from the stored url, in other views.

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[printerURL absoluteString] forKey:@"yourKey"];
    [defaults synchronize];
    

    Now you can tell your UIPrintInteractionController to print directly by calling printToPrinter(:completionHandler:) with the saved printer instead of using one of the present methods.You can call the method in your button action.

    //Printing item details passed to this method,
    -(void)printYourItem :(NSData*)data
    {
      if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)
       {
         NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
         UIPrinter *currentPrinterObj = [UIPrinter printerWithURL:[NSURL URLWithString:[userDefault stringForKey:@"yourKey"]]];
    
        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);
                   }
                }];
            }
       }
    }
    

    I think, this is help your needs.