iOS8 App Extensions
もしiOS8のカスタムキーボードが
ガジェットのSDKを搭載したら
カスタムキーボードをバーコードリーダーと連携させてみた
2014/10/18 Ver.1.0.0
iOS 8/Swift エンジニア勉強会@ヤフー - connpass
自己紹介
❖プログラム3年ぐらい
❖文系!
❖ iOS / 技術ネタ 初発表@niwatako
B2B向けiOSエンジニアです
モバイルソリューションの
iOS向けハード製品も出しています。
iPhone / iPod touch 装着型、バーコードリーダー
モバイルソリューションの
しかし課題が…
バーコードリーダー製品の課題
アプリへのSDK組み込みが必須。
・SDK搭載の専用アプリを開発するコスト・他社製品からの乗り換え時のSDK差替コスト・一般向けアプリや
Apple標準アプリにはSDKが組み込めない!
そこへiOS8が登場
iOS8 App Extensions
カスタムキーボード独自キーボードの作成が可能に
Before
ピッ(読み取り)
◯
×
SDK
+APP
APP
標準APP
×
SDKなし
SDKなしSDK対応済みアプリでのみ
利用可能
After!?
ピッ(読み取り)
◯
+
APP
APP
標準APP
◯
◯
キーボード
SDKどのアプリでも利用可能
SDKを組込んだキーボードを作れば 全てのアプリで
バーコードリーダーが使える??
でもそんなこと、本当にできるの?
やってみました。
Main subject
#もしガジェ
iOS8 のカスタムキーボードにガジェット(External Accessory)と連携する機能を埋め込むことは出来るのか?
まず カスタムキーボードについて
#もしガジェ
About カスタムキーボード
iOS8 App Extensions
カスタムキーボードは App Extensions の一部Extensionポイント 標準的なApp Extensions
Today(iOSおよびOS X)
通知センターの「今日(Today)」ビューに置いて、 表示内容を即座に更新し、あるいは簡単なタスクを 実行する (このExtensionをウィジェット(widget)と呼 ぶ)
Share(iOSおよびOS X) 情報投稿サイトに記事を投稿して他のユーザと共有する
Action(iOSとOS X、UIありとUIなし)
ホストアプリケーションで表示されるコンテンツを操作または表示する
Photo Editing(iOS)
「写真(Photos)」アプリケーションで写真や動画を編集する
Finder Sync(OS X)
ファイルの同期状態に関する情報をFinderに直接表示します。
ドキュメントプロバイダ (iOS、UIありと UIなし) ファイルのリポジトリにアクセスして管理します。
カスタムキーボード(iOS) iOSシステムキーボードに代わるカスタムキーボードを、あらゆるアプリケーションで使えるようにします。
How to develop?
App Extension の全体像
App Extension は、アプリの中に組み込む形で配布します。
App Extensionを同梱しているアプリのことを、
App Extensionに対して Containing App と呼びます。
Containing App と App Extension は、サンドボックスが別々で独立しています。
App Extension はアプリに同梱して配布 実行時は独立したサンドボックスを持つ
App Extension は、アプリの中に組み込む形で配布します。
App Extensionを同梱しているアプリのことを、
App Extensionに対して Containing App と呼びます。
Containing App と App Extension は、サンドボックスが別々で独立しています。
App Extension はアプリに同梱して配布 実行時は独立したサンドボックスを持つ
エクステンション
エクステンションをバンドルする親アプリ
エクステンションを呼び出して使うアプリ
同梱してAppStoreから配布
カスタムキーボードには 親になるアプリが必要。
用意するもの:既存プロジェクト
用意するもの:既存プロジェクト
続いてアプリに カスタムキーボードエクステンションを
追加します
カスタムキーボードのターゲットを追加
カスタムキーボードのターゲットを追加
カスタムキーボードのターゲットを追加
聞かれたらSchemeをActivate
追加されました!
追加されました!
実行してみます
Run!(Safariで)
※エクステンションは単体では起動できません。
エクステンションを呼び出すHostAppを起動し、
HostApp上でエクステンションを起動します。
Safariを選んで実行してみます。
なにも起きない!
キーボード見えない。。。
シミュレーターの 設定の問題でした
Toggle Software Keyboard
標準キーボードしか出ない!
キーボードは設定画面で追加しないと キーボードを切り替えた時に現れないようです!
デバッグ実行でキーボードを指定してるんだから直接起動したらいいのに。。。
設定でキーボードを追加
設定 > 一般 > キーボード > 他社製キーボード
から、作ったキーボードを有効化
現れた!
灰色のこれ
KeyboardViewController
デフォルトでキーボード切り替えボタンが生成されています。
KeyboardViewController
キーボードでできる事…基本はこれだけ!
入力文字列を渡すまでの間に、どのように文字列を生成するか、加工するかが、
開発者の腕の見せどころ!
続いてガジェットについて
#もしガジェ
About External Accessories
Communicating withan Accessory
ExternalAccessoryFramework
外部機器と接続するにはこのフレームワークが必須です!
Supported external accessory protocols
※ info.plist
さらに、接続する機器のID(Appleに認定された外部機器が持ってる)を指定すると、機器とアプリが連携できるようになります。
これで 特定の外部機器と連携が可能に
あとは機器によって必要なSDKや必要な制御があるのでそれに合わせて実装します。
一般に、外部装置を制御するSDKが機器の開発元から配布されています。
いざ融合
用意するもの:既存プロジェクト
カスタムキーボードのターゲットを追加
追加されました!
External Accessory 対応App ExtensionのKeyboardターゲットに対して
Frameworkの追加とPlistへの記入でAsReaderとの接続に対応
AsReader SDK
@protocol AsReaderManagerDelegate <NSObject> @optional // バーコードデータを通知するメソッド - (void)barcodeData:(NSString *)barcode; @end
@interface AsReaderManager : NSObject<RcpDelegate> // AsReaderManagerDelegateプロトコルを実装したクラスをデリゲートとして保持 @property (assign)id<AsReaderManagerDelegate> delegate; @end
AsReaderManagerDelegateプロトコル
AsReaderManagerクラス バーコードリーダーを制御してくれるクラス
読取りを通知するプロトコル
KeyboardViewController
@interface KeyboardViewController : UIInputViewController <AsReaderManagerDelegate> - (void)barcodeData:(NSString *)barcode; @end
キーボード側で、読み取ったバーコードの値を受け取るためのAsReaderManagerDelegateプロトコルを実装することを宣言
KeyboardViewControllerにSDKを実装
@implementation KeyboardViewController - (void)viewDidAppear:(BOOL)animated{ // SDKのインスタンス化とデリゲートのセット [[AsReaderManager sharedManager] setDelegate:self]; }
- (void)barcodeData:(NSString *)barcode{ // デリゲートで受け取ったバーコードデータをキーボード入力文字として利用 [self.textDocumentProxy insertText:barcode]; } @end
viewDidAppear でSDKをインスタンス化して自身をデリゲートにセット。
KeyboardViewControllerにSDKを実装
@implementation KeyboardViewController - (void)viewDidAppear:(BOOL)animated{ // SDKのインスタンス化とデリゲートのセット [[AsReaderManager sharedManager] setDelegate:self]; }
- (void)barcodeData:(NSString *)barcode{ // デリゲートで受け取ったバーコードデータをキーボード入力文字として利用 [self.textDocumentProxy insertText:barcode]; } @end
バーコードを読み取った時にデータを通知で受け取る。バーコードはそのままキーボード入力としてDocumentProxyに渡す。
うごかしてみた
だめだった
まだできる事がある
※ info.plist
RequestsOpenAccess YES
“フルアクセスを許可”が設定に登場
これでどうでしょう
できた
Safari上のWEB検索フォームで作ったキーボードを使ってみるとバーコード読取ができました!
できた
読み取ったバーコードで検索した結果と、本の表紙が一致!正しくバーコードを読めています
まとめ
❖ カスタムキーボードは簡単に作れた
❖ 出来る事は、文字列入力と1文字削除だけ
❖ ただし裏で結構いろんな処理が実行出来る
❖ Lightning接続した外部機器を制御するのも可
❖ キーボードでゲームしたり遠隔操作したり出来る…?
App Extensions プログラミングガイド
❖ https://developer.apple.com/jp/devcenter/ios/library/documentation/ExtensibilityPG.pdf
❖ 日本語!!
❖ カスタムキーボード (P.71~)
ご興味ある方はぜひこちらもご覧ください。
続編❖ 10/22(水) Potaitotips
❖ 11/01(土) Cocoa勉強会関西 ★AppStoreリリース版担当者登場
❖ 11/15(土) Cocoa勉強会関東
SDKを組み込んだキーボードがAppStoreに公開できるのか?など今後お話できればと思います。
(現在結果待ち…)
(宣伝)
ハードとソフトの融合で 業務の世界に革命を起こしたい
iOSエンジニア募集中
導入企業様、 対応アプリデベロッパー様募集中
ご清聴ありがとうございました