“因为它不受 SIP 保护” - macOS Mojave 中的 Apple 事件错误

2024-04-22

我在 macOS 中有一个正确的沙盒应用程序,Objective-C,它通过 Apple Events 与第三方应用程序(例如 Adob​​e InDesign)进行通信。

在 macOS Mojave 中,由于 Apple 的新 SIP (https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/Introduction/Introduction.html https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/Introduction/Introduction.html) 不允许通信。

我还没有找到任何解决方案。任何帮助表示赞赏。

这是错误消息:

跳过脚本添加“/Library/ScriptingAdditions/Adobe Unit Types.osax”,因为它不受 SIP 保护。

这是对问题的一个很好的总结:https://www.felix-schwarz.org/blog/2018/06/apple-event-sandboxing-in-macos-mojave https://www.felix-schwarz.org/blog/2018/06/apple-event-sandboxing-in-macos-mojave


苹果仍然需要在这方面努力,它并不完美,对用户不友好,也没有很好的文档记录。但这是一个可行的解决方案。

从 OSX 10.14 (Mojave) 开始,如果用户允许您的应用程序与其他应用程序通信,您必须询问 OSX 的系统完整性保护 (SIP)。

为了使其正常工作,您需要向应用程序的 .plist 文件添加一个条目:

key: NSAppleEventsUsageDescription
value: [Some description why you need to use AppleEvents]

Note:您不能为更多应用程序使用更多条目。它的一个条目。因此,请明智地选择您的描述。此描述将显示在 Apple 的对话框中,要求用户接受。

如果您像我一样有 XPC 服务,请将其放在您的主应用程序中,而不是服务中。

现在在您的应用程序中 - 在使用 Apple 事件之前 - 检查当前状态(如果 AppleEvents 允许或不允许)。我写了这个方法:

- (BOOL)checkSIPforAppIdentifier:(NSString*)identifier {

    // First available from 10.14 Mojave
    if (@available(macOS 10.14, *)) {

        OSStatus status;
        NSAppleEventDescriptor *targetAppEventDescriptor;

        targetAppEventDescriptor = [NSAppleEventDescriptor descriptorWithBundleIdentifier:identifier];

        status = AEDeterminePermissionToAutomateTarget(targetAppEventDescriptor.aeDesc, typeWildCard, typeWildCard, true);

        switch (status) {
            case -600: //procNotFound
                NSLog(@"Not running app with id '%@'",identifier);
                break;

            case 0: // noErr
                NSLog(@"SIP check successfull for app with id '%@'",identifier);
                break;

            case -1744: // errAEEventWouldRequireUserConsent
                // This only appears if you send false for askUserIfNeeded
                NSLog(@"User consent required for app with id '%@'",identifier);
                break;

            case -1743: //errAEEventNotPermitted
                NSLog(@"User didn't allow usage for app with id '%@'",identifier);

                // Here you should present a dialog with a tutorial on how to activate it manually
                // This can be something like
                // Go to system preferences > security > privacy
                // Choose automation and active [APPNAME] for [APPNAME]

                return NO;

            default:
                break;
        }
    }
    return YES;
}

像这样称呼它:

[self checkSIPforAppIdentifier:@"com.apple.mail"];

您可以在 AppleEvents.h 中找到详细信息 - 这是所使用方法的副本:

AEDeterminePermissionToAutomateTarget()

讨论:确定当前应用程序是否能够发送 具有给应用程序的给定 eventClass 和 eventID 的 AppleEvent 描述为目标地址描述。

Mac OS 10.14 及更高版本对应用程序提出了额外要求 当他们将 AppleEvents 发送到其他应用程序以确保 用户知道并同意允许此类控制或 信息交换。通常这涉及提示用户 应用程序第一次尝试以安全的方式发送 AppleEvent 到另一个应用程序。

如果用户同意,那么该应用程序可以将事件发送到 目标。如果用户不同意,则任何未来的发送尝试 AppleEvents 将导致失败,并出现 errAEEventNotPermissioned 回。允许在没有提示的情况下发送某些 AppleEvents 用户。将 eventClass 和 eventID 的 typeWildCard 传递给 确定是否允许从此应用程序发送每个事件 到目标。

应用程序无需向目标发送 AppleEvent 即可确定 应用程序,是否允许将 AppleEvents 发送到 具有此功能的目标。如果askUserIfNeeded为真,并且这 应用程序还没有权限将 AppleEvents 发送到 target,然后会询问用户是否可以授予权限;如果 AskUserIfNeeded 为 false 并且未授予权限,则 将返回 errAEEventWouldRequireUserConsent。

目标 AEAddressDesc 必须引用已在运行的应用程序。

Results

如果当前应用程序被允许发送给定的 AppleEvent 到目标,则将返回 noErr。如果当前 不允许应用程序发送事件,errAEEventNotPermission 将被退回。如果目标应用程序没有运行,那么 将返回 procNotFound。如果askUserIfNeeded为假,并且这 尚不允许应用程序向目标发送 AppleEvents, 然后将返回 errAEEventWouldRequireUserConsent。

Mac OS X 线程:

从 10.14 版本开始线程安全。不要在您的设备上调用此函数 主线程,因为如果用户 需要提示同意。

参数:

target:

