2010-05-29 10 views
8

मैं UIWebView के अंदर एक वेबपृष्ठ से कई चीजों को UIWebView के shouldStartLoadWithRequest विधि के माध्यम से अपने आईफोन ऐप पर वापस करने का प्रयास कर रहा हूं।एकाधिक विंडो के साथ कंधे लोड करना चाहिए। Location.href कॉल

असल में मेरा वेबपृष्ठ window.location.href = "आदेश: // foo = bar" कहता है और मैं इसे रोकने में सक्षम हूं कि मेरे ऐप में कोई समस्या नहीं है। अब अगर मैं लूप बना देता हूं और एकाधिक विंडो करता हूं। Location.href एक बार कॉल करता है, तो चाहिएस्टार्ट लोड VithRequest केवल एक बार कॉल करने के लिए प्रतीत होता है और यह कॉल लूप के अंत में window.location.href की आखिरी फायरिंग है।

एंड्रॉइड के लिए वेबव्यू के साथ ही यही बात होती है, केवल अंतिम विंडो। Location.href संसाधित हो जाती है।

+0

मुझे एक चालाक समाधान मिला। प्रत्येक कमांड के लिए गतिशील रूप से एक आईफ्रेम बनाएं और इसके src को "command: // foo = bar" पर सेट करें, आप इसे लूप में कई बार बंद कर सकते हैं और चाहिएस्टार्ट लोड VithRequest हर बार बुलाया जाता है! अब यह अनुकूलित करने के लिए कि इसे कैसे अनुकूलित किया जाए। मुझे नहीं लगता कि हजारों आईफ्रेम बनाने के लिए अच्छा होगा (भले ही वे छिपे हुए हों)। उस पर कोई सुझाव? – AlBeebe

+0

मैं प्रत्येक स्थान कॉल को अनुकूलित करने का प्रयास करूंगा। यदि आप केवल 60 कॉल एक मिनट भेज सकते हैं, तो सुनिश्चित करें कि आप प्रति कॉल एकाधिक आदेशों को संभालने के लिए पर्याप्त क्वेरी वर्र्स और टुकड़ों के साथ हर कॉल को जाम कर रहे हैं। साथ ही, आप wkWebView को देखना चाहेंगे: http://nshipster.com/wkwebkit/ यह इस प्रक्रिया में से अधिकांश को स्वचालित करता है और अधिक विश्वसनीय है। – newshorts

उत्तर

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

तो यह एक iframe बनाता है, तो हम शरीर से iframe को दूर एक कमांड im एप्लिकेशन को पारित करने के लिए, जैसे ही शरीर shouldStartLoadWithRequest करने के लिए अपने साथ जोड़ दिया के रूप में कहा जाता है की कोशिश कर रहा है तो करने के लिए अपने स्रोत सेट करता है और स्मृति को मुक्त करने के लिए इसे शून्य पर सेट करें।

मैंने इसे एंड्रॉइडइडललोडिंग का उपयोग करके एंड्रॉइड वेबव्यू पर भी परीक्षण किया और यह भी ठीक से काम किया!

+3

यह समाधान घृणित रूप से बदसूरत है, लेकिन ऐसा लगता है कि यह कम से कम घृणास्पद बदसूरत समाधान संभव है। ऐसा लगता है कि जावास्क्रिप्ट विंडो को अनदेखा करके "अनुकूलित करता है"। कॉल कॉल जिन्हें बाद में अन्य विंडो द्वारा स्थानांतरित किया जाता है। स्थान कॉल। मुझे बहुत दर्दनाक डिबगिंग सत्र से बचाने के लिए धन्यवाद! – Arkaaito

+0

@ अराकाइटो +1 बदसूरत बदसूरत के लिए +1, मैं पूरी तरह से सहमत हूं – AlBeebe

+4

मैं इस 2 साल पहले पोस्ट करने के बाद से पालन करना चाहता हूं। मैंने एक एंड्रॉइड और आईफोन ऐप लिखा था जो मूल रूप से देशी ऐप में लिपटा हुआ एक वेबव्यू था। मैंने इस समाधान का उपयोग किया ताकि मैं वेबव्यू से मूल ऐप में संवाद कर सकूं और पिछले 2 सालों से यह मेरे काम के 500k + डाउनलोड से अधिक हो गया है। – AlBeebe

0

नहीं, iframe का यूआरएल बदलना टॉवर ट्रिगर नहीं करेगा, कम से कम एंड्रॉइड 2.2 में नहीं।

3

मैंने इस समस्या को भी मारा और यहां मेरा समाधान है जो मेरे लिए काम करता है। मेरे सभी जावास्क्रिप्ट फ़ंक्शंस इस फ़ंक्शन का उपयोग करते हैं __js2oc (msg) डेटा पास करने के लिए और उद्देश्य-सी के लिए ईवेंट कोस्टार्ट लोड के माध्यम से WithRequest: पीएस अपने "appname:" ट्रिगर के साथ "कमांड:" को प्रतिस्थापित करें।

/* 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)); 
    } 
} 
संबंधित मुद्दे