xamarin.ios cordova xamarin cordova-2.0.0

xamarin.ios - Problemas con los enlaces: método básico de llamada en el método de anulación de llamadas de clase de enlace. Lleva a la recursión infinita



cordova cordova-2.0.0 (1)

Estoy trabajando en un proyecto MonoTouch que usa Cordova. Creé un enlace para Cordova ( basado en el creado por Scott Blomquist ).

He podido crear instancias de las clases bastante bien sin falta. Sin embargo, cuando trato de extenderlos, me encuentro con problemas. Por ejemplo, si simplemente intento extender CDVViewController, sin anular nada, cuando lleguemos al código que ejemplifica esta clase extendida, el sistema sale silenciosamente sin mensajes de error, y las siguientes líneas de salida.

The program ''Mono'' has exited with code 0 (0x0). The program ''[5600] ***.vshost.exe: Managed (v4.0.30319)'' has exited with code -1 (0xffffffff).

Aquí está la clase que intento crear una instancia

public class WebViewController : CDVViewController { }

Y aquí está el enlace detrás de él

[BaseType (typeof (UIViewController))] interface CDVViewController { [Export ("webView")] UIWebView WebView { get; set; } [Export ("pluginObjects")] NSMutableDictionary PluginObjects { get; } [Export ("pluginsMap")] NSDictionary PluginsMap { get; } [Export ("settings")] NSDictionary Settings { get; } [Export ("whitelist")] CDVWhitelist Whitelist { get; } [Export ("loadFromString")] bool LoadFromString { get; } [Export ("useSplashScreen")] bool UseSplashScreen { get; set; } [Export ("activityView")] UIActivityIndicatorView ActivityView { get; } [Export ("imageView")] UIImageView ImageView { get; } [Export ("wwwFolderName")] string WwwFolderName { get; set; } [Export ("startPage")] string StartPage { get; set; } [Export ("commandQueue")] NSObject CommandQueue { get; set; } [Export ("commandDelegate")] NSObject CommandDelegate { get; set; } [Export ("userAgent")] string UserAgent { get; } [Export ("printMultitaskingInfo")] void PrintMultitaskingInfo (); [Export ("createGapView")] void CreateGapView (); [Export ("newCordovaViewWithFrame:")] UIWebView NewCordovaView(RectangleF bounds); [Export ("javascriptAlert:")] void JavascriptAlert (string text); [Export ("appURLScheme")] string AppUrlScheme (); [Export ("parseInterfaceOrientations:")] NSArray ParseInterfaceOrientations (NSArray orientations); [Export ("supportsOrientation:")] bool SupportsOrientation (UIInterfaceOrientation orientations); [Export ("getCommandInstance:")] NSObject GetCommandInstance (string pluginName); [Export ("registerPlugin:withClassName:")] void RegisterPluginWithClassName (CDVPlugin plugin, string className); [Export ("URLisAllowed:")] bool UrlIsAllowed (NSUrl url); [Static] [Export ("getBundlePlist:")] NSDictionary GetBundlePlist (string plistName); [Static] [Export ("applicationDocumentsDirectory")] string ApplicationDocumentsDirectory (); // The following methods and properties come from UIWebViewDelegate, but we can''t do multiple inheritance [Export ("webView:shouldStartLoadWithRequest:navigationType:")] bool ShouldStartLoad (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType); }

El CDVViewController.h para el que creo el enlace está disponible aquí

Cualquier ayuda que cualquiera pueda ofrecer sería muy apreciada.

Actualización # 1 Esto parece haber sido causado por un error de segmentación. Para cualquier otra persona que experimente esto, si vas a la Mac y verificas el registro, es probable que encuentres lo mismo. Puede hacerlo abriendo el terminal y escribiendo tail -f /var/log/system.log ya que aparentemente aquí es donde van los registros del simulador.

En mi registro, encontré lo siguiente. *** se usa para redactar el nombre de la aplicación.

Mar 28 16:51:16 macmini1 com.apple.launchd.peruser.55385368[409] (UIKitApplication:com.***.***[0x5ef3][14219]): Job appears to have crashed: Segmentation fault: 11 Mar 28 16:51:16 macmini1 SpringBoard[516]: Application ''***'' exited abnormally with signal 11: Segmentation fault: 11 Mar 28 16:51:16 macmini1 ReportCrash[14132]: Saved crash report for ***[14219] version ??? (???) to /Users/jstarke/Library/Logs/DiagnosticReports/***_2013-03-28-165116_macmini1.crash Mar 28 16:51:16 macmini1 ReportCrash[14132]: Removing excessive log: file://localhost/Users/jstarke/Library/Logs/DiagnosticReports/***_2013-03-28-135722_macmini1.crash

Actualización # 2 Encontré los informes de fallos mencionados anteriormente. Aquí está la última información del informe de bloqueo, incluido el hilo bloqueado

Process: *** [29880] Path: /Users/*/Library/Application Support/iPhone Simulator/*/***.app/*** Identifier: *** Version: ??? (???) Code Type: X86 (Native) Parent Process: launchd [409] Date/Time: 2013-03-29 11:44:48.882 -0700 OS Version: Mac OS X Server 10.7.5 (11G63) Report Version: 9 Crashed Thread: 0 Dispatch queue: com.apple.main-thread Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_PROTECTION_FAILURE at 0x00000000bf7fff7c VM Regions Near 0xbf7fff7c: Stack 00000000b050b000-00000000b052c000 [ 132K] rw-/rwx SM=COW --> Stack 00000000bc000000-00000000bf800000 [ 56.0M] ---/rwx SM=NUL Stack 00000000bf800000-00000000c0000000 [ 8192K] rw-/rwx SM=COW Application Specific Information: iPhone Simulator 358.4, iPhone OS 6.0 (iPhone/10A403) Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 libsystem_c.dylib 0x954d458c szone_malloc_should_clear + 12 1 libsystem_c.dylib 0x954d566b szone_malloc + 24 2 libsystem_c.dylib 0x9550b962 malloc_zone_malloc + 77 3 libsystem_c.dylib 0x9550c882 malloc + 50 4 libobjc.A.dylib 0x041985c9 class_copyProtocolList + 157 5 CoreFoundation 0x03f72962 __methodDescriptionForSelector + 178 6 CoreFoundation 0x03fe65a3 -[NSObject(NSObject) methodSignatureForSelector:] + 51 7 *** 0x00254352 monotouch_trampoline + 82 8 ??? 0x16c4ab0b 0 + 381987595 9 ??? 0x16c7428c 0 + 382157452 10 ??? 0x16c743dc 0 + 382157788 11 *** 0x0004cf22 mono_jit_runtime_invoke + 722 12 *** 0x001b03fe mono_runtime_invoke + 126 13 *** 0x00255166 monotouch_trampoline + 3686 Lines 8 - 13 repeat a large number of times (no additional information) 506 ??? 0x16c4ab0b 0 + 381987595 507 ??? 0x16c7428c 0 + 382157452 508 ??? 0x16c743dc 0 + 382157788 509 *** 0x0004cf22 mono_jit_runtime_invoke + 722 510 *** 0x001b03fe mono_runtime_invoke + 126 511 *** 0x00255166 monotouch_trampoline + 3686

Actualización n. ° 3 En un esfuerzo por obtener más información, decidí anular todos los métodos en el CDVViewController dentro de mi WebViewController local, y luego devolver el valor del equivalente base de cada método, y establecer un punto de interrupción en el método, y poner Console.WriteLine diciendo que ingresamos y salimos de cada método.

Para mi sorpresa, el motivo de las numerosas duplicaciones en la Actualización 2 tiene que ver con el hecho de que cuando se llama a WebViewController.ShouldAutoRotateToInterfaceOrientation , llamamos a la clase base CDVViewController.ShouldAutoRotateToInterfaceOrientation , que aparentemente a su vez llama a WebViewController.ShouldAutoRotateToInterfaceOrientation , y así sucesivamente. .

Mirando el código fuente para la versión de Cordova que estoy usando ( aquí ), shouldAutorotateToInterfaceOrientation: llamaría supportsOrientation: que regresaría de un NSArray .

No veo ninguna razón por la cual CDVViewController.ShouldAutoRotateToInterfaceOrientation deba llamar alguna vez a WebViewController.ShouldAutoRotateToInterfaceOrientation . ¿Alguien en la comunidad Xamarin o Cordova tiene alguna idea?


Si alguien más está experimentando un problema similar relacionado con Bindings, logré hacerlo funcionar gracias al consejo de Rolf Bjarne Kvinge ( Problemas vinculantes: ¿se está extendiendo un método de leads de clase? )

Resultó que una bandera que estaba usando (sin entender realmente lo que hacía) era la culpable de esto. Al generar el archivo DLL utilizando btouch el btouch -e Generates smaller classes that can not be subclassed .

Eliminar esto probablemente resolverá su problema, como lo hizo por mí.