如何判断iOS应用是否被SharePlay会话启动或打开
问题原因
你之前实现的UNUserNotificationCenterDelegate回调仅用于处理普通本地通知、远程推送通知的点击事件,SharePlay请求的接受触发逻辑不属于普通通知范畴,因此不会走该回调,自然不会有日志输出。你需要使用苹果专门为SharePlay提供的GroupActivities框架接口来监听会话激活事件。
解决方案
前置准备
- 项目最低支持版本设置为iOS 15+(SharePlay从iOS15开始支持)
- 在项目的
Signing & Capabilities中添加Group Activities能力 - 引入
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
相关产品推荐
相关产品推荐

