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

iOS 15 专注模式开发问题:INShareFocusStatusIntentHandling未触发的解决方案咨询

解决INShareFocusStatusIntentHandling未触发的问题

首先得明确一个关键点:INShareFocusStatusIntentHandling 是用来处理用户主动发起的分享专注状态请求(比如通过Siri指令、快捷操作触发)的回调,它并不是系统专注状态变更时的自动通知触发机制。所以当系统弹出“Focus on”通知时,这个Handling方法没被调用是正常的——它本来就不是干这个活的。

如果你的核心需求是在自有App中接收系统专注状态变更的通知,可以试试下面这些更适配的方案:

方案1:用FocusStatusCenter原生监听(iOS 15+)

苹果在iOS 15及以上提供了FocusStatusCenter,这是官方推荐的专注状态监听方式,能精准捕获所有状态变化:

import Focus

class FocusStateMonitor {
    private var statusObserver: NSObjectProtocol?
    
    init() {
        // 订阅专注状态变更通知
        statusObserver = NotificationCenter.default.addObserver(
            forName: .focusStatusDidChange,
            object: FocusStatusCenter.default,
            queue: .main
        ) { [weak self] _ in
            let currentStatus = FocusStatusCenter.default.focusStatus
            // 在这里处理状态变更逻辑
            print("专注状态更新:\(currentStatus.isFocused ? "已开启" : "已关闭")")
            // 还能获取当前专注模式的名称:currentStatus.activeFocusMode?.displayName
        }
    }
    
    deinit {
        if let observer = statusObserver {
            NotificationCenter.default.removeObserver(observer)
        }
    }
}

方案2:兼容旧版本的系统通知监听(iOS 14及以下)

如果需要支持更早的iOS版本,可以监听系统的NSSystemStateDidChangeNotification通知,再通过UserDefaults间接判断状态:

NotificationCenter.default.addObserver(
    forName: NSNotification.Name.NSSystemStateDidChangeNotification,
    object: nil,
    queue: .main
) { _ in
    // 读取系统存储的专注状态(非官方键,可能随系统版本变化)
    if let focusInfo = UserDefaults.standard.object(forKey: "com.apple.focus.status") as? [String: Any] {
        let isFocused = focusInfo["isFocused"] as? Bool ?? false
        print("专注状态更新:\(isFocused ? "已开启" : "已关闭")")
    }
}

注意:这种方式依赖非官方的UserDefaults键,苹果可能在后续版本修改,所以优先推荐方案1。

如果你确实需要触发INShareFocusStatusIntentHandling

如果你的场景是希望在专注状态开启时,自动触发分享状态的Intent(比如主动同步到你的App),那需要手动触发这个Intent:

  1. 在专注状态的触发逻辑里,创建INShareFocusStatusIntent实例
  2. 通过INIntentInteraction捐赠或触发Intent:
import Intents

func triggerFocusShareIntent() {
    let intent = INShareFocusStatusIntent()
    intent.targetFocusStatus = .focused // 根据实际状态设置为.focused或.notFocused
    
    let interaction = INIntentInteraction(intent: intent, response: nil)
    interaction.donate(completion: { error in
        if let error = error {
            print("Intent捐赠失败:\(error.localizedDescription)")
        } else {
            print("Intent已捐赠,会触发INShareFocusStatusIntentHandling回调")
        }
    })
}

同时要确保你的App完成了这些配置:

  • 在主App的Info.plist中添加NSUserActivityTypes,包含INShareFocusStatusIntent
  • 如果使用了Intent Extension,在Extension的Info.plist的IntentsSupported数组中添加INShareFocusStatusIntent
  • 确保App已请求NSFocusStatusUsageDescription权限(在Info.plist中声明)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:49:37