动态链接在应用程序关闭时不起作用,仅在后台运行时

2024-04-09

我一直致力于在我的应用程序中包含动态链接。我已经对其进行了设置,以便可以正确生成并正确接收链接,但它们仅在应用程序打开并在后台运行时才有效。如果应用程序完全关闭,该链接将仅打开该应用程序。即使我在 didFinishLaunchingWithOptions 方法中返回 TRUE,它看起来也没有调用 AppDelegate 中的 continueUserActivity 方法。我读过,我应该在 didFinishLaunchingWithOptions 方法中获取传入的 URL,但可用的答案不起作用并且已经过时,所以我希望有人知道。

这是代码:

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate{

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    return true
}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
            
    if let incomingURL = userActivity.webpageURL {
        
        let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
            guard error == nil else {
                print(error!.localizedDescription)
                return
            }
            if let dynamicLink = dynamicLink {
                self.handleIncomingDynamicLink(dynamicLink)
            } else {
                print("Something went wrong")
            }
        }
        if linkHandled {
            return true
        } else {
            return false
        }
    }
    return false
}

func handleIncomingDynamicLink(_ dynamicLink: DynamicLink) {
    guard let url = dynamicLink.url else {
        print("No incoming link")
        return
    }
    print("Link is: \(url)")
    SystemManager.sharedInstance.setDeepLinkTrip(tripKey: deepLinkParser(link: url))
    
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let initialViewController = storyboard.instantiateViewController(withIdentifier: "RootVC")
    self.window?.rootViewController = initialViewController
}

那么,现在应用程序冷启动时,如何才能正确打开链接呢?感谢您的帮助:)

编辑:我已经更新了我的应用程序以使用 SceneDelegate,所有其他答案都建议这样做,但它仍然不起作用。如果在后台运行,它仍然会打开动态链接,但否则不会打开它们。看起来没有任何链接发送到该应用程序。我找不到任何 userActivity、urlContexts 等。

这是新的相关代码:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

var window: UIWindow?

//I read that this function should be handling the link when it is clicked while the app is dead, but nothing works. Basically this checks that the user is logged in (always is), then looks for a link.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
    self.scene(scene, openURLContexts: connectionOptions.urlContexts)
    
    guard let _ = (scene as? UIWindowScene) else { return }

    if Auth.auth().currentUser != nil {
        
        if let userActivity = connectionOptions.userActivities.first {
          self.scene(scene, continue: userActivity)
        } else {
          self.scene(scene, openURLContexts: connectionOptions.urlContexts)
        }
        
        if let userActivity = connectionOptions.userActivities.first {
            if let incomingURL = userActivity.webpageURL {
                _ = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
                    guard error == nil else { return }
                    if let dynamicLink = dynamicLink {
                        self.handleIncomingDynamicLink(dynamicLink)
                    }  else {
                       print("Something went wrong")
                       let storyboard = UIStoryboard(name: "Main", bundle: nil)
                       let initialViewController = storyboard.instantiateViewController(withIdentifier: "RootVC")
                       self.window?.rootViewController = initialViewController
                   }
                }
            }
        } else {

            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let initialViewController = storyboard.instantiateViewController(withIdentifier: "RootVC")
            self.window?.rootViewController = initialViewController
        }
    }
    
}

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        
    if let url = URLContexts.first?.url {
        _ = DynamicLinks.dynamicLinks().handleUniversalLink(url) { (dynamicLink, error) in
        guard error == nil else { return }
        if let dynamicLink = dynamicLink {
        //your code for handling the dynamic link goes here
            self.handleIncomingDynamicLink(dynamicLink)
            }
        }
    }
}

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    if let incomingURL = userActivity.webpageURL {
        
        _ = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in
            guard error == nil else {
                print(error!.localizedDescription)
                return
            }
            if let dynamicLink = dynamicLink {
                self.handleIncomingDynamicLink(dynamicLink)
            } else {
                print("Soemthing went wrong")
            }
        }
    }
}

我知道出了什么问题了。该问题与 SceneDelegate 无关 - 我处理链接的方式被另一个网络调用覆盖。

由于从冷启动打开应用程序时无法看到打印语句,因此我解决此问题的方法是将消息保存到 UserDefaults,然后创建一个弹出警报以在应用程序加载后读取保存的消息。

