UIWebView সাফারি লিঙ্ক খুলুন


304

আমার অ্যাপ্লিকেশন বান্ডিলের সামগ্রী সহ আমার খুব সাধারণ ইউআইবিউব ভিউ রয়েছে। আমি ওয়েব ভিউয়ের যে কোনও লিঙ্কগুলি ওয়েব ভিউয়ের পরিবর্তে সাফারিতে খুলতে চাই। এটা কি সম্ভব?


নীচে গৃহীত উত্তর সকল ক্ষেত্রে কার্যকর হবে না।
ইয়ানস

আমি আরও ভাল উত্তর যুক্ত করেছি। আমার উত্তর গ্রহণযোগ্য হিসাবে চিহ্নিত করুন।
ইয়ানস

উত্তর:


657

এটি ইউআইবিউব ভিউ প্রতিনিধিতে যুক্ত করুন:

(গৌণ টাইপ জন্য চেক করতে সম্পাদনা করা হয়েছে। আপনার কাছে মধ্য দিয়ে পাস করতে পারে 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আইওএস 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;
}

ড্রোনওয়ারওয়ার্ড, আপনি নীচে উত্তর এবং মন্তব্য রেফারেন্স সহ আপনার উত্তর আপডেট করা আপত্তি করতে চান?
টবি অ্যালেন

ব্যবহারকারী একবার ব্রাউজার বন্ধ করলে কীভাবে অ্যাপ্লিকেশনটিতে ফিরে যেতে পারেন?
জনি এভারসন

3
@ ঝোনি এভারসন: কোনও বাহ্যিক অ্যাপ (সাফারি সহ) বন্ধ হয়ে যাওয়ার পরে যা ঘটে তা নিয়ে আপনার নিয়ন্ত্রণ নেই। ব্যবহারকারী ব্রাউজিং হয়ে যাওয়ার পরে আপনি যদি আপনার অ্যাপটিতে ফিরে যেতে চান তবে সাফারি খুলবেন না, কেবল ইউআইডাব্লুডাব্লুভিউ এবং একটি "সম্পন্ন" -বটন ব্যবহার করুন।
জিওন

1
স্থানীয় এইচটিএমএল ফাইল সহ কবজির মতো কাজ করেছেন।
necixy

1
আমার মনে হয়, switch
সুইফটে এনাম

44

যে কেউ অবাক পারেন, Drawnonward এর দ্রবণে ভালো দেখাবে সুইফট :

func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.LinkClicked {
        UIApplication.sharedApplication().openURL(request.URL)
        return false
    }
    return true
}

https: // http: // বা মেলটো :? কেবলমাত্র ইউআরএলএস দিয়ে এটি কীভাবে করবেন তা সম্পর্কে কোনও ধারণা দ্রুত ব্যবহার করছেন? প্রশ্ন এখানে একটি দ্রুত উত্তর প্রয়োজন! stackoverflow.com/questions/2532453/…
জেদ গ্রান্ট

@JedGrant দ্রুতগতি এখন সংস্করণ stackoverflow.com/questions/2532453/...
কার্ল Sharman

2
ব্যবহার নিশ্চিত করুনUIWebViewDelegate
জয় মায়ু

28

ব্যবহারকারী 306253 এর উত্তরে একটি দ্রুত মন্তব্য: এর সাথে সতর্কতা অবলম্বন করুন, আপনি যখন ইউআইবিউভ ভিউতে নিজেকে কিছুটা লোড করার চেষ্টা করবেন (অর্থাত্ কোড থেকেও), এই পদ্ধতিটি এটি ঘটতে বাধা দেবে।

এটি (ধন্যবাদ ওয়েড) রোধ করতে আপনি যা করতে পারেন তা হ'ল:

if (inType == UIWebViewNavigationTypeLinkClicked) {
    [[UIApplication sharedApplication] openURL:[inRequest URL]];
    return NO;
}

return YES;

আপনি এছাড়াও UIWebViewNavigationTypeFormSubmittedএবং UIWebViewNavigationTypeFormResubmittedপ্রকারগুলি পরিচালনা করতে চাইবেন ।


8
+1 আমার একই সমস্যা ছিল। সমাধানটি অনুরোধের ধরণ হিসাবে ইউআইওউবভিউ নেভিগেশন টাইপলিঙ্ক ক্লিক করা উচিত ছিল, তারপরে ইউআরএল খুলুন এবং কোনও ফিরিয়ে নেই, অন্যথায় হ্যাঁ ফিরিয়ে দিন।
ওয়েড মুয়েলার

ওয়েড আপনি উত্তর হিসাবে আপনার মন্তব্য পোস্ট করা উচিত
টবি অ্যালেন

16

অন্যান্য উত্তরের একটি সমস্যা রয়েছে: তারা সাফারি বা ওয়েবভিউতে লোড করবেন কিনা তা স্থির করার জন্য তারা আপনার করা কর্মের উপর নির্ভর করে এবং লিঙ্কের উপরে নয়।

