如何在FileProvider扩展ActivationRule中比较sourceItem.userInfo与domainUserInfo?
问题
我正在创建一个禁止重命名的NSFileProviderUserInteractions规则,目标是当sourceItem的所有者并非当前登录用户时,禁止执行重命名操作。
我在Info.plist中配置的用户交互规则如下:
<dict> <key>ActivationRule</key> <string>action == "Rename" 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 == "Rename" AND sourceItem.userInfo.owner != "current_user_id"</string>
则行为符合预期(仅非当前用户所有的项目会被禁止重命名)。请问是否有办法在ActivationRule谓词中正确比较sourceItem.userInfo与domainUserInfo?
解决方案
- 替换直接引用为自定义变量
domainUserInfo.user无法直接在Info.plist的谓词中引用,需要通过扩展代码将当前用户ID注入为规则可用的变量。修改Info.plist中的ActivationRule,使用自定义变量占位符:
<key>ActivationRule</key> <string>action == "Rename" AND sourceItem.userInfo.owner != $currentUserID</string>
- 在扩展代码中注入变量值
在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 }
- 修复控制台字典错误
控制台的User interaction is not a dictionary错误,通常是Info.plist中规则结构存在格式问题。检查整个NSFileProviderUserInteractions数组,确保每个规则元素都是完整的字典,标签闭合正确,没有多余或缺失的键值对。
内容的提问来源于stack exchange,提问作者mixtly87
相关产品推荐
相关产品推荐

