草庐IT

swift - 从 AppDelegate 更改 WebView url

coder 2023-09-13 原文

我在 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);

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

图片:

编辑 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/

有关swift - 从 AppDelegate 更改 WebView url的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  4. ruby - 更改 ActiveRecord 中对象的类 - 2

    假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。

  5. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  6. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  7. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  8. ruby - Watir 更改 Mozilla Firefox 首选项 - 2

    我正在使用Watir运行一个Ruby脚本来为我自动化一些事情。我试图自动将一些文件保存到某个目录。因此,在我的Mozilla设置中,我将默认下载目录设置为桌面并选择自动保存文件。但是,当我开始运行我的脚本时,这些更改并没有反射(reflect)出来。似乎首选项恢复为默认值。我已经包括以下内容require"rubygems"#Optional.require"watir-webdriver"#Forwebautomation.require"win32ole"#Forfilesavedialog.并打开一个新的firefox实例:browser=Watir::Browser.new(:

  9. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  10. ruby - 更改字符编码 - 2

    我在使用Ruby1.9.2p290更改文本文件的编码时遇到问题。我收到错误消息invalidbytesequenceinUTF-8(ArgumentError)。问题(我认为)在于字符集似乎是未知的。如果我执行以下操作,则从命令行:$filetest.txt我得到:Non-ISOextended-ASCIIEnglishtext,withCRLFlineterminators或者,或者,如果我这样做:$file-itest.txt我得到:test.txt:text/plain;charset=unknown但是,如果我这样做,在Ruby中:data=File.open("test.tx

随机推荐