Help us understand the problem. What is going on with this article?

[Swift]UIPrinterPickerControllerを使ってAirPrint印刷する方法

More than 3 years have passed since last update.

iOS8からUIPrinterPickerControllerというクラスが追加され、AirPrintの方法がさらにやりやすくなりました。
今回はUIPrinterPickerControllerを使って、AirPrintでiPhoneから印刷する方法をまとめてみたいと思います。

実行環境

  • Xcode7.3
  • Swift2.2
  • iOS8以上

Printer Simulator.appのダウンロード

開発にあたり、AirPrint対応のプリンターがなければいけないかとおもいきや、Appleからプリンターのシュミレーターアプリが提供されています。
Printer Simulator.appです
これを使えば、実際にプリンターがなくても、AirPrintを使った機能の開発が進められます。

Printer Simulator.appはHardware IO Toolsとして提供されています。

https://developer.apple.com/downloads/?name=for%20Xcode
へアクセスをして Hardware IO Tools for Xcode 7.3を選択し、Hardware_IO_Tools_for_Xcode_7.3.dmgをダウンロードします。

このdmgファイルの中に、Printer Simulator.appが入っています。

せっかくなので、Xcodeのメニュー Xcode > open Developer Tool でPrinter Simulator.appを選択できるようにしましょう。

/Applications/Xcode.app/Contents/Applications
へアクセスしてHardware_IO_Tools_for_Xcode_7.3.dmgの中にあるPrinter Simulator.appのコピーを置きます。

スクリーンショット 2016-05-09 18.09.00.png

するとXcodeのメニュー Xcode > open Developer Tool でPrinter Simulator.appが選択可能になります。

スクリーンショット 2016-05-09 18.13.15.png


UIPrinterPickerControllerを使ったAirPrint実装方法

さて、コードの話に移りましょう。
予めPrinter Simulator.appをダブルクリックで起動しておきます。

プロジェクトを新規で作成し、適当にボタンを配置して、@IBAction func startPrint(sender: UIButton)を作成します。

//ViewController.swift
    @IBAction func startPrint(sender: UIButton) {
        self.showPrinterPicker()
    }


    func showPrinterPicker() {
        // UIPrinterPickerControllerのインスタンス化
        let printerPicker = UIPrinterPickerController(initiallySelectedPrinter: nil)

        // UIPrinterPickerControllerをモーダル表示する
        printerPicker.presentAnimated(true, completionHandler:
            {
            [unowned self] printerPickerController, userDidSelect, error in
            if (error != nil) {
                // エラー
                print("Error : \(error)")
            } else {
                // 選択したUIPrinterを取得する
                if let printer: UIPrinter = printerPickerController.selectedPrinter {
                    print("Printer's URL : \(printer.URL)")
                    self.printToPrinter(printer)
                } else {
                    print("Printer is not selected")
                }
            }
            }
        )
    }

        func printToPrinter(printer: UIPrinter) {
        // 印刷してみる
        let printIntaractionController = UIPrintInteractionController.sharedPrintController()
        let info = UIPrintInfo(dictionary: nil)
        info.jobName = "Sample Print"
        info.orientation = .Portrait
        printIntaractionController.printInfo = info
        //印刷する内容
        printIntaractionController.printingItem = UIImage(named: "sample.jpg")
        printIntaractionController.printToPrinter(printer, completionHandler: {
            controller, completed, error in
        })
    }

解説

まずUIPrinterPickerControllerをインスタンス化します。
+ printerPickerControllerWithInitiallySelectedPrinter:メソッドを実行します。引数のinitiallySelectedPrinterは予めプリンターを選択する場合は指定します。とくに指定がなければnilにします。nilにすることで印刷できるプリンターを全てピッカーで表示させることができます。

次に- presentAnimated:completionHandler:を実行して、印刷可能なプリンターのリストを表示するピッカーを表示します。第一引数がアニメーションをするかどうか、第二引数がピッカーが非表示になった場合に行う処理を指定できます。今回はprintToPrinter(_:)メソッドを実行して印刷を実行しています。

実行

これを実行すると使用可能なプリンターリストがピッカーで表示されます。
セルをタップしてプリンターを選択すると、印刷されます。

B89z1a9135.gif

Printer Simulator.appを起動していれば、印刷結果がPDFで表示されます。

AirPrinterSample.png

ピッカーを表示せずに印刷する方法

いつもピッカーを表示してプリンターを表示するのが煩わしい場合があります。
プリンター選択のピッカーを表示しなくてもプリントすることができます。
ただし、予めプリンターのippsURLを取得しておく必要があります。

//ViewController.swift
    func showPrinterPicker() {
        // UIPrinterPickerControllerのインスタンス化
        let printerPicker = UIPrinterPickerController(initiallySelectedPrinter: UIPrinter(URL: NSURL(string: "ipps://xxxxxxx")!)) //->プリンターのippsURLを指定!

        printerPicker.delegate = self

        // UIPrinterPickerControllerをモーダル表示する
        printerPicker.presentAnimated(false, completionHandler://->animationをfalseに指定して画面表示
            {
            [unowned self] printerPickerController, userDidSelect, error in
            if (error != nil) {
                // エラー
                print("Error : \(error)")
            } else {
                // 選択したUIPrinterを取得する
                if let printer: UIPrinter = printerPickerController.selectedPrinter {
                    print("Printer'displayname : \(printer.displayName)")
                    print("Printer's URL : \(printer.URL)")//->ここでプリンターのURLが取得できる
                    self.printToPrinter(printer)
                } else {
                    print("Printer is not selected")
                }
            }
            }
        )

        printerPicker.dismissAnimated(false)//->すぐさまanimationをfalseで閉じる
    }




let printerPicker = UIPrinterPickerController(initiallySelectedPrinter: UIPrinter(URL: NSURL(string: "ipps://xxxxxxxxx")!))
でUIPrinterPickerControllerインスタンス生成時にinitiallySelectedPrinterにUIPrinterのURLを指定すれば、そのプリンターを選択した状態でインスタンスを生成することができます。

あとは、- presentAnimated:completionHandler:でアニメーションをfalseにして表示して、
すぐにprinterPicker.dismissAnimated(false)UIPrinterPickerControllerインスタンスを非表示にします。

これで指定プリンターにピッカー非表示でプリントができます。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした