- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从安全范围的书签解析 NSURL 时,如果用户已重命名或移动该文件或文件夹,则该书签将过时。苹果的文档对于陈旧性有这样的描述:
isStale
On return, if YES, the bookmark data is stale. Your app shouldcreate a new bookmark using the returned URL and use it in place ofany stored copies of the existing bookmark.
不幸的是,这对我来说很少有用。它可能在 5% 的时间内有效。尝试使用返回的 URL 创建新书签会导致错误(代码 256),并且在控制台中查看会显示一条来自 sandboxd 的消息,表示拒绝更新的 URL 上的文件读取数据。
注意 如果重新生成书签确实有效,则似乎只有在第一次重新生成时才有效。如果再次移动/重命名文件夹/文件,它似乎永远不会起作用。
我最初如何创建和存储书签
-(IBAction)bookmarkFolder:(id)sender {
_openPanel = [NSOpenPanel openPanel];
_openPanel.canChooseFiles = NO;
_openPanel.canChooseDirectories = YES;
_openPanel.canCreateDirectories = YES;
[_openPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
if (_openPanel.URL != nil) {
NSError *error;
NSData *bookmark = [_openPanel.URL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:nil
error:&error];
if (error != nil) {
NSLog(@"Error bookmarking selected URL: %@", error);
return;
}
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:bookmark forKey:@"bookmark"];
}
}];
}
解析书签的代码
-(void)resolveStoredBookmark {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSData *bookmark = [userDefaults objectForKey:@"bookmark"];
if (bookmark == nil) {
NSLog(@"No bookmark stored");
return;
}
BOOL isStale;
NSError *error;
NSURL *url = [NSURL URLByResolvingBookmarkData:bookmark
options:NSURLBookmarkResolutionWithSecurityScope
relativeToURL:nil
bookmarkDataIsStale:&isStale
error:&error];
if (error != nil) {
NSLog(@"Error resolving URL from bookmark: %@", error);
return;
} else if (isStale) {
if ([url startAccessingSecurityScopedResource]) {
NSLog(@"Attempting to renew bookmark for %@", url);
// NOTE: This is the bit that fails, a 256 error is
// returned due to a deny file-read-data from sandboxd
bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:nil
error:&error];
[url stopAccessingSecurityScopedResource];
if (error != nil) {
NSLog(@"Failed to renew bookmark: %@", error);
return;
}
[userDefaults setObject:bookmark forKey:@"bookmark"];
NSLog(@"Bookmark renewed, yay.");
} else {
NSLog(@"Could not start using the bookmarked url");
}
} else {
NSLog(@"Bookmarked url resolved successfully!");
[url startAccessingSecurityScopedResource];
NSArray *contents = [NSFileManager.new contentsOfDirectoryAtPath:url.path error:&error];
[url stopAccessingSecurityScopedResource];
if (error != nil) {
NSLog(@"Error reading contents of bookmarked folder: %@", error);
return;
}
NSLog(@"Contents of bookmarked folder: %@", contents);
}
}
当书签过时时,生成的解析 URL 确实指向正确的位置,尽管 [url startAccessingSecurityScopedResource] 返回 YES,但我实际上无法访问该文件。
也许我误解了有关过时书签的文档,但我希望我只是做了一些愚蠢的事情。每次重命名或移动带书签的文件/文件夹时弹出 NSOpenPanel,这是我目前唯一的其他选择,似乎很荒谬。
我应该补充一点,我有com.apple.security.files.bookmarks.app-scope,com.apple.security.files.user-selected.read-write em> 和 com.apple.security.app-sandbox 在我的权利文件中全部设置为 true。
最佳答案
经过大量令人失望的测试后,我得出以下结论。虽然合乎逻辑,但它们令人失望,因为用户的最终体验远非理想,并且对开发人员来说是一个巨大的痛苦,这取决于他们愿意在多大程度上帮助用户重新建立对书签资源的引用。
当我在下面说“更新”时,我的意思是“使用从过时书签解析的 URL 生成一个新书签来替换过时书签。”
只要在您的应用已有权访问的目录中移动或重命名添加书签的资源,续订始终有效。因此,默认情况下,它始终在应用程序的容器文件夹中运行。
如果将添加书签的资源移动到您的应用程序无权访问的文件夹中,则续订会失败。例如用户将文件夹从容器文件夹拖到容器文件夹外部的某个文件夹。您将能够解析该 URL,但无法访问或续订书签。
如果加书签的资源位于您的应用程序无权访问的文件夹中,然后被重命名,则续订会失败。这意味着用户可以显式授予您的应用程序对资源的访问权限,然后仅通过重命名即可无意中撤销该访问权限。
如果将资源移动到另一个卷,解决方案将失败。不确定这是否是书签的一般限制或仅在沙盒应用程序中使用时的限制。
对于问题 2 和 3,您作为开发人员处于一个不错的位置,因为添加书签的 URL 的解析确实有效。您至少可以通过准确地告诉用户需要哪些资源来授予您的应用程序访问权限以及这些资源的位置来引导用户。通过让他们选择一个包含(直接或间接)您需要为其续订书签的所有资源的文件夹,可以改善体验。这甚至可能是卷,如果他们愿意为您的应用程序提供这么多访问权限,则可以完全解决问题。
对于问题 4,解决方案根本不起作用。用户将不得不在没有任何提示的情况下重新定位文件,因为您无法解析新位置。我在当前的应用程序中所做的一件事减轻了这个问题的痛苦,那就是向我存储书签的任何资源添加扩展属性。这样做至少可以让用户选择一个文件夹来搜索以前关联的资源。
令人沮丧的限制,但书签仍然胜过存储静态路径。
关于cocoa - 处理过时的 NSURL 书签的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23954662/
我正在尝试创建一个在线书签系统。我已经设法从用户那里获取 URL 并将其存储到数据库中。但我也想采用“标题和标签”谁能帮我编写代码.. function add_bm($new_url) {
我目前正在开发一个动态使用数据库的应用程序。 这意味着它被设计为可以在任何时间、任何结构上与任何数据库一起使用。 我担心的是,我希望对某些记录进行“标记”或添加书签,因此我需要使用 Filter 属性
我正在创建一些许多人称之为书签栏的东西,但在网站本身内。基本上我有一个常规的 Bootstrap navbar很少有菜单项上有“图钉”。通过按图钉,用户可以固定该菜单项以快速访问我创建的侧边栏。 现在
我最近在聊天部分了解到,如果使用书签,则可以渲染 LaTeX: http://meta.math.stackexchange.com/a/3297 stackexchange 站点都渲染代码像这样。
我有这个可爱的 javascript 书签... javascript:var nam="blablabla&name"; var els=document.getElementsByName
我经常使用网页的三种变体,1) 开发网址,2) 预览/暂存网址,以及 3) 实时网址。 我想创建一个链接(小书签?)然后我可以添加到我的书签栏,这将更改部分 URL 字符串(基本上是页面名称),然后将
这个问题在这里已经有了答案: Add to browser favorites/bookmarks from JavaScript but for all browsers (mine doesn'
我正在尝试编写一个小书签来检测用户是否在已解析的页面上,如果他不在,则应将值传递给 API。 if (window.location.indexOf("thequeue.org") >= 0) {
有没有人知道为什么下面的 JavaScript 代码在 Firefox 上没有任何问题,并且在 IE7 上也能正常工作,但在 IE8 上却不行了?我不知道,我很感激任何提示:-) 我已将该代码作为收藏
一个页面中有很多链接,我需要快速单击其中包含文本“删除”的链接。这会导致 AJAX 请求,因此需要稍微暂停一下。什么是 JavaScript 书签代码(没有库,例如 jQuery),它将快速调用直接作
我需要一个可以单击按钮的 JavaScript 书签。问题是,页面上有 100 多个按钮,它们的值都相同。名字很独特,但是很长。 元素的全名类似于: actions[http://apps.faceb
我在制作 javascript 书签时遇到了问题,其中的代码同时包含 "" 引号和 '' 引号。举例来说,我的代码如下, Temporary HTML Doc
希望大家帮帮我。我似乎无法弄清楚如何制作一个小书签来选择网页下拉菜单中的选项。 希望实现:在我的chrome浏览器上做一个书签。当我在此页面上单击它时,它将选择下拉列表并在成员框中选择级别 2 网页的
当我浏览文件系统时,我设法在一个窗口中完成了繁琐的工作。 改善人体工程学,我决定为我最常用的目录创建书签,其短名称如:'lwt'、'eve' 等。但每次打开书签时,都会创建新的目录缓冲区,即使旧缓冲区
我正在努力了解 HATEOAS。 让我们通过一个例子来工作。客户端将浏览器加载到 getemails.com。为简单起见,让我们假设对 getemails.com 的调用访问了服务器并返回一个电子邮件
我想每周在 Safari 中备份一次。告诉我如何使用终端命令导出书签?谢谢你。 最佳答案 plutil -convert xml1 -o ~/Desktop/SafariBookmarks.xml ~
我想知道我们如何从 Mac OS X 上的另一个 Cocoa 应用程序访问 Safari 书签,以一种对 future 安全的方式。 您可能知道,检索 Safari 书签的常见机制有两种: 要么阅读
有谁知道如何通过 SDK 以编程方式访问“ map ”应用程序的书签?如果可能的话,我想阅读和书写书签。有想法吗? 谢谢! 最佳答案 我很确定答案是否定的。我考虑了两种可能的解决方案: 您可以直接访问
谁能告诉我怎么转 Top 又名页面顶部链接到书签。 不太了解 JavaScript,无法实现我想要的效果。 或者,如果我使用了错误的代码,那么你能不能帮我修好它,然后把它变成小书签。 最佳答案 创建
如何在vim中设置书签?我想为一些行和函数添加书签。你如何在代码上做书签?我的代码是用 C 编写的。 最佳答案 如果您输入 ma ,它将在当前位置的当前行上创建书签,名称为 a . 例如,键入 ma在
我是一名优秀的程序员,十分优秀!