shouldStartLoadWithRequest wird nicht aufgerufen, wenn AJAX / XMLHttpRequest verwendet wird

8

Ich versuche Methodenaufrufe von JavaScript nach Objective-C zu senden und umgekehrt. Alles funktioniert gut für window.location ausgelöste URLs, die von shouldStartLoadWithRequest abgefangen werden. Wenn ich stattdessen versuche, einen AJAX-Aufruf zu verwenden, wird sustainStartLoadWithRequest nicht aufgerufen. Gibt es eine Möglichkeit, dies zu tun? Hauptsächlich möchte ich nicht auf die maximale URL-Größe für Daten beschränkt sein, die von JavaScript an Objective-C übergeben werden können.

Mein UIWebViewDelegate implementiert:

%Vor%

Meine JavaScript-Aufrufe:

%Vor%     
el_migu_el 25.04.2010, 11:03
quelle

3 Antworten

10

Wenn Sie eine sauberere Methode zum Übertragen von Daten von JavaScript nach Objective-C möchten, können Sie die folgenden Schritte ausführen:

  1. Sobald Sie JS-Daten haben, die Sie an Objective-C zurücksenden möchten, speichern Sie diese in JS in einer global zugänglichen Variable, z. %Code%
  2. Benutze die oben erwähnte Technik von var myTempData = ...
  3. Sobald Sie in Ihrem Objective-C-Code sind, führen Sie document.location = 'myapp://fire-some-event' .
  4. aus
  5. Ich denke, Sie sind fertig, achten Sie auf Threading / Objekt-zu-String-via-JSON-Codierung.
ohadpr 10.03.2011 23:11
quelle
2

Obwohl ich keine Antwort finden konnte, warum AJAX-Anfragen nicht von sophotStartLoadWithRequest abgefangen werden, habe ich zwei Problemumgehungen gefunden. Ich nehme an, dass JavaScript-Anfragen nicht abgefangen werden, sondern nur HTML-assoziierte / -originierte Anfragen. Wenn jemand dies überprüfen oder korrigieren könnte, wäre ich glücklich.

Die beiden Problemumgehungen sind einfach. Auf der einen Seite scheint es, dass die Beschränkung von 256 Zeichen in der URL MobileSafari oder zumindest die URL in diesem Zustand nicht beeinflusst. Ich habe gelesen, dass Safari 80'000 Character erlaubt . Aber ich fühlte mich nicht wohl dabei. Die Problemumgehung # 2 besteht also darin, ein HTML-Formular zu verwenden, das die POST-Methode verwendet und die Aktion für Ihr Schema festlegt. Die Daten können in der Form als Wert eines Eingabefeldes oder dergleichen gespeichert werden. Nach dem Absenden des Formulars mit JavaScript wird shouldStartLoadWithRequest ausgelöst und die Daten können von HTTPBody abgerufen werden.

    
el_migu_el 25.04.2010 17:30
quelle
2

Ich bin mir nicht sicher, ob das für Sie funktioniert, aber wenn Sie versuchen, die shouldStartLoadWithRequest zu verwenden, um von javascript auf native Telefonfunktionen zuzugreifen, können Sie PhoneGap . Es ist ein praktisches und Open-Source-Ziel-c-Framework, das in der Lage ist, Javascript und Ziel-c zu überbrücken.

Ich brauchte einen Weg, um das Telefon asynchron von JavaScript zu vibrieren, und ich schaute auf die PhoneGap-Quelle, um zu sehen, wie sie es macht. Nach einigen Tests stellte ich fest, dass $ .ajax nicht von sophotStartLoadWithRequest abgefangen werden würde und dass es sehr speziell war, wann es HTTP-Anfragen abfangen würde. Sie könnten jedoch alles in Ordnung bringen, indem Sie document.location anstelle von $ .ajax aufrufen und ein anderes Protokoll wie gap: // anstelle von http: //.

verwenden

So sieht der JavaScript Code aus:
document.location = "gap://vibrate";

Und der Ziel-c-Code:

%Vor%     
Julian 28.12.2010 19:49
quelle

Tags und Links