如何解决Xamarin.Mac 使用安全范围的书签
微软官方文档说:
尝试在 SandBox 之外访问持久化,但它不起作用。
首先,我根据 SandBox 安全策略使用 NSSavePanel.SavePanel
并将我可以访问的 URL 加入书签。
using (var dlg = NSSavePanel.SavePanel)
{
dlg.AllowedFileTypes = new[] { "zip" };
dlg.Prompt = "Authenticate";
if (dlg.RunModal() > 0)
{
NSError error;
NSData url = dlg.Url.CreateBookmarkData(NSUrlBookmarkCreationoptions.WithSecurityScope,null,out error);
}
}
然后我检索经过访问验证的书签并使其可访问。
NSData data = new NSData();
NSUrl url = NSUrl.FromBookmarkData(data,NSUrlBookmarkResolutionoptions.WithSecurityScope,out bool isstale,out NSError error);
url.StartAccessingSecurityScopedResource();
//...
url.StopAccessingSecurityScopedResource();
但是,上面的url
只会包含null
,这会导致错误。
我怎样才能让它发挥作用?
我们首先需要在 NSData data
的值中放入任何东西吗?
解决方法
你混淆了一些东西。您的代码
using (var dlg = NSSavePanel.SavePanel)
{
dlg.Message = AppResources.DialogMessageSaveEncryptedFileName;
dlg.AllowedFileTypes = new[] { "zip" };
dlg.Prompt = "Authenticate";
if (dlg.RunModal() > 0)
{
NSError error;
//NSData url = dlg.Url.CreateBookmarkData(NSUrlBookmarkCreationOptions.WithSecurityScope,null,out error);
NSData bookmark = dlg.Url.CreateBookmarkData(NSUrlBookmarkCreationOptions.WithSecurityScope,out error);
}
}
dlg.Url
是您要访问的网址。
您从 dlg.Url.CreateBookmarkData()
返回的是编码的书签数据。您可以以任何方式存储此数据,以便在应用程序启动时将其持久化。例如在 UserDefaults
存储:
NSUserDefaults.StandardUserDefaults["bookmark"] = bookmark;
NSUserDefaults.StandardUserDefaults.Synchronize();
稍后检索:
NSData bookmark = NSUserDefaults.StandardUserDefaults.DataForKey("bookmark");
这是你的数据
放入 NSUrl.FromBookmarkData
以取回网址。
//NSData data = new NSData();
//NSUrl url = NSUrl.FromBookmarkData(data,NSUrlBookmarkResolutionOptions.WithSecurityScope,out bool isStale,out NSError error);
NSUrl url = NSUrl.FromBookmarkData(bookmark,out NSError error);
url.StartAccessingSecurityScopedResource();
//...
url.StopAccessingSecurityScopedResource();
另外,如果您需要继续使用访问权限,请注意 isStale
的 CreateBookmarkData
返回值。如果返回 true,您需要使用 url.CreateBookMarkData
从 url 刷新书签,并将存储的书签替换为新书签。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。