但最终,我确实需要迁移到 SceneDelegate 而不是 AppDelegate。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态链接在应用程序关闭时不起作用,仅在后台运行时 的相关文章

  • 如何使用firebase规则检查用户组数组和记录组数组是否相交

    我在 firebase 中有一个记录列表 其中有一个包含零个或多个组的组属性 我还有 firebase auth 对象 它也有零个或多个组 我想为我的记录设置一个 read firebase 规则 该规则将检查两个列表中是否至少存在一个组
  • Swift UINavigationController 子类中的强制 init 覆盖

    我目前正在子类化UINavigationController对于服务视图控制器流的框架 在某种程度上 就像UIImagePickerController do 这是我的实现示例 尽可能简单 可以在操场上运行 import UIKit pub
  • 使用 FFT 执行音频分析

    我已经被这个问题困扰好几天了 并且浏览了几乎所有相关的 StackOverflow 页面 通过这次活动 我现在对 FFT 是什么及其工作原理有了更深入的了解 尽管如此 我在将其实现到我的应用程序中时遇到了极大的困难 简而言之 我想做的是为我
  • prepareForSegue 和 PerformSegueWithIdentifier 发送方

    我想知道标题中的函数如何工作以及发送者参数 假设单击按钮调用了performSegue方法 那么这是否也调用了prepareSegue方法 是否在performSegue方法之前但在按下按钮之后调用prepareSegue方法 另外 这两个
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 从 AVAudioRecorder 获取分贝

    我正在尝试从 AVAudio 录音机获取分贝值 这是我目前的代码 我有一个启动录音机的方法 然后是一个读取分贝值的方法 var recorder AVAudioRecorder 全局定义的记录器 然后在此处使用 func init reco
  • Flutter Firebase 身份验证 currentUser() 返回 null

    这是关于 Flutter Firebase 身份验证插件的 我试图在创建新用户后发送验证电子邮件 但 sendEmailVerification 内部使用 currentUser 这对我来说似乎是一个错误 但为了以防万一 我在 stacko
  • 具有透明背景的 Swift 模态视图控制器 [重复]

    这个问题在这里已经有答案了 我知道这个话题很受欢迎 但我在编程语言中遇到了一些问题 事实是我仍然不明白我把代码放在哪里 好吧 我就来说说整个案子 我正在尝试制作一个与正常情况稍有不同的模态 Swift 通过单击按钮 ViewControll
  • ExpandableLabel iOS 中的“少看”

    我正在使用第三方库可扩展标签 https github com apploft ExpandableLabel实施一个see more特征 我正在寻找仅快速的解决方案 其中包含标签中的文本而不是按钮中的文本 因此这可以完美地工作 添加库并更
  • Audiokit 修剪音频

    我正在制作音频编辑应用程序 我想修剪我的音频 对于音频编辑 我使用 AudioKit 框架 但我在教程和示例中找不到如何使用此框架修剪音频 异步导出允许设置开始和结束样本 https github com AudioKit AudioKit
  • CIAdditionCompositing 给出不正确的效果

    我正在尝试通过平均其他几个图像来创建图像 为了实现这一点 我首先将每个图像变暗 其系数等于我平均的图像数量 func darkenImage by multiplier CGFloat gt CIImage let divImage CII
  • Firebase 移动应用配额数量

    我向 firebase 项目添加了一个新应用程序 我已经有 66 个应用程序 33 个 android 33 个 ios 当我点击添加应用程序时出现的错误是 发生意外错误 原因 资源已耗尽 例如检查配额 根据他们的文档 https fire
  • 在SwiftUI中,如何高性能地绘制阴影?

    我用 shadow color radius x y 在我的应用程序中绘制阴影 这是我所知道的在 SwiftUI 中绘制应用程序的唯一方法 我用 sheet isPresented content 方法弹出一个视图 其中包含很多阴影 当我调
  • 仅在 iPhone X 上显示状态栏

    如果不是 iPhone X 则希望隐藏状态栏 如果是 iPhone X 则希望显示状态栏 这很可能必须以编程方式完成 因为 plist 中没有支持此功能的键 我发现的最接近的一个是UIStatusBarHidden 方法一 You have
  • 如何使 FirebaseAuth.AuthStateListener 在 Kotlin 中工作?

    class LoginActivity AppCompatActivity private val firebaseAuth FirebaseAuth getInstance private val firebaseAuthListener
  • 在 Swift 中将动态 Int 变量从一个类传递到另一个类

    我是 swift 2 的新手 我陷入了将变量从一个类传递到另一个类的过程中 我有一个类 GameScene 我有一个公共变量score并且在更新功能中不断更新 我想发送score两个节点相互碰撞时的值 一旦它发生碰撞 我就会使用 mainv
  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • 如何在 Swift Playgrounds 中获得弹出对话框

    我想知道如何在 Swift 中弹出一个对话框游乐场 是的 必须在 Playgrounds 中 我尝试了以下代码 直接来自 AppleDevs 站点 然而 无论我如何尝试 self tag always抛出错误 谁能帮我这个 import U
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何

