gpt4 book ai didi

objective-c - 在启用/不启用沙箱的情况下在 Cocoa App 中复制文件

转载 作者:行者123 更新时间:2023-12-03 17:52:51 24 4
gpt4 key购买 nike

第一期:无沙盒

我在复制文件时遇到一些代码问题。完全关闭沙箱和此代码。

- (IBAction)installWidget:(id)sender 
{
// copy widgets to users library
NSError* error = nil;

NSString *testUrl = @"~/Library/Widgets/test.wdgt";
if ([[NSFileManager defaultManager]fileExistsAtPath:testUrl]) {
NSLog(@"yes");
}
NSString *testUrl2 = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"test.wdgt"];
if ([[NSFileManager defaultManager]fileExistsAtPath:testUrl2]) {
NSLog(@"yes");
}

[[NSFileManager defaultManager] removeItemAtPath:testUrl error:nil];
[[NSFileManager defaultManager]copyItemAtPath:testUrl2 toPath:testUrl error:&error];

if (error != nil) {
NSLog(@"%@", [error localizedDescription]);
}
}

关闭沙箱后,我收到以下错误。

文件“test.wdgt”不存在。我尝试压缩它,认为这是一个平面文件问题,当将代码从 test.wdgt 更改为 test.zip 时,我得到了同样的错误。该文件包含在资源包中,但不允许我复制它。

我尝试从构建文件夹外部移动应用程序,同样的问题。我也尝试清理构建文件夹同样的问题。

第二期:使用沙盒

启用沙盒后,我收到以下错误。您无权访问目录 Widgets。

授权文件如下所示

<?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>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.assets.movies.read-write</key>
<true/>
<key>com.apple.security.assets.music.read-write</key>
<true/>
<key>com.apple.security.assets.pictures.read-write</key>
<true/>
<key>com.apple.security.files.downloads.read-write</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.print</key>
<true/>
<key>com.apple.security.temporary-exception.files.absolute-path.read-write</key>
<array>
<string>/Users/jon/Library/Widgets/</string>
</array>
</dict>
</plist>

我正在用头撞墙。我尝试添加一个简单的图像,然后用小部件名称替换图像名称,只要禁用沙箱,它就可以很好地复制。我编写了一个适用于我的应用程序的小部件,我想通过允许用户通过单击应用程序中的按钮或菜单项来安装小部件来分发它。如有任何帮助,我们将不胜感激。

最佳答案

关于非沙盒问题,您需要先展开波形符(~),然后才能在文件系统操作的路径中使用它。一种方法是在您创建的字符串上调用 -stringByExpandingTildeInPath,但获取此类文件夹的最佳做法是使用:

NSArray *paths = NSSearchPathForDirectoriesInDomains
( NSLibraryDirectory, NSUserDomainMask, YES);

这将返回一个数组(应该只有 1 个元素),其中包含用户库目录路径的字符串。然后,您可以使用 -stringByAppendingPathComponent: 添加特定的路径元素。

因此,您可以通过以下方式获得完整路径:

NSString *widgetsPath = [[paths objectAtIndex: 0] stringByAppendingPathComponent:
@"Widgets"];

至于在沙箱中执行操作,您当前的代码将由于错误的目录而失败,该目录将无法访问(因为 ~ 被解释为路径组件而不是替换用户的主目录)。但是,您显然不能通过枚举每个用户来在传送代码中使用绝对路径异常。如果您要被沙盒化,您很可能需要找到另一种方法来安装它。您也许可以只打开小部件文件,从而让操作系统为您复制它。否则,您将必须以某种方式征求用户的许可,例如弹出一个打开的窗口并传入用户的 Widget 文件夹的路径。

关于objective-c - 在启用/不启用沙箱的情况下在 Cocoa App 中复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20875083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com