macOS 和 XCode 中开发的辅助权限

2024-02-21

有没有办法在开发过程中默认为我在 XCode 中开发的应用程序提供可访问权限。我的想法是,我可以按下运行键并测试新代码,而无需跳过设置中的麻烦。对于部署来说显然这是行不通的,但是对于开发来说有没有办法将应用程序列入白名单?


EDIT:这是我发现/创建的一种新方法,它很有效,并且还具有首先提示用户的额外好处,可以改善应用程序的入门体验。不幸的是,原始方法(我留在这篇文章的底部)仍然提示应用程序的每个新版本的可访问性。

我必须在我的 macOS 应用程序中实现此功能,并且有另一种想法和方法来实现它,考虑到用户无论如何都需要执行它,我只需让应用程序在每次运行时显示所需的对话,并且在应用程序构建期间,我运行脚本清除现有权限。

作为参考,请参阅v1.3.0 https://github.com/othyn/macos-auto-clicker/tree/v1.3.0 of my 自动答题器 macOS 应用 https://github.com/othyn/macos-auto-clicker, 具体来说:

  • Services/PermissionsService.swift(整个类) https://github.com/othyn/macos-auto-clicker/blob/v1.3.0/auto-clicker/Services/PermissionsService.swift
  • Init/AppDelegate.swift(第 21 行) https://github.com/othyn/macos-auto-clicker/blob/v1.3.0/auto-clicker/Init/AppDelegate.swift#L21
  • Init/AutoClickerApp.swift(第 32 和 40 行) https://github.com/othyn/macos-auto-clicker/blob/v1.3.0/auto-clicker/Init/AutoClickerApp.swift#L32
  • auto-clicker.xcodeproj/project.pbxproj(第 435 行) https://github.com/othyn/macos-auto-clicker/blob/v1.3.0/auto-clicker.xcodeproj/project.pbxproj#L435

这些链接是指向标记版本的链接,因此不应更改或中断。代码有点多,我在这里总结一下。

首先,我创建了一个新类来管理与权限相关的功能,以保持上下文相关:

//
//  PermissionsService.swift
//  auto-clicker
//
//  Created by Ben on 10/04/2022.
//

import Cocoa

final class PermissionsService: ObservableObject {
    // Store the active trust state of the app.
    @Published var isTrusted: Bool = AXIsProcessTrusted()

    // Poll the accessibility state every 1 second to check
    //  and update the trust status.
    func pollAccessibilityPrivileges() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.isTrusted = AXIsProcessTrusted()

            if !self.isTrusted {
                self.pollAccessibilityPrivileges()
            }
        }
    }

    // Request accessibility permissions, this should prompt
    //  macOS to open and present the required dialogue open
    //  to the correct page for the user to just hit the add 
    //  button.
    static func acquireAccessibilityPrivileges() {
        let options: NSDictionary = [kAXTrustedCheckOptionPrompt.takeRetainedValue() as NSString: true]
        let enabled = AXIsProcessTrustedWithOptions(options)
    }
}

然后,我将以下内容添加到我的AppDelegate(记住这是在 Swift UI 中):

//
//  AppDelegate.swift
//  auto-clicker
//
//  Created by Ben on 30/03/2022.
//

import Foundation
import Cocoa

final class AppDelegate: NSObject, NSApplicationDelegate {
    // When the application finishes launching, request the
    //  accessibility permissions from the service class we
    //  made earlier.
    func applicationDidFinishLaunching(_ notification: Notification) {
        PermissionsService.acquireAccessibilityPrivileges()
    }
}

最后,在您的 Swiftui 应用程序初始化中,让我们向用户添加一些 UI 反馈,告知我们正在等待权限并听取该反馈isTrusted我们之前在权限服务类中设置的已发布属性,当用户授予所需权限时,每秒都会轮询以解锁 UI:

//
//  AutoClickerApp.swift
//  auto-clicker
//
//  Created by Ben on 12/05/2021.
//

import Foundation
import SwiftUI
import Defaults

@main
struct AutoClickerApp: App {
    // Create an instance of the permissions service class that we
    //  can observe for the trusted state change.
    @StateObject private var permissionsService = PermissionsService()

    var body: some Scene {
        // Wait for trust permissions being granted from the user,
        //  displaying a blocking permissions view telling the user
        //  what to do and then presenting the main application view
        //  automatically when the required trust permissions are granted.
        WindowGroup {
            if self.permissionsService.isTrusted {
                MainView()
            } else {
                PermissionsView()
            }
            .onAppear(perform: self.permissionsService.pollAccessibilityPrivileges)
        }
    }
}

