2010-04-25 18 views
8

का उपयोग करते समय shouldStartLoadWithRequest को कॉल नहीं किया जाता है, मैं जावास्क्रिप्ट से Objective-C और इसके विपरीत विधि आमंत्रण भेजने की कोशिश कर रहा हूं। सबकुछ खिड़की के लिए ठीक काम करता है। स्थान ने यूआरएल को ट्रिगर किया, जिसे कस्टस्टार्ट लोडविथरक्वेट द्वारा पकड़ा जाता है। अब अगर मैं इसके बजाय एक AJAX कॉल का उपयोग करने का प्रयास करता हूं, तो चाहिएस्टार्ट लोड VithRequest नहीं कहा जाता है। क्या ऐसा करने का कोई तरीका है? मुख्य रूप से मैं डेटा पर अधिकतम यूआरएल आकार तक सीमित नहीं होना चाहता हूं जिसे जावास्क्रिप्ट से ऑब्जेक्टिव-सी में पारित किया जा सकता है।AJSt/XMLHttpRequest

मेरे UIWebViewDelegate लागू करता है:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
NSString *url = [[request URL] absoluteString]; 
NSRange urlrange = [url rangeOfString:@"myScheme://"]; 
if(urlrange.length > 0){ 
    NSLog(@"this is an objective-c call, do not load link: %@", [url substringWithRange:NSMakeRange(urlrange.location, [url length])]); 
    return NO; 
} else { 
    NSLog(@"not an objective-c call, load link: ", url); 
    return YES; 
} 
} 

मेरा JavaScript कॉल:

// works 
window.location.href = "myScheme://readyHref"; 

// fails 
var xmlHttpReq = false; 
if (window.XMLHttpRequest) { 
xmlHttpReq = new XMLHttpRequest(); 
} else if (window.ActiveXObject) { 
xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
xmlHttpReq.open('GET', "myScheme://readyAJAX", false); 
xmlHttpReq.send(); 

उत्तर

2

हालांकि मैं इस सवाल का जवाब क्यों AJAX अनुरोध shouldStartLoadWithRequest द्वारा रोक नहीं कर रहे हैं नहीं मिल सकता है मैं दो तरीके दिए पाया। मुझे लगता है कि जावास्क्रिप्ट अनुरोधों को अवरुद्ध नहीं किया जा रहा है, लेकिन केवल HTML- जुड़े/-ऑर्गिनेटेड अनुरोध हैं। अगर कोई इसे सत्यापित या सही कर सकता है, तो मैं खुश रहूंगा।

दो कामकाज सरल हैं। एक तरफ ऐसा लगता है कि यूआरएल में 256 अक्षरों का प्रतिबंध मोबाइलसाफरी या कम से कम उस राज्य में यूआरएल को प्रभावित नहीं करता है। मैंने पढ़ा है कि Safari allows 80'000 charcters। हालांकि मुझे इसके साथ अच्छा महसूस नहीं हुआ। तो वर्कअराउंड # 2 एक HTML फॉर्म का उपयोग करना है जो POST विधि का उपयोग करता है और आपकी योजना में कार्रवाई सेट करता है। डेटा को इनपुट फ़ील्ड या जैसे मान के रूप में रूप में संग्रहीत किया जा सकता है। जावास्क्रिप्ट के साथ फॉर्म जमा करने के बाद shouldStartLoadWithRequest ट्रिगर किया गया है और डेटा HTTPBody से पुनर्प्राप्त किया जा सकता है।

2

मुझे यकीन है कि अगर यह आपके लिए काम करेंगे नहीं कर रहा हूँ, लेकिन आप जावास्क्रिप्ट आप PhoneGap इस्तेमाल कर सकते हैं से देशी फोन कार्यों तक पहुँचने के लिए shouldStartLoadWithRequest उपयोग करने के लिए कोशिश कर रहे हैं। यह एक आसान और मुक्त स्रोत उद्देश्य-सी ढांचा है जो जावास्क्रिप्ट और उद्देश्य-सी को पुल करने में सक्षम है।

मुझे अतुल्यकालिक रूप से फोन को जावास्क्रिप्ट से कंपन करने का कारण बनने की आवश्यकता थी और मैंने यह देखने के लिए फोनगैप स्रोत को देखा कि वे इसे कैसे करते हैं। कुछ परीक्षणों के बाद मुझे पता चला कि $ .ajax को StStartLoadWithRequest द्वारा अवरुद्ध नहीं किया जाएगा और यह भी बहुत विशेष था कि यह http अनुरोधों को कब रोक देगा। आप सबकुछ अच्छी तरह से काम कर सकते हैं हालांकि $ .ajax के बजाय दस्तावेज़.लोकेशन को कॉल करके और एक और प्रोटोकॉल जैसे कि http: // के बजाय अंतर: // का उपयोग करके।

तो जावास्क्रिप्ट कोड लगता है:
document.location = "gap://vibrate";

और उद्देश्य-सी कोड:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 
    NSURL *url = request.URL; 
    NSString *urlString = url.relativeString; 

    if ([urlString isEqualToString:@"gap://vibrate"]) 
    { 
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); 
    }; 

    return YES; 
}
10

आप उद्देश्य के लिए जावास्क्रिप्ट से डेटा स्थानांतरित करने का एक क्लीनर तरीका है करना चाहते हैं तो -C आप इन चरणों का पालन कर सकते हैं:

  1. एक बार आपके पास जेएस डेटा हो जाने के बाद आप उद्देश्य-सी पर वापस भेजना चाहते हैं तो J के भीतर एस इसे कुछ वैश्विक रूप से accesible चर में स्टोर करें उदा। var myTempData = ...
  2. उपयोग आपकी ऑब्जेक्टिव-सी कोड में document.location = 'myapp://fire-some-event'
  3. एक बार की उपर्युक्त तकनीक [myWebView stringByEvaluatingJavaScriptFromString:@"myTempData"] निष्पादित।
  4. मुझे लगता है कि आप कर चुके हैं, थ्रेडिंग/ऑब्जेक्ट-टू-स्ट्रिंग-थ्रू-जेसन-एन्कोडिंग के लिए देखें।