2

PhoneGap (Apache Cordova) と MonoTouch / Mono for Android は競合製品と見なされることが多いと認識しています。しかし、それらが一緒に使用できるかどうかを知りたいです。

具体的には、MonoTouch と Mono for Android を使用してPhoneGap プラグインを実装できますか?

iOS でプラグインを開発するには、CDVPlugin クラスを拡張する Objective-C クラスを作成し、Cordova-iOS プロジェクト フォルダーに *.h および *.m ファイルを追加する必要があります。MonoTouch は、こ​​の形式で PhoneGap/Cordova プロジェクトと統合できる出力を生成できますか?

Android でプラグインを開発するには、CordovaPlugin クラスを拡張し、executeメソッドの 1 つをオーバーライドする必要があります。プラグインは、Java ファイルまたは独自の JAR として配布できます。Mono for Android は、これらの形式のいずれかで出力を生成できますか? Android Callable Wrappersが解決策になる可能性があるようです。

では、C# を使用して、これらのプラットフォームのいずれかで PhoneGap プラグインを作成できますか?

更新: この問題を解決するより良い方法は、MonoTouch および Mono for Android アプリ内でCordova WebViewを使用することです。これにより、PhoneGap のプラグイン システムを使用せずに、C# で「プラグイン」を効果的に記述できます。

4

2 に答える 2

3

編集:これをブログに書きました。Cordova の各部分がどのように機能するかを詳しく説明するので、少し長くなります。ここで確認してください。

それで、私はこれに取り組んできましたが、MonoDroid では確かに可能です。同じ原則が MonoTouch に適用されない理由がわかりません。

PhoneGap で MonoDroid を実行していますか? 良い。おそらく、Cordova 用の MonoDroid バインディングが作成されているはずです。

CordovaPluginPluginEntryおよびPluginManagerクラスにアクセスできることがわかります。ただし、いくつかのことは似CordovaInterfaceておらず、型を受け取るいくつかのメソッドがありorg.json.*ます。JNI を使用してこれを回避するか、そのままにして動作させることができます。

DroidGap基本クラスは を実装しCordovaInterfaceているので、それを使用します。を呼び出すと base.LoadUrl(Config.StartUrl);、次の 2 つの重要なことが起こります。

  1. CordovaWebViewプロパティを使用してインスタンスにアクセスできますAppView
  2. PluginManagerを使用して への参照を取得することもできますAppView.PluginManager

PluginEntryカスタムサブクラスとカスタム サブクラスを作成する必要がありますCordovaPluginCordovaInterfaceタイプと org.json.* パッケージが適切にマッピングされていない場合は、いくつかのショートカットを使用する必要があります。しかし、ここに私のために働いたものがあります。

    public override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        base.LoadUrl(Config.StartUrl);

        var plugin = new SamplePluginEntry("Sample");
        AppView.PluginManager.AddService(plugin);
        plugin.CreatePlugin(AppView, this);
    }

    public class SamplePluginEntry : PluginEntry
    {
        public SamplePluginEntry(String service) : base(service, "UNUSED.CLASSNAME", false)
        {
            /* we'll pass klass but we'll initialize the plugin ourselves so that Cordova 
             * doesn't try to find the class name that doesn't exist */
        }

        public CordovaPlugin CreatePlugin(CordovaWebView webView, DroidGap context)
        {
            var t = new SamplePlugin();
            t.InitializePlugin(webView, context);
            base.Plugin = t;
            return Plugin;
        }
    }

    public class SamplePlugin : CordovaPlugin
    {
        private CordovaWebView webView;
        private DroidGap context;

        public void InitializePlugin(CordovaWebView webView, DroidGap context)
        {
            this.webView = webView;
            this.context = context;
        }

        public override bool Execute(String action, String rawArgs, CallbackContext callbackContext)
        {
            /* This code will execute */
            return false;
        }
    }
于 2013-02-19T13:23:14.500 に答える
0

簡潔な答え:No

長い答えは、非常に優れたアーキテクチャ ドキュメントに隠されています。基本的に、このツールは、mono ランタイムを呼び出して C# アセンブリをロードできるネイティブ パッケージの作成をサポートしていません。

于 2013-01-05T17:47:11.423 に答える