首先,一些背景信息来解释我的动机:我有一个 Qt/C++/Objective-C++ 应用程序,它使用 CoreAudio/AVFoundation 从 Mac 上的指定音频输入接收传入的音频,修改音频,然后播放修改后的音频音频通过某些指定的音频输出返回。在 Mojave 和 Catalina 之前,这一切都很好,此时 Apple 的新麦克风隐私限制导致它无法再接收传入的音频(由于缺乏明确的用户使用权限,它只接收零/静音麦克风)。
为了解决这个问题,我通过新获取最user's-允许添加的代码来跳火圈(即加了NSMicrophoneUsageDescription标签Info.plist中,加入电话authorizationStatusForMediaType和requestAccessForMediaType建议作为,等等),现在我的应用程序再次工作当预期从它的图标启动(即它提出“MyAudioProcessingApp 想要使用麦克风”请求者,一旦用户响应,我的应用程序的复选框就会出现在“安全和隐私/隐私/麦克风”控制面板中,并控制是否或不是我的应用程序可以收听传入的音频)。就目前而言,这一切正常。
我的问题是——我的应用程序还有一个“后台模式”功能,用户可以要求应用程序将自身安装为非 GUI 系统服务(它在启动时通过 launchd/launchctl 运行),这样它就会Mac 一启动就在后台进行音频处理(即不需要任何人登录或手动启动应用程序)。对于想要在“无头/嵌入式”mac 上运行此应用程序作为固定音频安装的一部分的人来说,这非常有用,任何人都需要做的就是打开 Mac 以使其开始处理音频。
但是,我发现当我的应用程序以这种方式作为后台进程运行时,[AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio]总是返回AVAuthorizationStatusDenied,即使用户之前已授予我的应用程序访问麦克风的权限。即使进程的有效用户 ID 与授予麦克风权限的用户相同,并且运行的可执行文件与先前生成用户同意的权限提示的文件相同,也会发生这种情况。
我的问题是,在后台运行时是否需要一些特殊技巧才能访问麦克风?或者 Apple 是否认为 launchctl-launched-daemons 在任何情况下都无法访问麦克风,因此我很不走运?
ps 我的应用程序的MyAudioProcessingApp.app/Contents/Info.plist文件和/Library/LaunchDaemons/com.mycompany.myprogram.plist文件(都略微匿名)如下,以防它们相关:
----- begin MyProcessingApp.app/Contents/Info.plist ------- snip ------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>MyAudioProcessingApp</string>
<key>CFBundleGetInfoString</key>
<string>Created by Qt/QMake</string>
<key>CFBundleIconFile</key>
<string>vcore.icns</string>
<key>CFBundleIdentifier</key>
<string>com.mycompany.MyAudioProcessingApp</string> …Run Code Online (Sandbox Code Playgroud) 我有一个~/Library/LaunchAgents/setenv.JAVA_HOME.plist文件,其中包含/bin/launchctl如下调用:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>setenv.JAVA_HOME</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>setenv</string>
<string>JAVA_HOME</string>
<string>$(/usr/libexec/java_home -v1.8)</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
问题是,$(/usr/libexec/java_home -v1.8)表达式没有被求值,而是JAVA_HOME环境变量被赋予了文字值$(/usr/libexec/java_home -v1.8)。
问题是:是否可以编写我的 plist 文件,以便对表达式进行求值而不是将其视为文字值?如果是这样,怎么办?
我一直无法弄清楚为什么launchctl说这.plist是无效的。
我正在尝试每天早上 8 点运行一次 Python 脚本。第一个程序参数是 pyenv virtualenv 二进制文件的路径,第二个是我的 Python 脚本。
有没有一种方法可以验证我在这个.plist文件中的正确或错误?launchctl它返回的错误并不明显,它只是:
无效的属性列表。
我知道有一些工具可以创建和管理这些工作,但我想更好地了解幕后发生的事情。
这是我的.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.conall.autowallpaper</string>
<key>ProgramArguments</key>
<array>
<string>/Users/conall/.pyenv/versions/3.6.2/envs/auto_wallpaper-3.6.2/bin/python</string>
<string>/Users/conall/python/projects/auto_wallpaper/auto_wallpaper.py</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<Key>Minute</Key>
<integer>0</integer>
<key>Hour</key>
<integer>8</integer>
</dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下命令找出现在加载了多少启动代理
find /System/Library/Launch* /Library/Launch* ~/Library/Launch* -name '*.plist' -exec sh -c '/usr/libexec/PlistBuddy -c "Print Label" {} && echo {}' ';' | grep -wf <(launchctl list | grep -o "\S\+\..*$") -A1
grep -B 1 -A 1 "active count = 1$" <<< "$(launchctl dumpstate)"
Run Code Online (Sandbox Code Playgroud)
但它没有列出我正在寻找的那个。这是对的吗?
我有以下的launchd配置(存储在acme.plist),该加载和开始使用launchctl load acme.plist和launchctl start acme.plist分别.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.acme</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/java</string>
<string>-jar /usr/local/acme/acme-latest.jar</string>
</array>
<key>StandardErrorPath</key>
<string>/tmp/acme-error</string>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
每当我尝试运行它时,我会得到以下内容/tmp/acme-error:
Unrecognized option: -jar /usr/local/acme/acme-latest.jar
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Run Code Online (Sandbox Code Playgroud)
但是从bash运行时我绝对没有问题.有任何想法吗?
嗨我做了一个集成,使用fastlane创建一个IOS项目的构建.除了我尝试启动脚本以使用launchctl在我的Mac计算机上运行fastlane命令时,一切都按预期工作.当我运行该作业时,我收到以下错误:
/Users/hugoaguero/Documents/acct/branding/usfed/ios/scripts/test.sh: line 2: fastlane: command not found
Run Code Online (Sandbox Code Playgroud)
在我的测试脚本上发生以下两行(部署是我在fastfile文件上创建的一个通道):
cd ~/Documents/acct/branding/usfed/ios/
fastlane deploy
Run Code Online (Sandbox Code Playgroud)
我的pList文件驻留在LaunchAgent文件夹中.这是pList文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.zerowidth.launched.grobankingbuild</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/Users/hugoaguero/Documents/acct/branding/usfed/ios/scripts/test.sh</string>
</array>
<key>StandardErrorPath</key>
<string>/tmp/com.zerowidth.launched.grobankingbuild.err</string>
<key>StandardOutPath</key>
<string>/tmp/com.zerowidth.launched.grobankingbuild.out</string>
<key>StartInterval</key>
<integer>300</integer>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
如果我从终端正常运行命令,它执行没有问题.唯一的问题是它从作业运行时.
我对终端/ Unix很新,我认为它应该是一个简单的解决方案,但需要尽快解决这个问题.请帮忙.
我使用的是 MacBook Pro 2009,它不支持最新的 Docker for Mac。因此,我使用 Docker Machine 方法来启动并运行我的机器上的 Docker。
以下是我用来在我的机器上安装 Docker 的命令:
$ brew install docker docker-compose docker-machine
$ docker-machine create --driver virtualbox default
$ docker-machine env
$ eval $(docker-machine env default)
Run Code Online (Sandbox Code Playgroud)
上面的命令没有任何问题。每次我运行最后一个命令时,Docker 进程都会启动并完美运行。
但是,当我重新启动主机 (MacBook) 时,Docker 机器已死,我看到Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?错误。
我尝试在我的下面放 2 行,.bash_profile但没有用(是的,我已经source这样做了):
docker-machine restart default
docker-machine env
eval $(docker-machine env default)
Run Code Online (Sandbox Code Playgroud)
我还尝试创建 LaunchDaemons .plist 文件以在启动时运行 bash 脚本,但它也不起作用:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE …Run Code Online (Sandbox Code Playgroud)