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

如何判断iOS应用是否被SharePlay会话启动或打开

问题原因

你之前实现的UNUserNotificationCenterDelegate回调仅用于处理普通本地通知、远程推送通知的点击事件,SharePlay请求的接受触发逻辑不属于普通通知范畴,因此不会走该回调,自然不会有日志输出。你需要使用苹果专门为SharePlay提供的GroupActivities框架接口来监听会话激活事件。

解决方案

前置准备

  1. 项目最低支持版本设置为iOS 15+(SharePlay从iOS15开始支持)
  2. 在项目的Signing & Capabilities中添加Group Activities能力
  3. 引入GroupActivities框架

步骤1:定义你的自定义SharePlay活动类型

import GroupActivities

// 替换成你自己的活动标识和业务参数
struct CustomSharePlayActivity: GroupActivity {
    // 要和你项目配置的Group Activities标识一致
    static let activityIdentifier = "com.your.bundle.id.shareplay.activity"
    // 自定义需要传递的业务参数,比如要打开的内容ID
    var targetContentId: String
    
    var metadata: GroupActivityMetadata {
        var metadata = GroupActivityMetadata()
        metadata.title = "共享内容"
        // 根据你的业务场景选类型,比如watchTogether/listenTogether等
        metadata.type = .watchTogether
        return metadata
    }
}

步骤2:全局监听SharePlay会话激活

该回调可以覆盖应用在前台、后台运行时收到SharePlay请求的场景,你可以在AppDelegate的didFinishLaunchingWithOptions或者根视图控制器的初始化方法中调用以下监听方法:

func setupSharePlaySessionMonitor() {
    Task {
        // 监听所有匹配自定义活动类型的SharePlay会话
        for await session in CustomSharePlayActivity.sessions() {
            print("收到SharePlay会话激活请求")
            // 处理跳转逻辑
            DispatchQueue.main.async {
                guard let rootVC = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController else {
                    return
                }
                // 实例化你要跳转的指定ViewController
                let targetVC = YourCustomViewController()
                // 传入需要的参数,比如session里的业务数据
                targetVC.contentId = session.activity.targetContentId
                // 执行跳转,根据你的业务逻辑选present/push等方式
                rootVC.present(targetVC, animated: true)
            }
            // 加入SharePlay会话,完成连接
            session.join()
        }
    }
}

步骤3:处理应用被SharePlay冷启动的场景

如果用户点击接受SharePlay请求时应用已经被系统终止,你需要在SceneDelegate中捕获启动参数做预处理,上述的会话监听回调依然会触发:

import GroupActivities

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // 检测是否是SharePlay请求启动的应用
        if let sharePlayActivity = connectionOptions.userActivities.first(where: {
            $0.activityType == GroupActivityActivityType
        }) {
            print("应用通过SharePlay请求冷启动")
            // 这里可以做提前初始化等预处理操作,跳转逻辑依然走步骤2的监听回调即可
        }
        
        // 其他原有初始化逻辑
        guard let _ = (scene as? UIWindowScene) else { return }
    }
}

如果你的项目没有使用SceneDelegate,仅用AppDelegate,可以通过以下方法捕获冷启动事件:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == GroupActivityActivityType {
        print("应用通过SharePlay请求启动/唤起")
        return true
    }
    return false
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:02