AIRアプリでUIDocumentInteractionControllerを使ってみる


AIRではiOS/Android等のクロスプラットフォームアプリ開発が可能ですが、
AIR単体では使えない機能(各OS 独自の機能や、BluetoothやVibrationなど)がありました。
しかし、AIR3から追加されたネイティブ拡張(AIR Native Extensions、以下ANE)という機能を使うと、
ネイティブコードと連携した実装が可能となりましたので、今回の記事ではこのANEを使って、
iOSのUIDocumentInteractionControllerをAIRアプリ上で利用して、
epubファイルをiBooksで開いてみたいと思います。

ネイティブ拡張関数

まずネイティブコードですが、UIコンポーネントを表示する時は、
UIWindow>UIViewControllerを取得してそのViewに表示することになります。
(AIRの画面の上に乗っかる感じ)

FREObject OpenIbooks(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {

//引数からファイル名を取得
uint32_t fileNameLength;
const uint8_t* fileName;
FREGetObjectAsUTF8(argv[0], &fileNameLength, &fileName);
NSString *fileNameString = [NSString stringWithUTF8String:(const char*)fileName];
//
//assetsフォルダの.epub形式の指定したファイル名のパスを登録
NSString *epubFileName= [[NSBundle mainBundle] pathForResource:fileNameString ofType:@”epub” inDirectory:@”assets”];
NSURL *url = [NSURL fileURLWithPath:epubFileName];
//
//指定したパスでUIDocumentInteractionControllerを作成
UIDocumentInteractionController *docController = [UIDocumentInteractionController interactionControllerWithURL:url];
//
//表示するViewControllerを取得
UIWindow *keyWindow= [[UIApplication sharedApplication] keyWindow];
UIViewController *mainController = [keyWindow rootViewController];
//
//UIDocumentInteractionControllerをViewに表示
CGRect rectDocC = CGRectMake(0, 0, 0, 0);
BOOL isValid = [docController presentOptionsMenuFromRect:rectDocC inView:mainController.view animated:YES];
//
//成功・失敗をAS側に返す
NSString *result;
if(isValid){
result = @”SUCCESS”;
}else{
result = @”FAULT”;
}
//
const char* str = [result UTF8String];
FREObject retStr;
FRENewObjectFromUTF8(strlen(str)+1, (const uint8_t *)str, &retStr);
return retStr;
}

UIDocumentInteractionController以外のUIコンポーネントを表示する際は、
以下のようになります。

UISwitch* switchCtrl =[[UISwitch alloc] init];
switchCtrl.center = CGPointMake(100, 300);
[mainController.view addSubview:switchCtrl];

UIKitフレームワーク以外にも、MapKitフレームワークなども同様に表示できますが、
AIRはデフォルトでMapKitにはリンクしてくれないので、別途プラットフォームオプションファイル(.xml)を
用意して、ANEのパッケージング時のコマンドで-platformoptionsを利用して、
ANEのパッケージに含めてあげる必要があります。
[参考:iOS プラットフォームオプション(platform.xml)ファイル]

AS拡張クラス

ライブラリプロジェクトから作成する拡張クラスについては、
以下のように、開くEpubファイル名を渡してます。

public function openIbooks(fileName:String):String{
var returnStr:String;
try{
returnStr = context.call(“OpenIbooks”,fileName) as String;
}catch(error:Error){
returnStr = error.message;
}
return returnStr;
}

AIRアプリ

パッケージングしたANEをプロジェクトに追加し、アプリ上からEpubファイルを指定して、
ANE経由でiBooksを開いてみます。

private var extension:EpubANELib = new EpubANELib();
protected function btn_clickHandler(event:MouseEvent):void
{
result.text = extension.openIbooks(“test01”);
}

tes01.epubはassetsフォルダ直下においてます。