我是OS X应用程序开发的新手,所以请携带我.....我有一个OS X应用程序,该应用程序广泛使用WebView为用户提供视频会议/屏幕截图功能,该功能依赖于一个浏览器插件.当我禁用沙盒时,视频插件可以正常工作,但是我们想在OS X App Store中分发我们的应用程序,并且需要使其与沙盒浏览器一起使用. 我的问题是,如何启用沙箱并让我的沙盒网络视图包含浏览器插件?我可以将插件与应用程序捆绑在一起,并使用包含的插件初始化WebView?在Apple开发人员文档或Interwebs上的某个地方,是否有一个例子? 解决方案 简单答案:以32位的运行. 更长的答案:在10.7上,您可以在沙箱中加载捆绑的插件(从捆绑包的内容/插件文件夹中),只要您添加com.apple.webkit.pluginagent的临时Mach-lookup例外 - 和64位二进制文件.在10.8时,当运行为64位时,将报告该插件可用,但将永远不会加载,并且没有登录到控制台以指示原因(或任何出
以下是关于 appstore-sandbox 的编程技术问答
我有一个本机MacOS应用程序Messer,该应用程序允许转换/调整/PAD图像文件.我内置的一个功能是在特定文件夹中自动转换文件. 此功能在大多数文件夹上都可以很好地工作,即使它可能需要访问它们的权限.例如,选择Downloads文件夹以自动转换触发一个权限对话框,以供用户授予访问. Desktop文件夹也是如此,即使在Desktop文件夹上授予了权限,我在尝试在子目录中复制文件时也会遇到错误. 错误输出: 2022-04-27 13:35:04.255243+0200 Messer[1254:11983] open on /Users/osp/Desktop/posts/a-plus-content-4.png: Operation not permitted Messer, could not copy file Error Domain=NSCocoaErrorDomain Code=513 "“a-plus-content-4.png” couldn’t
我有一个用Swift 3.0编写的可可应用,该应用程序使用使用C ++/Boost编写的框架来接收套接字上的UDP数据.但是,当Cocoa应用程序中打开App Sandbox功能时,我没有从套接字中接收任何数据,我也使用该数据将数据首先发送到服务器.当关闭App Sandbox时,所有内容都按预期工作. 授权com.apple.security.network.client and om.apple.security.network.server设置为是. 我可以做些什么使其与App Sandbox打开(Mac App Store中的应用程序是必需的)? 解决方案 可以使用以下权利允许UDP/TCP套接字连接: com.apple.security.network.client com.apple.security.network.server 根据苹果的" 安全提升特权"文档中的部分,打开原始插座或低于1024(UDP/TCP)的端口号需要提高特权.在沙盒应用中
我使用Audiokit的应用程序在没有沙箱的情况下运行完美.但是,一旦我在XCode中启用沙箱,应用程序试图初始化MIC访问时就会崩溃. (该应用程序在iOS的应用商店中,但现在我试图以OS X App提交Mac Store,但我需要启用Sandbox) 是否有人能够在其中使用Audiokit提交Mac应用程序? 错误:> avae> avaudioEngine.mm:275:附钉:必需条件 是错误的:node != nil 解决方案 要在App Store Sandbox中启用麦克风访问,您需要添加以下权利: com.apple.security.device.audio-input 请参阅沙盒的参考:启用硬件访问 其他解决方案 此权利文件确实对我有用.但这并不能涵盖所有情况. 请查看Apple文档以获取更多详细信息/library/archive/technotes/tn2312/_index.html
我有一个非常简单的应用程序,该应用程序仅在A WKWebView中显示一个网站,但是在升级到Macos Mojave之后,我会收到一些奇怪的警告消息. 该应用程序编译但没有启动. 我的代码: @IBOutlet var webView: WKWebView! override func loadView() { webView = WKWebView() webView.navigationDelegate = self view = webView } override func viewDidLoad() { super.viewDidLoad() let url = URL(string: "https://www.apple.com")! webView.load(URLRequest(url: url)) } 我得到的警告: 2018-10-08 19:27:24.466406+0200 MyApp[6
目前,我正在尝试进行迅速编程.我尝试从我的 macOS Swift应用程序中执行命令行命令.没有设置我的应用程序,所有的东西都可以正常工作.但是,由于我激活了沙盒,因此命令将不再起作用,但不会引发任何错误并使用状态代码0终止. 所以最简单的用例是从我的应用程序启动VSCode 负责执行shell命令的方法如下: func executeUserCommand(command: String, args: [String]?) -> Int32{ let task = Process() task.launchPath = "/usr/local/bin/" + command task.arguments = args task.launch() task.waitUntilExit() return task.terminationStatus } } 因此,
im使用Swift,我显示了Nsopenpanel.在代表中,我需要查看发件人的提示,以区分要采取的操作: ,例如 func show() { ... panel.delegate = self panel.prompt = "xy" panel.run .... } func show2() { ... panel.delegate = self panel.prompt = "abc" panel.run .... } //delegate func panel(sender: AnyObject, shouldEnableURL url: NSURL) -> Bool { let panelPrompt = (sender as! NSOpenPanel).prompt ... } 没有沙盒=工作正常 代表的发件人确实是Nsopenpanel 用沙盒=铸造失
我正在使用Swift,Sandboxed的OS X 10.9的应用程序. 该应用需要访问SQLite数据库文件.我让用户使用Nsopenpanel选择/打开文件.然后,我使用nsuserdefaults保存文件路径以供以后使用. 我希望每次启动应用程序再次启动时自动打开此文件.我从NsuserDefault获得了存储的路径,但是当我使用此路径打开文件时,我会出现一个错误,说我无权访问该文件. (它在没有沙箱的情况下工作) 看起来书签是解决我问题的方法. 是否有一个很好的教程如何将书签与Swift一起使用OSX应用? 还有其他建议吗? 解决方案 这是我的答案,我刚刚在Swift 3中工作了 http://swiftrien.blogspot.com/2015/07/persisting-file-access-rights-betne.html import Foundation import Cocoa var bookmarks = [UR
我正在尝试为Mac App Store提供一个应用程序,该应用程序将在用户设定时间后关闭/睡觉.我尝试使用AppleScript,但是如果要在沙盒模式下使用它,那将无法使用它,我尝试使用Google以获取解决方案,但我似乎无法弄清楚. 希望有人可以给我提示或链接到相关文档. 编辑:使我想要完成的目标更加精确. 解决方案 无法做到这一点.您可能会尝试获得临时检查,以通过BSD层运行"关闭"或"停止",但我怀疑这样的应用程序是否会通过App Store评论,因为这些任务是需要Superuser/Admin权利的任务. 其他解决方案 我曾经写过一个脚本.但是我不知道它是否仍然有效.也许它至少给了您一个线索.睡眠仍然有效 - 关闭可能会导致问题阻止关闭. (不是最漂亮的代码,但对我有用.) #/bin/sh #v1.0.0 #by Sapphire echo "-----------------------------------------------
是否可以拥有一个在沙箱中运行的应用程序,执行shell脚本? 该脚本使用两个基本命令: defaults write killall 我知道沙箱有一些例外,可以通过权利文件添加,但是不确定是否可以让用户确认执行小脚本并运行它? 请给我一个实用的提示... 当我使用沙盒运行应用程序时,一切正常. 在两个命令上使用沙箱都无法正常工作,这在控制台中显示: killall: warning: kill -TERM 12322: Operation not permitted 解决方案 您为什么首先要打磨如此强大的应用程序?您是否要修改默认值和Killall作为特定的其他应用程序(以某种方式)或"机器上所有存在的应用程序"? 如果对于特定的其他应用程序,为什么不用外壳进行呢? 对于默认,写入com.apple.security.temporary-exception.shared-preference.read-write并添加要修改的域(例如com.apple.
我想通过不同的OSX快捷方式触发屏幕截图.因此,我添加了一个带有kMDItemIsScreenCapture的观察者.以下代码用于添加观察者. _query = [[NSMetadataQuery alloc] init]; [_query setDelegate:self]; [_query setPredicate:[NSPredicate predicateWithFormat:@"kMDItemIsScreenCapture = 1"]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenshotQueryUpdated:) name:NSMetadataQueryDidUpdateNotification object:_query]; [_query startQuery]; screenshotQueryUpdated的实现如下: NSMetada
我正在尝试使用AppleScript来控制Apple Photos在QT C ++应用程序中必须在MacOS App Store所需的沙盒环境中运行的QT C ++应用程序. 我试图通过qprocess启动osascript来运行AppleScript,例如: const QString aScript = QString( "tell application \"Photos\"\n" " set selMedia to (get media items whose id contains \"%1\")\n" " if not (album \"Trash from %2\" exists) then\n" " make new album named \"Trash from %2\"\n" " end if\n" " add selMe
-[NSURL startAccessingSecurityScopedResource]状态的文档: 您必须通过对stopaccessingsecurityscopedresource方法进行相应的调用来平衡对startaccessingsecurityscopedresource方法的每个呼叫.如果您不再需要文件系统资源时无法放弃访问权限,则应用程序会泄漏内核资源.如果泄漏了足够的内核资源,您的应用程序将失去将文件系统位置添加到其沙箱中的能力,例如通过PowerBox或安全性的书签,直到重新启动为止. . 任何人都可以阐明内核资源的限制是什么? 我不希望使我的应用达到这些确切的限制,只是知道一个球场数字会很有帮助,这样我就可以判断代码是否曾经做任何危险/愚蠢的事情. 解决方案 球场数字在1000到2500之间.我在苹果的开发人员论坛上阅读了三次讨论.如果您是Apple的注册开发人员,则可以在这里找到它: 超过一千多: startAccessingSe
aim 获得读取应用程序沙箱环境外的文件的访问,而无需直接选择文件. 这个想法是用户选择一个FCPXML文档(通过Nsopenpanel),然后将其解析,然后收集所有FilePath字符串.然后,我从filepaths创建URL对象,然后在以后在这些URL上读取这些文件. 问题: 启用了应用SandBoxing,我无法访问我使用URL方法INIT创建的文件URL(fileurlwithpath). 权利" com.apple.security.files.user-selected.read-write"似乎只让我访问用户选择的XML文件,而不是FCPXML文档中的引用文件. . 任何人都可以推荐一种能够做到这一点的方法吗? 欢呼! 亚当 解决方案 您没有指定有关要收集的路径的详细信息.它们是相对于XML文档的,还是总是指某个文件夹中的文件? 如果保证您要收集的路径总是指向一个通用系统文件夹(例如"电影"或"音乐"),您可以
我已经制作了Finder extension将菜单添加到Finder的上下文菜单中的任何文件.当用户选择此自定义菜单时,我想访问此文件,显然,他们选择的此文件可以在文件系统和允许的沙盒区域外的任何地方. func accessFile(url: URL, userID: String, completion: @escaping ([String:Any]?, Error?) -> Void){ var bookmarks = NSKeyedUnarchiver.unarchiveObject(withFile: bookmarksPath) as? [URL: Data] print("Testing if we have access to file") // 1. Test if I have access to a file let directoryURL = url.deletingLastPathComponent() let
我正在遇到问题(在Mojave和Catalina上),并在我的应用程序中的应用程序启动之间进行"重复使用"安全范围URL书签. 使用libarchive框架的简单解压缩应用程序.用户选择要解压缩的文件,我想存储其父文件夹的URL书签(例如〜/Desktop),然后重复使用下一次用户尝试将文件解压缩到同一文件夹中. 首先,我在应用程序的权利文件中添加了以下内容: com.apple.security.app-sandbox com.apple.security.files.bookmarks.app-scope com.apple.security.files.user-selected.read-write 第一次访问文件(分别访问parent文件夹)时: 用户选择文件解压缩 我呈现NSOpenPanel获取对文件文件夹的访问: let d
我正在创建一个应用程序,该应用程序正在应用程序沙箱外读取文件.我需要用户的权限来读取这些文件,并通过使用户选择NSOpenPanel> 中的路径来获得安全策划的书签. 我的问题是,每当应用程序访问相同的路径时,我不希望用户允许我许可.我将书签保存在NSApplicationSupportDirectory文件夹中. 这可以正常工作,直到用户重新启动计算机为止,然后保存的书签似乎无效.从磁盘加载时,书签数据看起来完全不错,但是该应用程序需要新的安全性书签才能读取文件,即使应用程序正在使用重新启动之前使用的路径的书签. 我正在创建这样的书签: NSData * bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:&err]; NSURL* bo
我为MacOS开发了一个应用程序,它允许用户管理其计算机的所有文件. 我找到了权利键: com.apple.security.files.all /antitlements/com_apple_security_files_all?language = objc 但已弃用. 我切换到另一种方法: com.apple.security.temporary-exception.files.absolute-path.read-write / 基本上可以满足我的需求,尽管体验不是很好.但不幸的是,苹果认为这是不合适的.这是苹果的答复: 我们已经确定一个或多个临时权利例外 该应用程序要求的不合适,也不会被授予: com.apple.security.temporary-exception.files.absolute-path.read-write
我有一个Mac应用程序,其中我正在删除用户主目录中的一些数据. 我的应用程序被拒绝说以下原因. The app only finds files in the ~/Downloads folder. It would be appropriate to have the user grant access to the Home folder. 所以我使用Nsopenpanel向用户询问访问权限,但我不知道如何访问用户的隐藏文件夹. 编辑 我已经成功启用了我的应用程序的沙箱,但是现在在允许按钮上,我该怎么办? 请引导我... 任何帮助都将不胜感激. 预先感谢... 解决方案 我花了一些时间研究这个问题,我可以说,如果您想要一个简单的解决方案,可以访问应用程序沙箱之外的文件,那是不可能的. ,即使您愿意为更艰难,更具技术性的解决方案而努力,仍然可能是不可能的. You should look at this section in
我已经在Mac App Store中写了一个程序,该程序显示了一些图形.有时它会从互联网上更新这些.与大多数人一样,我现在必须沙箱. 几乎所有内容都在起作用,但是在更新它时,将文件保存在我自己的应用程序的捆绑包中,并以'sandboxd:deny file-write-create' 失败 我只使用fopen(...," wb") 传递到fopen的路径是: /users/myuser/library/developer/xcode/deriveddata/myapp-czuwveatgjffaggjfagggwqjdqjdqjdqjdqpobjqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqs/products/debug/debug/my.app/conp/contents/contents/resources/re