你可以看到我在上面的应用程序中制作的阻塞视图,Views/Main/PermissionsView.swift https://github.com/othyn/macos-auto-clicker/blob/v1.3.0/auto-clicker/Views/Main/PermissionsView.swift.

然后,为了在应用程序构建期间自动清除权限,我向项目添加了一个新的构建脚本,该脚本针对以下内容运行/bin/sh:

tccutil reset Accessibility $PRODUCT_BUNDLE_IDENTIFIER

正如所见auto-clicker.xcodeproj/project.pbxproj(第 435 行) https://github.com/othyn/macos-auto-clicker/blob/v1.3.0/auto-clicker.xcodeproj/project.pbxproj#L435.

这意味着每个应用程序构建上都会出现系统对话框提示我只需按 + 按钮并添加应用程序。

不幸的是,这是我发现的开发需要这些权限的应用程序的最无摩擦的方法。


过时的答案:

经过一番试验和错误,通过 Xcode(>11,当前 13)新构建系统导航,找到了一种方法来做到这一点。

打开 Xcode 并将其作为前台应用程序(以便它通过其菜单项接管菜单栏),执行以下操作:

  1. 从菜单栏中选择“Xcode”
  2. 如果您的项目还没有工作区,请单击列表底部附近的“另存为工作区...”,然后将工作区保存在您的项目旁边。*.xcodeproj所以它们应该位于同一目录中。从现在开始,您将通过新的方式打开您的项目*.xcworkspace工作空间instead你的*.xcodeproj项目。
  3. 从菜单栏中,再次选择“Xcode”
  4. 单击列表底部附近的“工作区设置...”
  5. 在“派生数据”下选择“工作空间相对位置”,如果您想自定义路径,请立即执行此操作
  6. 点击右下角的“完成”

这使得我们的构建位置*.app项目中的二进制文件,因此很容易找到,同时还允许我们检查源代码管理中的更改,因为我们现在将工作区设置存储在*.xcworkspace file.

