【问题标题】:PhoneGap plugins using MonoTouch and Mono for Android使用 MonoTouch 和 Mono for Android 的 PhoneGap 插件
【发布时间】:2013-01-05 02:51:14
【问题描述】:

我意识到 PhoneGap (Apache Cordova) 和 MonoTouch / Mono for Android 通常被视为竞争产品。但是,我想知道它们是否可以一起使用。

具体来说,PhoneGap plugins 可以使用 MonoTouch 和 Mono for Android 实现吗?

Developing a Plugin on iOS 涉及编写一个扩展 CDVPlugin 类的 Objective-C 类,将 *.h 和 *.m 文件添加到您的 Cordova-iOS 项目文件夹。 MonoTouch 能否以这种格式生成可与 PhoneGap/Cordova 项目集成的输出?

Developing a Plugin on Android 涉及扩展 CordovaPlugin 类并覆盖 execute 方法之一。该插件可以作为 Java 文件或作为其自己的 JAR 分发。 Mono for Android 能否以其中一种格式生成输出?看来Android Callable Wrappers 可能是解决方案。

那么,C# 可以用于在这些平台上编写 PhoneGap 插件吗?

更新: 解决此问题的更好方法是在 MonoTouch 和 Mono for Android 应用程序中使用 Cordova WebView。这可以有效地让您在 C# 中编写“插件”,而无需使用 PhoneGap 的插件系统。

【问题讨论】:

  • 我正在做类似的事情。您是否成功地为 Cordova API 创建了 Java 绑定 DLL?我无法让 CordovaInterface 界面映射并且无法使用 WebView 方法。另外,您能否详细说明如何以这种方式编写 C# 插件?

标签: cordova xamarin.ios xamarin.android phonegap-plugins


【解决方案1】:

编辑:I wrote this up on my blog。当我详细介绍 Cordova 的各个部分如何工作时,这有点冗长。在这里查看。

所以我过去一天一直在研究这个,这在 MonoDroid 中肯定是可能的。我不明白为什么同样的原则不适用于 MonoTouch。

你有在 PhoneGap 上运行的 MonoDroid 吗?好的。大概您已经为 Cordova 创建了 MonoDroid 绑定。

您会发现您可以访问CordovaPluginPluginEntryPluginManager 类。但是,有些事情不会像CordovaInterface 和一些采用org.json.* 类型的方法。我们可以使用 JNI 来解决这个问题,或者让它保持原样并让它工作。

DroidGap 基类实现了CordovaInterface,所以我们将使用它。你会打电话给base.LoadUrl(Config.StartUrl);,此时会发生两件重要的事情:

  1. 您将能够使用属性AppView 访问CordovaWebView 实例。
  2. 您还可以使用AppView.PluginManager 获取对PluginManager 的引用。

您需要创建自定义PluginEntry 子类和自定义CordovaPlugin 子类。如果您没有正确映射 CordovaInterface 类型和 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;
        }
    }

【讨论】:

    【解决方案2】:

    简答:No

    长答案隐藏在非常漂亮的Architecture documents 中。基本上,这些工具不支持创建任何可以调用单声道运行时并加载 C# 程序集的本机包。

    【讨论】:

    • 感谢您的链接。最后一部分,应用程序启动,似乎有最相关的信息。如果可以从 Java 手动调用 mono.MonoRuntimeProvider.attachInfo() 以将 Mono 运行时加载到进程中,那么这似乎是可能的,但需要进行相当多的底层研究。
    • 你对 iOS 的可行性有任何线索吗?即使这在 Android 上不可能,但在 iOS 上仍然是一个巨大的胜利。
    • 仅供参考,让它在 Android 中工作。同样的原则也适用于 iOS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多