gpt4 book ai didi

swift - 从 AppDelegate 更改 WebView url

转载 作者:可可西里 更新时间:2023-11-01 00:41:15 25 4
gpt4 key购买 nike

我在 AppDelegate 类中收到来自 Firebase 的通知。
此通知包含一个名为“notif_url”的字符串。我已将此值放入名为“desired_url”的 var 中,现在我需要使用“desired_url”值更改我的 WebView url。

但我无法访问 webview 来更改它的 url :

@IBOutlet weak var my_web_view: UIWebView!

func load_url(server_url: String){
let url = URL(string: server_url);
let request = URLRequest(url: url!);
my_web_view.loadRequest(request);
}

load_url(server_url: desired_url);

你知道我是否可以做到吗?如果可以,怎么做?

图片:
enter image description here enter image description here

编辑 1:
添加断点后知道错行了,好像不是这一行:

my_web_view.loadRequest(request)

编辑 2:
如果需要,这是我的 AppDelegate 类代码的一部分。

import UIKit
import UserNotifications

import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
let gcmMessageIDKey = "gcm.message_id"
@IBOutlet weak var my_web_view: UIWebView!

func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
return true
}
}

// [START ios_10_message_handling]
@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate{

// Receive displayed notifications for iOS 10 devices.
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void){
print("Step : 12");
let userInfo = notification.request.content.userInfo
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey]{
print("Message ID: \(messageID)")
}

// Print full message.
print(userInfo)
var url: String = userInfo[AnyHashable("url")] as! String;
load_url(server_url: url);

// Change this to your preferred presentation option
completionHandler([])
}

func load_url(server_url: String){
/*
let url = URL(string: server_url);
let request = URLRequest(url: url!);
my_web_view.loadRequest(request);
*/

guard let url = URL(string: server_url) else {
print("Invalid URL")
return
}

print("TRY : "+server_url);

let request = URLRequest(url: url)
my_web_view.loadRequest(request)
}
}

编辑 3:
如果需要,这是我的 ViewController 类代码。

import Foundation
import UIKit
import SafariServices
import UserNotifications

class ViewController: UIViewController, UIWebViewDelegate{

@IBOutlet weak var my_web_view: UIWebView!
@IBOutlet weak var my_loading_view: UIView!
@IBOutlet weak var spinner : UIActivityIndicatorView!
@IBOutlet weak var app_logo : UIImageView!

@IBOutlet weak var deadlinePicker: UIDatePicker!
@IBOutlet weak var titleField: UITextField!

var new_url: String = "";

override func viewDidLoad(){
super.viewDidLoad()

let server_url = "https://www.sortirauhavre.com/";

NotificationCenter.default.addObserver(self, selector: #selector(self.rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
rotated();

spinner.startAnimating();


my_web_view.scrollView.bounces = false;
my_web_view.scrollView.isScrollEnabled = true;

let url = URL(string: server_url);
let request = URLRequest(url: url!);
my_web_view.loadRequest(request);
}

// CETTE FONCITON SE LANCE A LA ROTATION DE L'APPAREIL
func rotated(){
app_logo.center = my_loading_view.center;
let y = app_logo.frame.origin.y;
let h = app_logo.frame.size.height
app_logo.frame.origin.y = y-(h/2);

spinner.center = my_loading_view.center;
}

// CETTE FONCTION MET EN ARRIERE PLAN L'ANNIMATION DE CHARGEMENT
func removeLoader(){
self.view.addSubview(my_web_view);
}

// CETTE FONCTION MET EN PREMIER PLAN L'ANNIMATION DE CHARGEMENT
func addLoader(){
self.view.addSubview(my_loading_view);
}

// CETTE FONCTION SE DECLANCHE QUAND LES PAGES DE LA WEBVIEW COMMENCE A CHANGER
func webViewDidStartLoad(_ webView: UIWebView){
addLoader();
let server_url = "https://www.sortirauhavre.com/";
_ = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.removeLoader), userInfo: nil, repeats: false);
if let text = webView.request?.url?.absoluteString{
if text.hasPrefix(server_url){
}
else if text != ""{
UIApplication.shared.openURL(URL(string: text)!)
my_web_view.goBack()
}
}
}

// CETTE FONCTION SE DECLANCHE QUAND LES PAGES DE LA WEBVIEW FINI DE CHANGER
func webViewDidFinishLoad(_ webView: UIWebView){
let server_url = "https://www.sortirauhavre.com/";
_ = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.removeLoader), userInfo: nil, repeats: false);
if let text = webView.request?.url?.absoluteString{
if text.hasPrefix(server_url){
}
else if text != ""{
UIApplication.shared.openURL(URL(string: text)!)
my_web_view.goBack()
}
}
}
}

最佳答案

您正在强制展开 url,这不是一个有效的 URL。我建议添加一个 guard 语句以防止在创建无效 URL 时发生崩溃:

func load_url(server_url: String) {
guard let url = URL(string: server_url) else {
print("Invalid URL")
return
}

let request = URLRequest(url: url)
my_web_view.loadRequest(request)
}

当您在 AppDelegate 中获取 URL 时,您不能简单地从此类更新 UIWebView。您需要在 my_web_view 的父类中调用一个函数来更新 URL

// App Delegate

var serverURL: String?

func load_url(server_url: String) {
serverURL = server_url
let notificationName = Notification.Name("updateWebView")
NotificationCenter.default.post(name: notificationName, object: nil)
}


// View Controller

override func viewDidLoad() {
let notificationName = Notification.Name("updateWebView")
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.updateWebView), name: notificationName, object: nil)

updateWebView()
}

func updateWebView() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let serverURL = appDelegate.serverURL

guard let url = URL(string: serverURL) else {
print("Invalid URL")
return
}

let request = URLRequest(url: URL)
my_web_view.loadRequest(request)
}

关于swift - 从 AppDelegate 更改 WebView url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43408531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com