接下来,我们现在需要将权限指向上述构建二进制文件位置,因此:

  1. 打开系统偏好设置
  2. 点击“安全与隐私”
  3. 单击右下角的挂锁进行更改
  4. 从左侧列表中选择“辅助功能”
  5. 单击列表左下角的加号按钮,找到*.app文件将其添加到我们放在项目目录中的列表中,这应该类似于$PROJECT_DIR/DerivedData/$PROJECT/Build/Products/Debug/*.app
  6. 如果尚未选中,请单击应用程序左侧的复选框进行选中
  7. 重新启动应用程序

任何构建现在都应该具有相关权限。

但要注意的是,这将覆盖任何存档/产品版本的权限,因为应用程序名称和二进制文件是相同的。不过,它们很容易添加回来,只需删除构建应用程序的权限,然后将其指向您的产品应用程序,通常在/Applications.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

macOS 和 XCode 中开发的辅助权限 的相关文章

  • git Push over sshfs 失败,并显示“关闭 sha1 文件时出错:错误的文件描述符”

    我们使用 sshfs 通过 SSH 安装文件系统 并将其用作 git 存储库协作的远程存储 Mac OSX 10 6 6 到 RHEL 3 服务器 SSHFS 版本 2 2 MacFUSE SSHFS 2 2 0 MacFUSE 库版本 F
  • 如何从 os x 终端启动屏幕保护程序(并锁定屏幕)?

    有没有办法从 bash 脚本启动屏幕保护程序 并锁定屏幕 你试过这个吗 System Library Frameworks ScreenSaver framework Resources ScreenSaverEngine app Cont
  • 制作已准备好开发人员 ID 的 macOS 安装程序包

    注意 这是为了OS X 安装程序 https en wikipedia org wiki Installer macOS 仅包 提交到的包Mac 应用商店 https en wikipedia org wiki Mac App Store遵
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • 如何观察UserDefaults的变化?

    我有一个 ObservedObject在我看来 struct HomeView View ObservedObject var station Station var body some View Text self station sta
  • 在 Xcode5 中使用 XCTest 时 AFNetworking 导致错误

    我正在使用 Xcode 5 现在刚刚开始对现有项目进行单元测试 为此我添加了CocoaTouch Unit Testing Bundle作为我的项目的目标 目标名称是 MyAppTests 我之前使用添加了 AFNetworking 库Co
  • Xcode 错误 - 架构 x86_64 的未定义符号?

    我正在运行 Swift 4 和 Xcode 9 beta 我收到此错误 但我不知道如何解决它 我什至不知道这是什么意思 Undefined symbols for architecture x86 64 T0So22AVCapturePho
  • 为 Swift 对象/属性设置观察者

    我一直在寻找一种在连接到 Mac 的显示器数量发生变化时触发方法的方法 我知道我可以获得 NSScreen screens count 的值 但我需要找到一种方法来在该值发生变化时创建通知或其他内容 或者指示所连接的显示器数量发生变化的其他
  • 如何向 UIView 添加大小调整手柄?

    我试图根据用户请求在运行时动态创建视图 UIImageView 和 UITextView 然后允许用户移动它们并调整它们的大小 除了调整大小之外 我的一切都工作得很好 我尝试使用捏合手势识别器 但发现它对于我想要的东西来说太笨拙了 因此 我
  • 如何右对齐 UILabel?

    Remark 实施 myLabel textAlignment right does not解决了我的问题 这不是我所要求的 我想要实现的是让标签对齐右对齐 为了更清楚地说明 这就是如何left对齐外观 就是这样justify对齐外观 if
  • 将自定义图像设置为 UIBarButtonItem 但它不显示任何图像

    我想将自定义图像设置为 UIBarButtonItem 但它只显示周围的矩形框并且不显示实际图像 func setupBrowserToolbar let browser UIToolbar frame CGRect x 0 y 20 wi
  • 从 iOS 13 开始安排 iOS 后台任务

    我正在实现用于更新数据的BackgroundTasks 框架 但我遇到了以下问题 无法计划刷新App 错误域 BGTaskSchedulerErrorDomain代码 1 空 无法安排数据提取 Error Domain BGTaskSche
  • 不显示 WRITE_EXTERNAL_STORAGE 的权限对话框

    I want to download a file using DownloadManager And DownloadManager wants to WRITE EXTERNAL STORAGE permission I have in
  • 如何使用 Core Graphics 在我的触摸位置绘制一个圆圈?

    新程序员来了 我在尝试使用 Core Graphics 在触摸位置周围绘制描边弧时遇到问题 我有绘制圆圈的方法工作正常 并且我已经测试并在点击屏幕时注册触摸 但是当我尝试在点击时调用绘制圆圈的方法时 我收到错误 CG ContextBlah
  • 可以获取位置,但无法获取航向

    我目前只使用模拟器 但我在 iOS 模拟器上快速使用 CoreLocation 时遇到问题 我得到此代码打印的位置更新 但从未得到标题 我不想当然 我正在尝试制作一个指南针类型的应用程序 它将显示目标的方位 class CompassVie
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 从 python 检测 macOS 中的暗模式

    我正在编写一个 PyQt 应用程序 我必须添加一个补丁 以便在启用暗模式的 Macos 上可以读取字体 app QApplication Fix for the font colours on macos when running dark
  • 获取 Mojave 上的鼠标坐标

    我有一个非常基本的小命令行应用程序 可以在下次单击鼠标时获取鼠标坐标 import
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt
  • 设置/覆盖 UICollectionView 中单元格之间的填充

    我有一个 UICollectionView 但在获取单元格之间的填充时遇到了问题 理论上 我应该能够将屏幕除以 4 并且我可以获得包含 4 个图像的单元格大小 完美地占据屏幕宽度 但是 它选择不这样做 相反 它会创建 3 个具有巨大填充的图

随机推荐

  • 延迟作业和 Mandrill:未初始化常量 Mandrill::API

    我有邮件服务 用户可以上传包含电子邮件和其他一些用户相关数据的 xls 文件来发送电子邮件活动 我遇到了一些超时问题 因为它需要几秒钟的时间来处理 因为我对每封要发送的电子邮件进行了一些验证和配置 例如 将记录保存到数据库 检查过去 30
  • 文件类型的可可图标?

    如果我有一个文件 我可以通过执行以下操作来获取图标 NSImage iconImage NSWorkspace sharedWorkspace iconForFile myFile png 但如果我只是想获取特定文件类型的图标 例如与 pn
  • 在 Apple 平台的 AArch64 汇编中,如何在一行中编写多个语句?

    我正在将一些 Arm64 汇编语言移植到 M1 其中一些是由 C 预处理生成的 其中单个 define宏生成多个以分号分隔的语句 不幸的是 在 M1 上 汇编器将分号视为注释字符 例如 define DEFUN NAME globl NAM
  • 可选框架不起作用(CoreAudioKit 不在模拟器上)

    为了让 MIDI 通过蓝牙工作 我需要使用CoreAudioKit框架 这工作完美 但我无法在模拟器上编译 使框架 可选 没有帮助 错误是ld framework not found CoreAudioKit 我认为它应该按照the doc
  • Azure-Container-Service 中的安装卷不适用于 traefik.toml 和 /var/run/docker.sock

    构建从 VSTS 到 Azure container service 的 CI CD 管道 我在安装 traefik toml 和 docker sock 文件时遇到了问题 部署使用 SSH 隧道创建文件夹 Deploy 并复制 docke
  • C# 有异步函数调用同步函数或同步函数调用异步函数

    我正在编写一个 C Net 4 5 库 用于执行常见的 sql 数据库操作 备份 恢复 执行脚本等 我希望每个操作都具有同步和异步函数 因为控制台和 GUI 应用程序都将使用该库 但我不想到处重复代码 所以在我看来 我有两个选择 编写在同步
  • 使用 insertWithOnConflict 进行更新或插入

    我需要插入或更新 我找到了 SQLiteDatabase 的 insertWithOnConflict 方法 但我不知道它如何检查该条目是否已存在 理论上 我需要一个 Where 参数来检查某个 ID 是否存在 如果存在 它应该替换所有其他
  • .R中的第一个函数

    我不明白 R 中 First 函数的意义 我的原因是 Rprofile 中的任何代码都将在 R 启动时被获取并执行 this First lt function library devtools and this library devto
  • WordPress:如何按 ACF 自定义字段对内容进行排序?

    通过使用高级自定义字段插件 我创建了一个包含 6 种成员资格类型的选择下拉列表 我使用此自定义字段的所有 列表 都被分配为 6 个字段之一 我想通过以下方式显示所有 列表 终极加号最终的专业的商业的商业 Free 按照这个特定的顺序 那些支
  • 将 JavaScript 变量发送到 PHP 变量 [重复]

    这个问题在这里已经有答案了 首先我认为我必须将 JavaScript 转换为 PHP 但后来我发现我不能 因为服务器和客户端执行 所以现在我只想发送一个变量 到 PHP 变量 当我点击一个按钮时 JavaScript 中的该函数就会执行 现
  • Java 和 .Net 正则表达式

    Java 和 Net Framework 正则表达式模式之间的区别 我正在尝试转换我的 Net Framework 但模式无效 谁能指出正则表达式模式的主要区别 例如我们如何命名java中的分组结构等等 有很多差异总结在这里 http ww
  • 比较 C# 中的双精度值

    I ve a double变量称为x 在代码中 x被赋值为0 1我在 if 语句中检查它比较x and 0 1 if x 0 1 不幸的是它没有进入if陈述 我应该使用Double or double 这背后的原因是什么 您能为此建议一个解
  • Selenium - 无响应脚本错误 (Firefox)

    这个问题以前曾被问过 但给出的答案似乎对我不起作用 问题是 当使用 Selenium 打开页面时 我会收到许多 无响应脚本 弹出窗口 引用不同的脚本 当我使用不带 Selenium 的 Firefox 打开页面时 没有出现任何错误 另外 奇
  • 我可以通过编程方式设置 Mercurial 配置选项吗?

    我正在寻找一种设置方法 hgrc配置项 而无需实际编辑文本文件 我正在尝试标准化设置hgrc跨多个开发人员 我想要一个像这样的命令 hg config ui username foo 但这也将该配置更改保存到hgrc file 看起来这应该
  • 通过 javascript 添加的输入字段不在 PHP $_POST 变量中。如何解决这个问题?

    我在 html 表中有一个表单 我通过 jquery 动态地将输入字段添加到表单中 当我在提交表单时进行 var dump 时 POST 数组没有添加的字段 为什么会发生这种情况 这是我的 js 的样子 add more del areas
  • n 个集合的所有组合的交集

    我需要帮助找到一种有效的算法来解决这个问题 Given n未排序的整数集 找到所有可能的组合n以及它们的交集 例如 Input n 3 Set 1 1 10 6 11 14 3 Set 2 3 7 11 9 5 Set 3 11 6 9 1
  • Protractor - 框架中的错误处理

    我们如何处理基于 Protractor Cucumber 的框架中的错误 有断言失败 这是真正的失败 并且 javascript 代码中存在错误 例如 未找到元素 数组为空 未定义的内容等 我希望以优雅的方式处理后者 目前量角器测试因上述错
  • 限制批处理脚本中生成的进程数量

    我遇到的情况与中描述的情况非常相似这个问题 https stackoverflow com questions 17236456 limiting the number of subshells spawned 但是是批量的 不是外壳 我制
  • 如何使用java解决selenium webdriver中的超时错误?

    My Html
  • macOS 和 XCode 中开发的辅助权限

    有没有办法在开发过程中默认为我在 XCode 中开发的应用程序提供可访问权限 我的想法是 我可以按下运行键并测试新代码 而无需跳过设置中的麻烦 对于部署来说显然这是行不通的 但是对于开发来说有没有办法将应用程序列入白名单 EDIT 这是我发