随机推荐

  • 100% CSS 布局,带页眉和页脚

    我正在尝试创建一个带有页眉和页脚 两者都有固定高度 以及它们之间的内容 div 的布局 该内容填充剩余空间 在 content div 中 我想要具有基于百分比值的高度的 div 以 content div 的 heihgt 作为父级 我不
  • 如何在 NS-3/ndnSIM 中模拟过程延迟?

    我想在发送兴趣包之前在消费者节点上添加一些进程延迟 我发现 Simulator Schedule 函数可以实现这个目的 但我不确定如何使用它 因为 ndnSIM 有自己的协议流程 如果我安排一个新事件 可能会导致一些意外的结果 或者是否有其
  • Swig:将Java中的字节数组传递给C

    我正在尝试创建 Java 实现 以便使用 Swig 将 byte 传递给 C Swig include typemaps i apply char STRING int LENGTH char buff int len inline typ
  • Java EE 5 和 Hibernate

    我可以将哪个版本的 Hibernate 与 Java EE 5 一起使用 我可以使用最新版本吗 See http www hibernate org http www hibernate org 它说最新的4 1 4版本可以与Java EE
  • 带列的数据透视表 pandas 中的百分比计算

    我有一个数据集 其中包含来自不同供应商 地点 日期和产品的多个销售登记册 数据集是这样的 local categoria fabricante tipo consistencia peso pacote ordem vendas kg AR
  • Spring:用于动态查询的通用 RowMapper

    我正在使用 SpringBatch 从 Oracle 读取数据并将其写入 ElasticSearch 我的代码对于静态查询效果很好 例子 select emp id emp name from employee table我有一个 RowM
  • 存储 std::shared_ptr 的向量,其中 Foo 是模板类

    我有一个基类 我将其作为模板 因为我想改变多个函数所需的类型 但我想从这些模板化基类派生 我想存储这些类的向量 我的想法是在层次结构中的所有内容之上创建一个非模板化基类 并使用双重调度来确定类型 我这样做是 正确的方式 吗 这是该场景的代码
  • 使用 sed 从文件中删除多字节字符

    我需要从文件中删除所有多字节字符 我不知道它们是什么 所以我需要覆盖整个范围 我可以使用 grep 找到它们 如下所示 grep P x80 xFF 我的文件 尝试用 sed 做类似的事情 但删除它们 Cheers 尝试一下 LANG C
  • 用于 Objective-C 开发的 Lint 检查工具 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 具有多个开发人员的大型项目通常会导致代码风格不一致 我正在寻找一个lint http en wikip
  • 如何识别 Visual Basic 中 MS Office 使用的显示语言(即工具栏/菜单)?

    我有一个宏 可以从 MS Excel 电子表格生成 MS Word 报告 我在报告中使用的样式在宏中以英语编码 我的一些团队将 MS Office 显示语言设置为法国 这并不奇怪 我在法国工作 因此 我的宏不起作用 因为样式标题 英文 用于
  • Python - 如果某个键不在一个列表中,则追加到另一个列表中

    这可能是一个相当简单的问题 但我还没有完全弄清楚 我有两个元组列表 List A a 0 033 b 0 030 c 0 020 d 0 010 e 0 005 List B a 0 057 b 0 065 w 0 060 x 0 040
  • 视图绑定 - 如何获取包含的布局的绑定?

    在使用视图绑定时 我遇到了一些未记录的案例 第一 如何获得包含的视图布局部分的绑定 主绑定只能看到主布局中定义的项目 第二 如何获得合并布局部分的绑定 同样 主绑定只能看到主布局中的项目 的情况下 包含通用布局 不是合并节点 我们需要为包含
  • 使用 Java 从数据库读取 UDT 的最佳方法是什么?

    我以为我了解有关 UDT 和 JDBC 的一切 直到有人SO http stackoverflow com指出了Javadoc的一些细节java sql SQLInput http download oracle com javase 6
  • 查询根目录下的文件和文件夹列表

    我想获取根目录中的文件和文件夹列表 而不必对所有文件进行排序 是否有一个查询可以做到这一点 根文件夹也可以使用名为 root 的特殊别名来寻址 因此您可以使用以下查询获取根文件夹中的所有文件和文件夹 https www googleapis
  • 如何连接到 Docker Toolbox 中托管的容器?

    我尝试在 Docker 容器中运行 ASP NET Core 1 1 Web API 但无法从浏览器或curl 为了进行故障排除 我还启动了标准 nginx 和 Apache httpd 容器 但也无法连接到这些容器 因此我相信这是 Doc
  • 连接消除在 Oracle 中不适用于子查询

    我能够让连接消除适用于简单的情况 例如一对一关系 但不适用于稍微复杂的情况 最终我想尝试锚点建模 但首先我需要找到解决这个问题的方法 我正在使用 Oracle 12c 企业版版本 12 1 0 2 0 我的测试用例的 DDL drop vi
  • 如何在android中制作自定义textview? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发布局 我为此布局开发了可绘制对象 但是在此视图中文本未调整 任何人告诉我有关库的信息 请提供其
  • 如何在 Mojolicious 应用程序中从命令行获取凭据?

    我正在开发一个 Mojolcious 独立应用程序 在代码中 我正在联系内部后端 用户应在其中提供一些凭据 目前我正在代码中使用凭据作为变量 它看起来有点像 password somthing 我尝试使用配置插件在那里存储凭据 但是 Moj
  • 查找 R 中 data.table 中多次出现的值对

    我有一个data table in R gt head d COUNT SAMPLE junction 1 1 R1 tup 2 1 R1 tup 3 1 R1 tai 4 1 R2 milt 5 2 R3 Bsg25D 6 1 R4 tu
  • 动态链接在应用程序关闭时不起作用,仅在后台运行时

    我一直致力于在我的应用程序中包含动态链接 我已经对其进行了设置 以便可以正确生成并正确接收链接 但它们仅在应用程序打开并在后台运行时才有效 如果应用程序完全关闭 该链接将仅打开该应用程序 即使我在 didFinishLaunchingWit