এখন কখনও কখনও এটি ঠিক আপনি চান যা ঠিক আছে; তবে অন্য কিছু সময়, বিশেষত আপনার পৃষ্ঠায় অ্যাঙ্কর লিঙ্ক থাকলে আপনি সাফারিতে কেবলমাত্র বাহ্যিক লিঙ্কগুলিই খুলতে চান, অভ্যন্তরীণগুলি নয়। সেক্ষেত্রে URL.hostআপনার অনুরোধের সম্পত্তিটি পরীক্ষা করা উচিত ।

আমি কোডটি এই টুকরাটি ইউএসএল-এ পার্স করা হচ্ছে তার হোস্ট-নেম আছে কিনা, বা এটি এম্বেড এইচটিএমএল রয়েছে কিনা তা যাচাই করতে আমি ব্যবহার করি:

- (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; 
    }
}

আপনি অবশ্যই আপনার প্রয়োজন মাপসই নিয়মিত অভিব্যক্তি মানিয়ে নিতে পারেন।



1
আগত অনুরোধগুলি ফিল্টার করার বিষয়ে হ্যাঁ, হোস্টনাম পার্সিংয়ের পক্ষে নেই। ইউআরএল স্কিমের উপর ভিত্তি করে ফিল্টার করা আরও ভাল পন্থা। আইওএস ৮.৪ (সিমুলেটর) এ, অ্যাঙ্কর লিঙ্কগুলির স্কিম হিসাবে ব্যবহৃত "আপেল ওয়েবেডাটা" পেয়েছি, তবে লক্ষ্য সংস্করণে এটি আলাদা হতে পারে।
মান্ডিসাডাব্লু

ভাল ধারণা মান্ডিসাডব্লিউ। অ্যাঙ্কর লিঙ্কগুলিকে অনুমতি দেওয়ার জন্য আমি "ফাইল" স্কিমটি পরীক্ষা করে দেখিif (request.URL?.scheme != "file")
ডেভিড ডগলাস

7

সুইফটে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

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 মান এবং নেভিগেশন টাইপ পরীক্ষা করেছেন।


1

ড্রোনওয়ার্ডের উত্তরের সমতুল্য জামারিন আইওএস।

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;
    }
}

1

গৃহীত উত্তর কার্যকর হয় না।

যদি আপনার পৃষ্ঠাটি জাভাস্ক্রিপ্টের মাধ্যমে ইউআরএল লোড করে তবে 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;
    }
}

1
আপনি কি এর একটি সুইফট 4 সংস্করণ পোস্ট করতে পারেন?
আমজাদ

1

অ্যাপ্লিকেশন প্রত্যাখ্যান নোট:

অবশেষে UIWbViewমারা গেছে এবং অ্যাপল এটি আর গ্রহণ করবে না।

অ্যাপল সমস্ত অ্যাপ মালিককে ইমেল প্রেরণ শুরু করেছে যারা এখনও ব্যবহার করছেন UIWebView:

অবহেলিত এপিআই ব্যবহার - অ্যাপল যে অ্যাপ্লিকেশনগুলি UIWebViewAPI ব্যবহার করে তাদের জমা দেওয়া গ্রহণ বন্ধ করে দেবে ।

অ্যাপল ব্যবহারকারীর গোপনীয়তাটিকে খুব গুরুত্ব সহকারে নেয় এবং এটাই স্পষ্ট যে তারা নিরাপদ ওয়েবসাইট দেখার অনুমতি দেবে না

তাই যত তাড়াতাড়ি সম্ভব আপনার অ্যাপ থেকে ইউআইবিউবভিউ সরিয়ে ফেলুন। UIWebViewনতুন তৈরি অ্যাপ্লিকেশন ব্যবহার করার চেষ্টা করবেন না এবং আমি WKWebViewযদি সম্ভব হয় তবে ব্যবহার করতে পছন্দ করি

আইটিএমএস -90809: অবহেলিত এপিআই ব্যবহার - অ্যাপল ইউআইউইউভিউ ভিউ এপিআইগুলি ব্যবহার করে এমন অ্যাপ্লিকেশনগুলির জমা গ্রহণ গ্রহণ বন্ধ করবে। আরও তথ্যের জন্য https://developer.apple.com/docamentation/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")
    }
}

0

আমার ক্ষেত্রে আমি নিশ্চিত করতে চাই যে ওয়েব ভিউতে একেবারে সমস্ত কিছুই প্রাথমিক লোড ব্যতীত সাফারিটি খোলায় এবং তাই আমি ব্যবহার করি ...

- (BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
     if(inType != UIWebViewNavigationTypeOther) {
        [[UIApplication sharedApplication] openURL:[inRequest URL]];
        return NO;
     }
     return YES;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.