使用Monotouch绑定Cordova遇到问题(NSInvalidArgumentException)

3
我正在开发一个应用程序,将结合使用MonoTouch(Xamarin.iOS)和Cordova(PhoneGap)。用户界面主要使用Cordova构建,而我们的业务逻辑主要是用MonoTouch编写的。
我找到了一篇描述这种情况的指南,所以我知道这是可能的,作者已经在monotouch-bindings项目的分支中添加了Cordova绑定
不幸的是,当我尝试使用这些绑定创建单视图项目时,我几乎立即遇到了问题。我使用提供的Cordova库中的makefile构建了此dll,并将其添加到我的测试应用程序中简单视图控制器的ViewDidLoad方法中,该应用程序名为MyViewController。以下是我的源代码。
public class MyViewController : UIViewController
{
    private CDVViewController cdv;

    public MyViewController()
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        View.Frame = UIScreen.MainScreen.Bounds;
        View.BackgroundColor = UIColor.White;
        View.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;

        cdv = new CDVViewController();

        RectangleF rect = new RectangleF (0, 0, 320, 480);

        CDV.View.Frame = rect;

        View.AddSubview(cdv.View);
    }
}

当我构建CDVViewController时,出现以下异常:

MonoTouch.Foundation.MonoTouchException: Objective-C exception thrown.  Name: NSInvalidArgumentException Reason: -[__NSCFArray dictionaryWithLowercaseKeys]: unrecognized selector sent to instance 0xc892680
  at at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:IntPtr_objc_msgSend (intptr,intptr)
  at CordovaIOS.CDVViewController..ctor () [0x00000] in <filename unknown>:0
  at <Project_name>.MyViewController.ViewDidLoad () [0x00043] in /Users/jstarke/tmp/<Project_name>/MyViewController.cs:32
  at at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend  (intptr,intptr)
  at MonoTouch.UIKit.UIWindow.MakeKeyAndVisible () [0x00010] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIWindow.g.cs:126
  at <Project_name>.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication app, MonoTouch.Foundation.NSDictionary options) [0x00031] in /Users/jstarke/tmp/<Project_name>/AppDelegate.cs:23
  at at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
  at <Project_name>.Application.Main (System.String[] args) [0x00000] in /Users/jstarke/tmp/<Project_name>/Main.cs:17

目前我的研究显示这几乎肯定是一个绑定问题。我对绑定还不是很了解,但我正在努力学习,并且非常感谢任何帮助或建议。再次强调,我正在使用的绑定可以在此处找到:https://github.com/sblom/monotouch-bindings/tree/master/Cordova/Binding

2个回答

2

谢谢Rolf。我看了那份文档,“CordovaLib子项目”一节,第14点,就像你提到的那个帖子。 我有点困惑。这些指令似乎非常特定于制作一个Objective C子项目。你明白我在尝试为此创建一个MonoTouch绑定吗?我检查了文档中引用的框架是否在LinkWith Frameworks条款中,并且它们似乎完好无损。 - Jamie Starke
@JamieStarke:我明白你正在尝试为此创建一个Xamarin.iOS绑定,我的观点是其他人(使用纯Objective-C)也遇到了同样的问题,因此这不是Xamarin.iOS特有的。但是,您确实需要将Objective-C指令“移植”到在Xamarin.iOS绑定中执行它的等效方式。也许首先尝试制作一个完整的Objective-C示例,然后再从那里开始? - Rolf Bjarne Kvinge
你有没有想过这些绑定需要多具体?当我查看上述的绑定时,我发现一些引用的方法和属性在当前的标头中已经不存在了。也许这不是整个问题的原因,但它可能会加剧问题的发生? - Jamie Starke
@JamieStarke:我认为你也需要与PhoneGap链接(这是找不到的方法:https://github.com/lopper/PhoneGap_Cordova/blob/1bf3688902c24c582986ce2ff51908aa6c2342b8/PhoneGapLib/Classes/NSDictionary%2BLowercaseKeys.m) - Rolf Bjarne Kvinge
谢谢Rolf,我想我已经解决了问题。 我曾拿到Cordova 2.5的副本,而绑定显然是针对cordova孵化器<1.9版本进行的。 当我尝试运行它们的make时,它会从存储库中拉下最新版本,并构建针对该版本进行的,但自那以后标头似乎已更改,例如不再有supportsOrientation( https://github.com/apache/incubator-cordova-ios/blob/master/CordovaLib/Classes/CDVViewController.h https://github.com/sblom/monotouch-bindings/blob/master/Cordova/Binding/Cordova.cs)。我将尝试在今晚写出来。 - Jamie Starke
自那时起,PhoneGap 也有很大的变化,比如配置文件的处理方式发生了变化,在最开始时引入了一个大的红色警告,而在 XCode 中尝试从头开始构建项目也教会了我很多。感谢您的所有帮助。 - Jamie Starke

1
尽管这很尴尬,但我必须承认我认为这是一个PEBKAC(问题存在于键盘和椅子之间)的问题。
我正在遵循教程(此处),该教程实际上是在处理旧版本的Cordova,但是作者提供的make文件将会拉取Cordova repo的head来构建绑定。
实际上,这只是一个转移话题,真正的问题是用户(即我)的问题。我已经检出了最新版本的Cordova,并按照作者的说明设置了一个示例项目,当我复制config.plist(该文件不存在)时,错误地认为它只是被重命名为其他名称,并将该文件复制过去。当没有插件可用时,系统会崩溃并显示以上错误消息。
我相信这是在Cordova 2.1中,但肯定是在2.3之前,config.plist已被删除,并替换为config.xml。绑定确实需要一些小更新,但我不认为这是导致我的错误的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接