You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS集成Accengage后深度链接无法触发URL回调的问题求助

解决Accengage推送服务下iOS深度链接无法触发application(_:open:options:)的问题

我之前也碰到过一模一样的情况——Accengage会接管深度链接的处理逻辑,导致系统默认的application(_:open:options:)方法完全不会被触发。别担心,我们只需要改用Accengage提供的回调机制来获取推送中的URL即可,具体步骤如下:

1. 实现AccengageDelegate协议

首先让你的AppDelegate遵循AccengageDelegate协议,这样才能接收Accengage的深度链接回调:

import UIKit
import Accengage // 确保导入Accengage框架

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, AccengageDelegate {
    var window: UIWindow?
    // ... 其他原有属性和方法
}

2. 设置Accengage代理

在didFinishLaunchingWithOptions方法里,启动Accengage之后立即设置代理:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 按文档启动Accengage(已通过AccengageConfig.plist配置)
    Accengage.start()
    
    // 关键:设置代理以接收深度链接回调
    Accengage.shared().delegate = self
    
    // 处理冷启动时的推送深度链接(可选但很重要)
    if let remoteNotification = launchOptions?[.remoteNotification] as? [String: Any] {
        Accengage.shared().handleRemoteNotification(remoteNotification, applicationState: application.applicationState)
    }
    
    return true
}

3. 用Accengage回调处理深度链接

把你原来写在application(_:open:options:)里的逻辑,迁移到Accengage的专属回调方法中:

func accengage(_ accengage: Accengage, didReceiveDeepLink deepLink: URL) {
    print("收到Accengage深度链接: \(deepLink)")
    print("url host :\(deepLink.host as String?)")
    print("url path :\(deepLink.path as String?)")
    
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    
    // 这里提醒下:你原来的代码用了url.host,但通常深度链接的路径是在path字段(比如"yourScheme:///details"的path是"/details"),host可能为空,建议检查你的链接格式
    switch deepLink.path {
    case "/details":
        let adsDetails = mainStoryboard.instantiateViewController(withIdentifier: "CollectionDetailViewController") as! CollectionDetailViewController
        self.window?.rootViewController = adsDetails
    case "/profile":
        let userProfile = mainStoryboard.instantiateViewController(withIdentifier: "UserProfileViewController") as! UserProfileViewController
        self.window?.rootViewController = userProfile
    default:
        break
    }
    
    self.window?.makeKeyAndVisible()
}

为什么原来的方法会失效?

Accengage SDK会拦截系统的深度链接和推送通知处理流程,目的是统一统计推送触达、点击等行为,同时管理深度链接的跳转逻辑。所以当你调用Accengage.start()后,系统的application(_:open:options:)和application(_:didReceiveRemoteNotification:)都会被Accengage接管,必须通过它提供的代理方法才能获取对应的数据。

另外,Safari打开链接启动应用但无法打印URL的问题,同样需要通过accengage(_:didReceiveDeepLink:)处理——因为Accengage也会拦截这种场景的深度链接。

内容的提问来源于stack exchange,提问作者Foutse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:35:33