मेरे पास अपने एप्लिकेशन बंडल से सामग्री के साथ एक बहुत ही सरल UIWebView है। मैं चाहूंगा कि वेब दृश्य के बजाय सफारी में खोलने के लिए वेब दृश्य में कोई लिंक हो। क्या यह संभव है?
मेरे पास अपने एप्लिकेशन बंडल से सामग्री के साथ एक बहुत ही सरल UIWebView है। मैं चाहूंगा कि वेब दृश्य के बजाय सफारी में खोलने के लिए वेब दृश्य में कोई लिंक हो। क्या यह संभव है?
जवाबों:
UIWebView प्रतिनिधि में इसे जोड़ें:
(नेविगेशन प्रकार की जांच करने के लिए संपादित। आप file://
उन अनुरोधों से भी गुजर सकते हैं जो सापेक्ष लिंक होंगे)
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}
return YES;
}
स्विफ्ट संस्करण:
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if navigationType == UIWebViewNavigationType.LinkClicked {
UIApplication.sharedApplication().openURL(request.URL!)
return false
}
return true
}
स्विफ्ट 3 संस्करण:
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if navigationType == UIWebViewNavigationType.linkClicked {
UIApplication.shared.openURL(request.url!)
return false
}
return true
}
स्विफ्ट 4 संस्करण:
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
guard let url = request.url, navigationType == .linkClicked else { return true }
UIApplication.shared.open(url, options: [:], completionHandler: nil)
return false
}
अपडेट करें
जैसा कि openURL
iOS 10 में चित्रित किया गया है:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
UIApplication *application = [UIApplication sharedApplication];
[application openURL:[request URL] options:@{} completionHandler:nil];
return NO;
}
return YES;
}
switch
अगर किसी को आश्चर्य होता है, तो स्विफ्ट में ड्रॉनेडवर्ड का समाधान इस तरह दिखाई देगा :
func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {
if navigationType == UIWebViewNavigationType.LinkClicked {
UIApplication.sharedApplication().openURL(request.URL)
return false
}
return true
}
UIWebViewDelegate
उपयोगकर्ता 306253 के उत्तर के लिए एक त्वरित टिप्पणी: इसके साथ सावधानी बरतें, जब आप UIWebView में खुद को लोड करने की कोशिश करेंगे (अर्थात कोड से भी), तो यह विधि इसे होने से रोकेगी।
इसे रोकने के लिए आप क्या कर सकते हैं (धन्यवाद वेड):
if (inType == UIWebViewNavigationTypeLinkClicked) {
[[UIApplication sharedApplication] openURL:[inRequest URL]];
return NO;
}
return YES;
तुम भी UIWebViewNavigationTypeFormSubmitted
और UIWebViewNavigationTypeFormResubmitted
प्रकार संभाल करना चाहते हो सकता है ।
अन्य उत्तरों में एक समस्या है: वे आपके द्वारा की गई कार्रवाई पर निर्भर करते हैं और लिंक पर ही यह तय करते हैं कि इसे सफारी में लोड करना है या वेबव्यू में।
अब कभी-कभी यह वही है जो आप चाहते हैं, जो ठीक है; लेकिन कुछ अन्य समय, खासकर यदि आपके पेज में लंगर लिंक हैं, तो आप वास्तव में सफारी में केवल बाहरी लिंक खोलना चाहते हैं, और आंतरिक नहीं। उस स्थिति में आपको URL.host
अपने अनुरोध की संपत्ति की जांच करनी चाहिए ।
मैं यह जांचने के लिए कि क्या मेरे पास URL में एक होस्टनाम है जिसे पार्स किया जा रहा है, या यदि वह एम्बेडेड है तो जाँच करने के लिए कोड के उस टुकड़े का उपयोग करता हूँ:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
static NSString *regexp = @"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9])[.])+([A-Za-z]|[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9])$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexp];
if ([predicate evaluateWithObject:request.URL.host]) {
[[UIApplication sharedApplication] openURL:request.URL];
return NO;
} else {
return YES;
}
}
आप निश्चित रूप से अपनी आवश्यकताओं के अनुरूप नियमित अभिव्यक्ति को अपना सकते हैं।
if (request.URL?.scheme != "file")
स्विफ्ट में आप निम्नलिखित कोड का उपयोग कर सकते हैं:
extension YourViewController: UIWebViewDelegate {
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
if let url = request.url, navigationType == UIWebView.NavigationType.linkClicked {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
return false
}
return true
}
}
सुनिश्चित करें कि आप URL मान और नेवीगेशन टाइप के लिए जाँच करें।
यहाँ XAMarin iOS ड्रॉवर्डवर्ड के जवाब के बराबर है।
class WebviewDelegate : UIWebViewDelegate {
public override bool ShouldStartLoad (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType) {
if (navigationType == UIWebViewNavigationType.LinkClicked) {
UIApplication.SharedApplication.OpenUrl (request.Url);
return false;
}
return true;
}
}
स्वीकृत उत्तर काम नहीं करता है।
यदि आपका पृष्ठ जावास्क्रिप्ट के माध्यम से URL लोड करता है, तो navigationType
होगा UIWebViewNavigationTypeOther
। जो, दुर्भाग्य से, एनालिटिक्स जैसे पृष्ठभूमि पृष्ठ लोड भी शामिल हैं।
पेज नेविगेशन का पता लगाने के लिए, आपको इसकी तुलना [request URL]
करने की आवश्यकता है [request mainDocumentURL]
।
यह समाधान सभी मामलों में काम करेगा:
- (BOOL)webView:(UIWebView *)view shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)type
{
if ([[request URL] isEqual:[request mainDocumentURL]])
{
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}
else
{
return YES;
}
}
ऐप अस्वीकृति नोट:
अंत UIWbView
में मर चुका है और Apple अब इसे स्वीकार नहीं करेगा।
Apple ने उन सभी ऐप के मालिक को ईमेल भेजना शुरू किया जो अभी भी उपयोग कर रहे हैं UIWebView
:
डेप्रिसिएटेड एपीआई यूसेज - ऐप्प ऐप का इस्तेमाल करने वाले ऐप्स की सबमिशन स्वीकार करना बंद कर देगा UIWebView
।
Apple उपयोगकर्ता गोपनीयता को बहुत गंभीरता से लेता है और यह स्पष्ट है कि वे असुरक्षित वेबव्यू की अनुमति नहीं देंगे ।
इसलिए जल्द से जल्द अपने ऐप से UIWebView निकालें। UIWebView
नए बनाए गए एप्लिकेशन में उपयोग करने का प्रयास न करें और WKWebView
यदि संभव हो तो मैं उपयोग करना पसंद करता हूं
ITMS-90809: डिप्रेस्ड एपीआई यूसेज - Apple उन ऐप्स के सबमिशन को स्वीकार करना बंद कर देगा जो UIWebView API का उपयोग करते हैं। अधिक जानकारी के लिए https://developer.apple.com/documentation/uikit/uiwebview देखें ।
उदाहरण:
import UIKit
import WebKit
class WebInfoController: UIViewController,WKNavigationDelegate {
var webView : WKWebView = {
var webview = WKWebView()
return webview
}()
var _fileName : String!
override func viewDidLoad() {
self.view.addSubview(webView)
webView.fillSuperview()
let url = Bundle.main.url(forResource: _fileName, withExtension: "html")!
webView.loadFileURL(url, allowingReadAccessTo: url)
let request = URLRequest(url: url)
webView.load(request)
}
func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
print(error.localizedDescription)
}
func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
print("Strat to load")
}
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
print("finish to load")
}
}
मेरे मामले में मैं यह सुनिश्चित करना चाहता हूं कि वेब दृश्य में सब कुछ प्रारंभिक लोड को छोड़कर सफारी को खोलता है और इसलिए मैं उपयोग करता हूं ...
- (BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if(inType != UIWebViewNavigationTypeOther) {
[[UIApplication sharedApplication] openURL:[inRequest URL]];
return NO;
}
return YES;
}