2010-05-29 20 views
8

Bir UIWebView içindeki bir web sayfasından birden çok şeyi, iPhone uygulamasına UIWebView'ın shouldStartLoadWithRequest yöntemi aracılığıyla geri göndermeye çalışıyorum.Tetikleme Birden çok window.location.href çağrıları ileStartLoadWithRequest

Temelde web sayfam window.location.href = "command: // foo = bar" ifadesini çağırır ve uygulamasındaki sorunu engellemem mümkün değildir. Şimdi bir döngü oluşturmak ve birden çok window.location.href çağrıları bir kerede yapsam, o zaman bir kez çağrılanStartLoadWithRequest göründüğünde görünür ve çağrı, döngü sonunda window.location.href en son ateşleme olur.

Aynı şey Android için web görünümünde de oluyor, sadece son window.location.href işleniyor.

+0

Akıllıca bir çözüm buldum. Dinamik olarak her komut için bir iframe oluşturun ve src'yi "command: // foo = bar" olarak ayarlayın, bunu bir döngüde birden çok kez kapatabilir ve her zaman StarTLoadWithRequest çağrılır! Şimdi bunu nasıl optimize edeceğimizi öğrenmek için. Binlerce iframe yaratmanın iyi olacağını düşünmüyorum (gizlenmiş olsalar bile). Bu konuda herhangi bir öneriniz var mı? – AlBeebe

+0

Her konum çağrısını da optimize etmeye çalışırdım. Dakikada sadece 60 çağrı gönderebiliyorsanız, her çağrıya, çağrı başına birden çok komutu işlemek için yeterli sorgu vars ve parçalarla karıştırdığınızdan emin olun. Ayrıca, wkWebView'a göz atmak isteyebilirsiniz: http://nshipster.com/wkwebkit/ bu işlemin büyük bir kısmını otomatik hale getirir ve daha güvenilirdir. – newshorts

cevap

39
iFrame = document.createElement("IFRAME"); 
iFrame.setAttribute("src", "command://foo=bar"); 
document.body.appendChild(iFrame); 
iFrame.parentNode.removeChild(iFrame); 
iFrame = null; 

Yani bu, o zaman, vücuttan iframe'i kaldıracak en kısa sürede vücut shouldStartLoadWithRequest eklenmiş olarak çağrılan sonra, uygulamayla geçiş yapmaya çalışan bir komut im onun kaynağını ayarlar, bir iframe oluşturur ve belleği boşaltmak için null olarak ayarlayın.

Ayrıca bunu bir Android webview üzerinde shouldOverrideUrlLoading kullanarak test ettim ve ayrıca düzgün çalıştı!

+3

Bu çözüm oldukça çirkin, ama mümkün olan en çirkin çirkin çözüm gibi görünüyor. Daha sonra diğer window.location çağrıları tarafından değiştirilir window.location çağrıları göz ardı ederek Javascript "optimize eder" gibi görünüyor. Beni çok acı verici bir hata ayıklama oturumundan kurtardığın için teşekkür ederim! – Arkaaito

+0

@Arkaaito +1 çirkin derecede çirkin, tamamen katılıyorum – AlBeebe

+4

Bu 2 yıl önce yayınladığımdan beri takip etmek istiyorum. Temel olarak yerel bir uygulamaya yerleştirilmiş bir web görünümü olan bir Android ve iPhone uygulaması yazdım. Bu çözümü kullandım, böylece web görünümünden yerel uygulamaya kadar iletişim kurabiliyordum ve son 2 yıldır kusursuz bir şekilde çalışmıştım. – AlBeebe

0

Hayır, iframe'in url değişmesi, Android 2.2'de en azından hayır olmalıdır.

3

Bu problemi de gördüm ve işte benim için işe yarayan çözümüm. Tüm javascript işlevlerim, buverilerini geçirmek için __js2oc (msg) işlevini ve nesneyi ObjectStart ile Ctrl-WithRequest: Pls aracılığıyla kullanır. Kullandığınız "appname:" tetikleyicinizle "command:" ifadesini değiştirin.

/* iPhone JS2Objective-C bridge interface */ 
var __js2oc_wait = 300; // min delay between calls in milliseconds 
var __prev_t = 0; 
function __js2oc(m) { 
    // It's a VERY NARROW Bridge so traffic must be throttled 
    var __now = new Date(); 
    var __curr_t = __now.getTime(); 
    var __diff_t = __curr_t - __prev_t; 
    if (__diff_t > __js2oc_wait) { 
    __prev_t = __curr_t; 
    window.location.href = "command:" + m; 
    } else { 
    __prev_t = __curr_t + __js2oc_wait - __diff_t; 
    setTimeout(function() { 
     window.location.href = "command:" + m; 
    }, (__js2oc_wait - __diff_t)); 
    } 
} 
İlgili konular