私はしばらくの間、モバイルアプリケーションを開発しています。iOS と Android で動作し、AIR アプリとしてデスクトップでも動作します。これは素晴らしいことで、とても興奮しています。しかし、先週、Web ブラウザー内で実行されるバージョンのアプリをエクスポートできない理由を尋ねられました。私はできると思っていて、それを調べてみると言いました。
しかし、なぜモバイル コードをデスクトップで実行したいのでしょうか?
いくつかの理由:
- コードの再利用の向上。これはすべての場合に意味があるわけではありませんが、多くの場合は意味があります。(これは自明だと思うので、詳しく説明しません。同意しない場合は、喜んで話しますが、この説明で詰まらせたくはありません。)
- より迅速で簡単なクライアント デモ。モバイル デバイスに apk や ipa をインストールする必要はなく、URL を送信するだけで済みます。
それで、私は何を見つけましたか?さて、私がこれまでに試したことから..それは..うまくいきません。というか、うまくできていない。
まず、すべての共有コード用に Flex Library プロジェクトを作成しました。次に、それを参照する 2 つのアプリケーション プロジェクトを作成しました。1 つはモバイル用、もう 1 つは Web 用です。モバイル プロジェクトは正常に動作しますが、Web プロジェクトは動作しません。これを機能させるためにこれまでに試したことは次のとおりです。
- Flash Builder が MobileSkin (およびその他のモバイル専用クラス) を認識できるように、web プロジェクトに mobilecomponents.swc および mobile.swc テーマを追加してみました。これにより、アプリをコンパイルできますが、起動するとすぐに UIComponent: 内でランタイム エラーがスローされます
VerifyError: Error #1014: Class flash.text::StageText could not be found
。このエラーについてはほとんど発見できませんでした。私が見つけた 1 つのヒント (--swf-version=13
コンパイラ オプションの追加) は機能しません。 - 条件付きコンパイルを使用して、スキン コンポーネントがどのクラスから継承されたか (MobileSkin または SparkSkin) を制御しようとしました。これは、機能するかどうかを確認するための簡単な実験でした。私はそれが嫌であり、生産ソリューションではないことを知っています. 私の考えでは、MobileSkin が実際に SparkSkin の最適化されたバージョンに過ぎないのであれば、私のスキンはどちらから継承しても問題ないはずです。これはすぐには機能しませんでした-アプリは特定のメソッドが欠落しているためにコンパイルされませんでした(例:layoutContents)。
- とにかく、MobileSkin はおそらく UIComponent の単なる軽量サブクラスであると考えて、すべてのスキンのスーパー クラスとして MobileSkin を UIComponent に置き換えてみました。このアプローチでは、最初にいくつかのコンパイラ エラーが発生しました (例: layoutContents メソッドがない、measuredDefaultWidth/measuredDefaultHeight プロパティがない、addChild と addElement など)。これらの問題が解決されると、アプリはコンパイルされましたが、UIComponent の「getState」メソッド内で実行時エラーが発生してクラッシュしました。(MobileSkin はこのメソッドをオーバーライドして、UIComponent のデフォルトの動作を妨げているようです。)
これまでのところ、これらのアプローチはどれもうまくいきませんでした...しかし、皆さんはどうですか? この問題に遭遇したことがありますか? あなたはそれを機能させることができましたか、それとも私が上で試した方法で私が行った明らかな見落としを見つけることができますか? できればよろしくお願いします。
更新: 問題が解決しました
上記の最初のルートで進歩を遂げることができました。私の Web プロジェクトに mobilecomponents.swc と mobile.swc テーマを追加することです。
この点で、Flash Builder が私を間違った方向に導いていたことが判明しました。「コードに結合」設定を使用してライブラリ プロジェクトにモバイル SWC を追加すると、次のようなコンパイラ警告が表示されます: The swc '/Applications/Adobe Flash Builder
4.6/sdks/4.6.0/frameworks/themes/Mobile/mobile.swc' にはスタイルのデフォルトがあり、ライブラリ パスにあります。つまり、依存関係はスタイルなしでリンクされます。これにより、出力 swc を使用するアプリケーションでスキンが欠落する可能性があります。swc は、external-library-path に配置する必要があります。
初めてこれを見て、リンケージタイプを「外部」に変更したところ、警告は消えました。次に、Web プロジェクトにモバイル SWC も追加し、リンケージ タイプを「コードに結合」に設定しました。Flash Builder はこのアプローチに満足しているように見えましたが、アプリケーションを実行すると奇妙なランタイム エラーが発生しました (前述のとおり)。
私の最初の試みが正しい方法だったことがわかりました。ライブラリ プロジェクトのリンケージ タイプを「コードにマージ」に設定し、Web プロジェクトから再リンクしないでください。Flash Builder から警告が表示されますが、警告は無視してください。現在、ほとんどの場合、物事はかなりうまくいっているようです! 調査すべき問題が 1 つまたは 2 つあります (例: リスト コンポーネントがスクロールしない) が、全体的にかなり有望に見えます!