0

我需要pushwoosh sdk仍然是AppDelegate ...在appdelegate中-我如何访问webview并更改url(取决于从appdelegate收到的推送通知?pushnotifications并且一切正常...初始网页也在启动时加载。但是我如何在应用程序委托中更改 url?

主应用:

 @main
struct XYApp: App {
    @UIApplicationDelegateAdaptor var delegate: FSAppDelegate
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class FSAppDelegate: UIResponder, UIApplicationDelegate, PWMessagingDelegate {
    var window: UIWindow?
   

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        //initialization code
        //set custom delegate for push handling, in our case AppDelegate
        Pushwoosh.sharedInstance()?.delegate = self;
        
        //register for push notifications
        Pushwoosh.sharedInstance()?.registerForPushNotifications()
        
        print("token: ",Pushwoosh.sharedInstance()?.getPushToken())
      
            return true
    }
    }

快速查看

  import SwiftUI

struct ContentView: View {
    @State private var showWebView = false
   
    var body: some View {
        WebView(url: URL(string: "https://www.xy.com/mobile")!)
        
          
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

快速浏览网页

import SwiftUI
import WebKit
 
struct WebView: UIViewRepresentable {
    var url: URL
    

    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }
 
    func updateUIView(_ webView: WKWebView, context: Context) {
        let request = URLRequest(url: url)
        webView.load(request)
    }
    }
4

1 回答 1

0

简单的方法是使用静态变量。

例如,在 FSAppDelegate 上创建一个变量(注意这可以在您想要的任何文件或类上创建):

static var webView: WebView?

__

在 makeUIView 函数上,您可以添加一个新行:

func makeUIView(context: Context) -> WKWebView {
   let webView = WKWebView()
   FSAppDelegate.webView = webView
   return webView
}

__

然后,在收到通知(didFinishLaunchingWithOptions 只会在应用未运行时调用):

if let webView = FSAppDelegate.webView {
   webView.load(someRequest)
}

您可以改为实现 didReceivePushNotification 方法。

但是,如果您想在应用程序打开时加载请求(例如,触摸通知警报),也许您可​​以做一些不同的事情。

application: UIApplication, didFinishLaunchingWithOptions 方法在代码中的任何其他方法之前运行。所以 webView 还没有设置。例如,您可以存储 URL 字符串。所以静态变量将是一个字符串:

static var urlString: String?

在您的应用程序启动时,如果您有 URL 字符串,您可以存储如下:

FSAppDelegate.urlString = someURLString

然后在 updateUIView 方法上,使:

func updateUIView(_ webView: WKWebView, context: Context) {
    if let urlString = FSAppDelegate.urlString {
       let receivedURL = URL(string: urlString)
       let request = URLRequest(url: receivedURL)
       webView.load(request)
    } else {
       let request = URLRequest(url: url)
       webView.load(request)
    }
}

请注意,我说这是可能的,但如果您探索其他方式,您可以获得更好的软件架构。

于 2022-02-03T06:05:58.660 回答