以前開発したiPad業務アプリの依頼主から、新しい要望が来ました。運用中の業務アプリから、小型プリンターRolto PT-10への印刷機能を追加してほしいとのことでした。強い要望だったのと、プリンターをプレゼントされたので、結局作りました。その要点を何回かに分けて紹介します。
話を聞いたとき、そのプリンターの存在は知りませんでした。同じように知らない人がいると思いますから、まずプリンターを紹介します。キングジムさんが開発した、50mm幅の感熱ロール紙を使う小型プリンターです。他の機器とのインターフェースはWiFiのみで、iPhoneアプリが無料で公開されています。そのアプリを使って、メモや写真や、ウェブブラウザの表示内容などを印刷できます。
感熱ロール紙ですから、印刷できるのはモノクロ2値のドットだけです。そのままだと中間調を印刷できないため、写真の印刷では誤差拡散によるディザ画像となります。
プリンターと同時に、iOS用のSDKも公開されたようで、そのことを知った依頼主が、何とか作れないかと相談に来たわけです。SDKは誰でもダウンロードできるようになっていました(検索で簡単に探せるので、リンクは付けません)。
SDKを調べると、次のようなことが判明しました。ドライバーはC++で開発され、Objective-C用にラッピングされていること。サンプルのアプリケーションは、すべてObjective-Cで書かれていました。また、注意点もありました。組み込むためには、C++のコンパイラーを呼び出す形にすること、コンパイラーを「libc++」から「libstdc++」に変更すること。
機能追加の対象となるiPad業務アプリの最終版は、すべてSwiftで書いています。つまり、追加する印刷機能もSwiftで書くことになります。当然、Objective-C用の作られたドライバーを、Swiftから呼び出す形です。少し工夫が必要となる分、誰かの参考になると思い、ここで紹介することにしました。
まずは、Objective-C用ドライバーを呼び出すための準備から。検索すると、非常に丁寧に解説しているウェブページを発見しました。Xcode上の設定操作まで含めて、かなり詳しく書かれています。
Objective-Cコードをswiftから呼び出す方法を解説
How to call Objective C code from Swift
私は少し遠回りしましたが、このとおり操作すると、問題なく使えるようになります。
開発環境のXcodeは6.0.1、RoltoのSDKは最新の1.01です。SDKに付いてきた、ヘッダーファイルの「RoltoPrint.h」とモジュールの「libRolto-PrintSDK.a」も、プロジェクトに読み込みました。SDKに付属の資料を見ながら、swiftのコードも少し書き始めていました。
上記サイトの説明どおりに操作したところ、いきなりのコンパイルエラーです。SDKの資料を見ながら速攻で書いた部分も多数のエラーが出ました。さらに、SDKに付属のヘッダーファイル「RoltoPrint.h」にもエラーが出ています。サイトの説明どおりに操作したつもりが、どこかで間違ったのかと思い、何度も確認しましたが、どうやら間違ってはいないようです。行き詰まってしまいました。
少し休憩して「RoltoPrint.h」を眺めていたら、アレレと気付きました。UI部品を使っているのに、そのimport文が付いてないのです。さっそく「RoltoPrint.h」に「#import <UIKit/UIKit.h>」を追加して、エラーは消えました。まさか提供されている側にエラーの原因があるなんて、予想もしませんでした。そのため気付くのが遅れ、数十分ほど無駄にしました。いやあ、思い込みは怖いですね。ちなみにこのエラーは、「ご意見・お問い合わせ」受付からのメールにて、キングジムさんに報告しました。先ほどですが。ははは(汗)。
今回エラーが出たのは、「RoltoPrint.h」を「Lib」フォルダ以外にもコピーしていたのも原因なのですが、エラーが出るようなヘッダーファイルじゃマズイでしょうという話です。
「RoltoPrint.h」のエラーが消えると、「RoltoPrint.h」のクラスが認識され、他のコードのコンパイルエラーも大きく減りました。当たり前ですね。コンパイルエラーが消えたことで、正常に接続されたことが確認できました。ここまでで、ようやく開発準備が整いました。
0 件のコメント:
コメントを投稿