指向地址描述符的指针。致电之前 AEDeterminePermissionToAutomateTarget,您将描述符设置为 确定 Apple 事件的目标应用程序。目标 地址描述符必须引用正在运行的应用程序。如果目标 应用程序位于另一台计算机上,则远程 AppleEvents 必须是 在该计算机上为用户启用。

theAEEventClass:要确定的Apple事件的事件类 的许可。

theAEEventID:苹果事件的事件ID,判断权限 为了。

AskUserIfNeeded:布尔值;如果为真,并且该应用程序不 但有权将事件发送到目标应用程序,然后 提示用户获取权限。如果为 false,则不提示 用户。

结论:

正如前面提到的,它并不完美。

  • 目标应用程序必须运行 - 否则它将返回 -600
  • 一旦被拒绝,用户只能手动激活它——这感觉不太好和流畅。
  • 它是线程安全的,所以你不应该在主线程中调用它(手动激活的对话框除外)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“因为它不受 SIP 保护” - macOS Mojave 中的 Apple 事件错误 的相关文章

  • iPhone 和加密库

    我想我必须在我的 iPhone 应用程序中使用加密库 我想问你有关苹果公司实施的加密货币出口政策的影响 我需要做一些额外的事情吗 例如填写表格等 1 如果我使用 MD5 进行哈希处理 2 如果我使用对称加密 Thanks EDIT 2009
  • 使用内联样式有哪些风险?

    A 内容安全政策 https developer mozilla org en US docs Web HTTP CSP with a default src or style src指令将阻止内联样式应用于
  • 检查字符串是否是哈希值

    我正在使用 SHA 512 来散列我的密码 当然还有盐 我认为我想要的不可能 但无论如何我们还是要问一下 有没有办法检查字符串是否已经是 SHA 512 或其他算法 哈希值 当用户登录时 我想检查他的密码 如果它仍然是纯文本 则应将其转换为
  • Objective-C中如何使继承的类能够看到父类的隐藏方法[重复]

    这个问题在这里已经有答案了 我有两个类 Class1 和 Class2 第二个类继承自第一个类 我需要重写 Class1 的 update 方法来实现我的目标 继承方法中 update方法的改变是在代码中间进行的 所以我不能使用 超级更新
  • 如何在 Xcode 4 中在 .h 和 .m 之间切换

    刚刚安装的 Xcode 4 到目前为止一切顺利 除了 Apple 更改了所有键盘快捷键 有人知道如何在 h 和 m 之间切换吗 苹果改变了各种快捷键 但要在标头和实现之间切换 新的快捷键是 You can change it back to
  • Swift 闭包作为 AnyObject

    我尝试使用这个方法 class addMethod 在 Obj c 中使用如下 class addMethod self class selector eventHandler imp implementationWithBlock han
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • UISplitViewController - 推送模态视图

    使用 UISplitViewController 时推送模态视图的最佳实践是什么 您会从 RootViewController DetailViewController 还是直接从应用程序委托推送 理想情况下 我想要实现的功能是在基于某些条
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • 确定 NSView 是否绘制的正确方法

    有没有正确的方法来确定是否NSView实际上是否在当前视图层次结构中绘制 考虑以下情况 视图完全在屏幕外 不是强制性的 该视图不在视图层次结构的顶部 The isHidden and isHiddenOrHasHiddenAncestor不
  • 线程 1:信号 SIGABRT - AppDelegate.h

    main m Journey Created by Julian Buscema on 2014 07 13 Copyright c 2014 Julian Buscema All rights reserved import
  • 如何通过辅助功能 API 获取当前所选文本的全局屏幕坐标。

    我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD CTRL D 时显示所选文本的以下弹出对话框 我想实施 我的可可应用程序具有相同的功能 我的应用程序将在后台运行 并显示有关所选文本的一些热键的建议 我已经实现了热键捕获 我只需要
  • 设置 TableView setEditing 时无法选择 UITableViewCell

    我希望能够选择多行 如下所示的默认邮件应用程序 我有一个名为编辑的按钮 可以调用 self myTableView setEditing YES animated YES 编辑按钮成功显示单元格左侧的圆圈 如上所示的邮件应用程序 但是 当我
  • 任何第三方都可以从我的项目加载嵌入式资源吗?

    请参考我的一篇之前的问题 https stackoverflow com questions 14681364 issues passing data from dll to application 我问的是如何从 DLL 加载已编译的资源
  • 创建一个包含 UIViewController 的 UIViewController

    我有一个UIViewController这允许我在视图中显示一些文本 我想添加一个输入法而不将其直接添加到此视图控制器中 此输入法将是一个按钮或一个UITextField 这个输入法会很多 但是每次都会用一个 从设置中选择它 所以我不会有一
  • 如何在 Swift 中调用 Objective-C 实例类型方法?

    我有一个 Objective C 类 如下所示 interface CustomObjectHavingData NSObject property nonatomic strong NSData objWithData instancet
  • 数据加密

    存储大量信用卡信息的数据库是我们刚刚完成的系统中不可避免的一部分 不过 我想要的是卡号的最终安全性 我们可以设置一种加密和解密机制 但我们自己无法解密任何给定的号码 我所追求的是一种即使在数据库级别也能保护这些信息的方法 这样任何人都无法进
  • 如何按字母顺序对 NSMutable 数组中的自定义对象字段进行排序?

    我有一个自定义对象 例如 import

随机推荐