আমার অ্যাপ্লিকেশন বান্ডিলের সামগ্রী সহ আমার খুব সাধারণ ইউআইবিউব ভিউ রয়েছে। আমি ওয়েব ভিউয়ের যে কোনও লিঙ্কগুলি ওয়েব ভিউয়ের পরিবর্তে সাফারিতে খুলতে চাই। এটা কি সম্ভব?
আমার অ্যাপ্লিকেশন বান্ডিলের সামগ্রী সহ আমার খুব সাধারণ ইউআইবিউব ভিউ রয়েছে। আমি ওয়েব ভিউয়ের যে কোনও লিঙ্কগুলি ওয়েব ভিউয়ের পরিবর্তে সাফারিতে খুলতে চাই। এটা কি সম্ভব?
উত্তর:
এটি ইউআইবিউব ভিউ প্রতিনিধিতে যুক্ত করুন:
(গৌণ টাইপ জন্য চেক করতে সম্পাদনা করা হয়েছে। আপনার কাছে মধ্য দিয়ে পাস করতে পারে 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;
}
switch
যে কেউ অবাক পারেন, Drawnonward এর দ্রবণে ভালো দেখাবে সুইফট :
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 এর উত্তরে একটি দ্রুত মন্তব্য: এর সাথে সতর্কতা অবলম্বন করুন, আপনি যখন ইউআইবিউভ ভিউতে নিজেকে কিছুটা লোড করার চেষ্টা করবেন (অর্থাত্ কোড থেকেও), এই পদ্ধতিটি এটি ঘটতে বাধা দেবে।
এটি (ধন্যবাদ ওয়েড) রোধ করতে আপনি যা করতে পারেন তা হ'ল:
if (inType == UIWebViewNavigationTypeLinkClicked) {
[[UIApplication sharedApplication] openURL:[inRequest URL]];
return NO;
}
return YES;
আপনি এছাড়াও UIWebViewNavigationTypeFormSubmitted
এবং UIWebViewNavigationTypeFormResubmitted
প্রকারগুলি পরিচালনা করতে চাইবেন ।
অন্যান্য উত্তরের একটি সমস্যা রয়েছে: তারা সাফারি বা ওয়েবভিউতে লোড করবেন কিনা তা স্থির করার জন্য তারা আপনার করা কর্মের উপর নির্ভর করে এবং লিঙ্কের উপরে নয়।
এখন কখনও কখনও এটি ঠিক আপনি চান যা ঠিক আছে; তবে অন্য কিছু সময়, বিশেষত আপনার পৃষ্ঠায় অ্যাঙ্কর লিঙ্ক থাকলে আপনি সাফারিতে কেবলমাত্র বাহ্যিক লিঙ্কগুলিই খুলতে চান, অভ্যন্তরীণগুলি নয়। সেক্ষেত্রে 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;
}
}
আপনি অবশ্যই আপনার প্রয়োজন মাপসই নিয়মিত অভিব্যক্তি মানিয়ে নিতে পারেন।
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 মান এবং নেভিগেশন টাইপ পরীক্ষা করেছেন।
ড্রোনওয়ার্ডের উত্তরের সমতুল্য জামারিন আইওএস।
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;
}
}
গৃহীত উত্তর কার্যকর হয় না।
যদি আপনার পৃষ্ঠাটি জাভাস্ক্রিপ্টের মাধ্যমে ইউআরএল লোড করে তবে 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
মারা গেছে এবং অ্যাপল এটি আর গ্রহণ করবে না।
অ্যাপল সমস্ত অ্যাপ মালিককে ইমেল প্রেরণ শুরু করেছে যারা এখনও ব্যবহার করছেন UIWebView
:
অবহেলিত এপিআই ব্যবহার - অ্যাপল যে অ্যাপ্লিকেশনগুলি UIWebView
API ব্যবহার করে তাদের জমা দেওয়া গ্রহণ বন্ধ করে দেবে ।
অ্যাপল ব্যবহারকারীর গোপনীয়তাটিকে খুব গুরুত্ব সহকারে নেয় এবং এটাই স্পষ্ট যে তারা নিরাপদ ওয়েবসাইট দেখার অনুমতি দেবে না ।
তাই যত তাড়াতাড়ি সম্ভব আপনার অ্যাপ থেকে ইউআইবিউবভিউ সরিয়ে ফেলুন। 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")
}
}
আমার ক্ষেত্রে আমি নিশ্চিত করতে চাই যে ওয়েব ভিউতে একেবারে সমস্ত কিছুই প্রাথমিক লোড ব্যতীত সাফারিটি খোলায় এবং তাই আমি ব্যবহার করি ...
- (BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if(inType != UIWebViewNavigationTypeOther) {
[[UIApplication sharedApplication] openURL:[inRequest URL]];
return NO;
}
return YES;
}