2

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

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

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

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

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

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

4

2 回答 2

3

编辑:我在我的博客上写了这个。当我详细介绍 Cordova 的各个部分如何工作时,这有点冗长。在这里查看。

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

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

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

DroidGap类 implements CordovaInterface,所以我们将使用它。您将调用 base.LoadUrl(Config.StartUrl);,此时将发生两件重要的事情:

  1. 您将能够CordovaWebView使用属性访问实例AppView
  2. 您还可以PluginManager使用AppView.PluginManager.

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

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

于 2013-01-05T17:47:11.423 回答