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

如何在FileProvider扩展ActivationRule中比较sourceItem.userInfo与domainUserInfo?

问题

我正在创建一个禁止重命名的NSFileProviderUserInteractions规则,目标是当sourceItem的所有者并非当前登录用户时,禁止执行重命名操作。

我在Info.plist中配置的用户交互规则如下:

<dict>
  <key>ActivationRule</key>
  <string>action == &quot;Rename&quot; AND sourceItem.userInfo.owner != domainUserInfo.user</string>
  <key>SubInteractions</key>
  <array>
    <dict>
      <key>ActivationRule</key>
      <string>TRUEPREDICATE</string>
      <key>Alert</key>
      <dict>
        <key>LocalizedRecoveryOptions</key>
        <dict>
          <key>Cancel</key>
          <string>OK</string>
        </dict>
        <key>LocalizedSubTitle</key>
        <string>Only owners can rename items.</string>
        <key>LocalizedTitle</key>
        <string>Forbidden action</string>
        <key>RecoveryOptions</key>
        <dict>
          <key>Continue</key>
          <false/>
        </dict>
      </dict>
    </dict>
  </array>
</dict>

但看起来sourceItem.userInfo.owner != domainUserInfo.user这一比较逻辑并未生效,同时控制台出现错误:

[ERROR] User interaction  is not a dictionary

而如果我将ActivationRule硬编码为:

<key>ActivationRule</key>
<string>action == &quot;Rename&quot; AND sourceItem.userInfo.owner != "current_user_id"</string>

则行为符合预期(仅非当前用户所有的项目会被禁止重命名)。请问是否有办法在ActivationRule谓词中正确比较sourceItem.userInfo与domainUserInfo?

解决方案

  1. 替换直接引用为自定义变量
    domainUserInfo.user无法直接在Info.plist的谓词中引用,需要通过扩展代码将当前用户ID注入为规则可用的变量。修改Info.plist中的ActivationRule,使用自定义变量占位符:
<key>ActivationRule</key>
<string>action == &quot;Rename&quot; AND sourceItem.userInfo.owner != $currentUserID</string>
  1. 在扩展代码中注入变量值
    在NSFileProviderExtension子类中重写userInteractionRules方法,动态将当前用户ID赋值给自定义变量:
override var userInteractionRules: [NSFileProviderUserInteractionRule] {
    guard let currentUserID = domainUserInfo?.userIdentifier else {
        return super.userInteractionRules
    }
    var updatedRules = super.userInteractionRules
    for index in updatedRules.indices {
        guard let predicate = updatedRules[index].activationRule as? NSPredicate else {
            continue
        }
        updatedRules[index].activationRule = predicate.withSubstitutionVariables(["currentUserID": currentUserID])
    }
    return updatedRules
}
  1. 修复控制台字典错误
    控制台的User interaction is not a dictionary错误,通常是Info.plist中规则结构存在格式问题。检查整个NSFileProviderUserInteractions数组,确保每个规则元素都是完整的字典,标签闭合正确,没有多余或缺失的键值对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:30:47