AIR for iOSのStageWebView

212 views
Skip to first unread message

内田 大輔

unread,
May 23, 2011, 12:16:54 AM5/23/11
to af...@googlegroups.com
いつも勉強させていただいております。

早速AIR for iOS機能を用いて、Packager for iPhoneからの追加機能であるStageWebViewを使ったアプリを作っております。
そこで、アプリのパブリッシュ時に同梱したhtmlファイルを読み込ませたいのですが、
ファイルのパスが見つからず困っております。

そもそもAIR for iOSのStageWebViewでfile:によるローカルファイルの読み込みができないのかも含め、
ご教授いただけると助かります。


以上、宜しくお願いします。

吉岡梅

unread,
May 23, 2011, 1:20:44 AM5/23/11
to af...@googlegroups.com
吉岡です。

そうなんですよね。モバイル向けのAIRアプリでは、アプリケーションディレクトリ([含めるファイル]に
指定したファイルが格納されている場所)内のファイルのパスは、URL表記(Fileクラスのurlプロパティで
取得できる「app:/index.html」等)では取得できるのですが、ファイル表記(FileクラスのnativePathプロパティで
取得できる具体的なパス)は取得できません。

でも、StageWebViewのloadURLメソッドにはファイル表記のパスが必要なんですよね。

このため、StageWebViewに指定するアドレスが分からない状態になってしまいます。
そこで、いったんファイル表記のパスが取得できる一時ディレクトリや保存領域ディレクトリ等に、
持ち込んだhtmlファイル等をコピーしてしましまいしょう。

コピーしたファイルの「ファイル表記」を使ってアクセスすれば、持ち込んだHTMLコンテンツを表示する事ができます。

コードにするとこんな感じです。
「html」フォルダ内にhtmlファイル一式を用意して、[含めるファイル]にフォルダごと指定した場合を想定しています。

/*表示時*/
swv = new StageWebView();
swv.viewPort = rect;
swv.stage = stage;

//「html」フォルダを一時ディレクトリに丸ごとコピー
var aseetFolder:File = new File("app:/html");
var tmpFolder:File = File.createTempDirectory();
aseetFolder.copyTo(tmpFolder.resolvePath("html"));

//コピーしたフォルダ内の「index.html」をSWVで表示
swv.loadURL("file:/" + tmpFolder.resolvePath("html/index.html").nativePath);

/*消去時*/
//SWVお片付け
swv.stage=null;
swv.dispose();
swv=null;
//一時フォルダお片付け
tmpFolder.deleteDirectory(true);

作成した一時ディレクトリやコピーしたHTML等は、必要がなくなった時点で削除しても
良いですし、初回起動時に持ち込んだHTMLコンテンツを保存領域に展開し、以降はそこを参照する、
等の運用をしても良いと思います(圧縮して持ち込んで、展開してもいいですね)。

なんだか無駄なコピーを作っている気もしますが、現状はこの方法がベターなようです。

ではでは。

2011年5月23日13:16 内田 大輔 <d.uch...@gmail.com>:

> --
> /**
> *
> * AIR/Flash for Android
> * http://groups.google.co.jp/group/AF4A
> *
> * To post to this group, send email to
> * AF...@googlegroups.com
> *
> * To unsubscribe from this group, send email to
> * AF4A+uns...@googlegroups.com
> *
> */
>

--

シルエロ:吉岡 梅
umeyo...@gmail.com
yosh...@ciruelo.jp

内田 大輔

unread,
May 23, 2011, 2:39:02 AM5/23/11
to af...@googlegroups.com
吉岡さま

早速下記サンプルを参考に実装してみたところバッチリ読み込みできました!
AIR for Androidの場合は、

webview.loadURL("file:///android_asset/html/index.html");

のような要領でできていたので、iOSではどうなのかと苦慮していたのでとてもスッキリです。
助かりました。感謝致します。ありがとうございました。

吉岡梅

unread,
May 23, 2011, 5:43:14 AM5/23/11
to af...@googlegroups.com
吉岡です。

> AIR for Androidの場合は、
>
> webview.loadURL("file:///android_asset/html/index.html");
>
> のような要領でできていたので、iOSではどうなのかと苦慮していたのでとてもスッキリです。

ほうほう!
私はてっきりセキュリティ的な観点から、ブラウザから見えなくしてるのかな?と思ってたのですが、そうでもないようですね。
と、いうわけでちょっと調べてみました。

iOSでも下記のような感じでいけました。

var appID:String = "htmlTest";
var appPath:String =
File.applicationStorageDirectory.nativePath.replace(/Library.*/,"") +
appID + ".app"
var htmlPath:String = appPath + "/html/index.html";

stageWebView.loadURL("file:/" + htmlPath);

iOSでは、アプリをインストールする際に、「var/mobile/Applications/[内部的なID?]/[アプリ名].app/」にインストールするようです。
この場所を、File.applicationStorageDirectoryのパスから判別し、「htmlTest」という名前のアプリの「html/index.html」へのパスを取得してみました。

リリースするアプリでも動くかどうかは未検証ですが、コピーしなくてもいけそうですね。

ではでは。

2011年5月23日15:39 内田 大輔 <d.uch...@gmail.com>:

内田 大輔

unread,
May 23, 2011, 8:32:42 PM5/23/11
to af...@googlegroups.com
おぉ~!
確かに下記のパスでもアクセスできました!有用な情報ありがとうございます。

社内アプリとして使う想定だったので、これでも十分実用的です。

m0ney

unread,
Mar 28, 2013, 1:56:15 AM3/28/13
to AF...@googlegroups.com, af...@googlegroups.com
var stageWebView:StageWebView = new StageWebView();
stageWebView.viewPort = new Rectangle(0,0,640,960);
stageWebView.stage = stage;
 
var url:String = new File(File.applicationDirectory.resolvePath("index.html").nativePath).url;
stageWebView.loadURL(url);
このコードならPCでデバッグできますので、一番楽ではないかと思います。
 
2011年5月23日月曜日 13時16分54秒 UTC+9 Daisuke Uchida:
Reply all
Reply to author
Forward
0 new messages