当用户在 swift 中单击推送通知时打开自定义 url

Posted

技术标签:

【中文标题】当用户在 swift 中单击推送通知时打开自定义 url【英文标题】:Open custom url when user clicks push notifications in swift 【发布时间】:2020-04-15 13:52:12 【问题描述】:

我正在尝试使用 WKWebView 和 Firebase Push 开发 ios / Swift 应用程序。我想使用 php 发送通知,当用户单击通知以在 webview 中打开自定义 URL 时。默认网址是

let url = URL(string: "https://mywebsite.com/index.php?token=\(token)")!

我想在这个 url 中传递一个像这样的 id

let url = URL(string: "https://client.gazduire.net/app3/index.php?token=\(token)&ntid=(id that is send with push notification, ex.:1)")!

我在 appdelegate.swift 中的代码

 func userNotificationCenter(_ center: UNUserNotificationCenter,didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) 
let userInfo = response.notification.request.content.userInfo
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey] 
  print("Message ID: \(messageID)")

// Print full message.
print(userInfo)

let notificationName = Notification.Name("test")
NotificationCenter.default.post(name: notificationName, object: nil,userInfo: userInfo)

let ntid = userInfo["ntid"] as! String
print("\(ntid)")


completionHandler()

ViewController.swift

@objc func test() 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let ntid = appDelegate.ntid
    let token = Messaging.messaging().fcmToken


guard let url = URL(string: "https://mywebsite.com/index.php?token=\(token ?? "")&ntid=\(ntid)")      else 
   print("Invalid URL")
   return
   

    let request = URLRequest(url: url)
    webView.load(request)

当用户点击推送通知时,我可以将 ntid(ntid 已接收并且打印正常)从 appdelegate 发送到 viewcontroller 吗?谢谢!

【问题讨论】:

【参考方案1】:

简单来说,只需在视图控制器的层次结构中找到您的视图控制器,将“ntid”值传递给存储的属性并调用“test”方法。

【讨论】:

你能举个简单的例子吗?谢谢!我是 Swift 语言的新手!【参考方案2】:

首先定义枚举为

enum Identifiers 
  static let viewAction = "cat1"
  static let newsCategory = "cat2"

然后在你的 UNUserNotificationCenterDelegate 中

extension AppDelegate: UNUserNotificationCenterDelegate 
  func userNotificationCenter(
    _ center: UNUserNotificationCenter,
    didReceive response: UNNotificationResponse,
    withCompletionHandler completionHandler: @escaping () -> Void) 

    // 1
    let userInfo = response.notification.request.content.userInfo

    // 2
    if let aps = userInfo["aps"] as? [String: AnyObject],
      let newsItem = NewsItem.makeNewsItem(aps) 

      (window?.rootViewController as? UITabBarController)?.selectedIndex = 1

      // 3
      if response.actionIdentifier == Identifiers.viewAction,
        let url = URL(string: newsItem.link) 
        let safari = SFSafariViewController(url: url)
        window?.rootViewController?.present(safari, animated: true,
                                            completion: nil)
      
    

    // 4
    completionHandler()
  

像这样在推送服务中添加类别


  "aps": 
    "alert": "messaga",
    "sound": "default",
    "link_url": "www.google.com",
    "category": "cat1",

  

它将检查 aps 类型,然后如果类别类型为 1 或 2,则推送视图控制器。 你可以通过这种方式添加很多你想要的

【讨论】:

我有以下错误:使用未解析的标识符'NewsItem' NewsItem 仅用于示例。使用您自己的结构。在示例代码中,当用户单击通知并显示新闻时,标签栏会发生变化

以上是关于当用户在 swift 中单击推送通知时打开自定义 url的主要内容,如果未能解决你的问题,请参考以下文章

当用户使用 iOS 13 Swift 5 点击推送通知时,在特定视图中打开应用程序

推送通知无法正常工作,当应用程序在后台时,Swift

当应用程序通过使用 firebase_messaging 的推送通知终止时如何接收自定义数据?

单击 Ionic 中的推送通知时如何打开特定页面?

单击 Firebase 通知有效负载的通知时打开自定义 Intent

单击通知行为仅在应用程序在后台运行时才有效?