设备锁定时在 Today 扩展中加载文件
Posted
技术标签:
【中文标题】设备锁定时在 Today 扩展中加载文件【英文标题】:Load file in Today extension when device is locked 【发布时间】:2014-09-19 16:09:58 【问题描述】:在我今天解锁设备的扩展程序中,这行代码按预期工作,从图像路径返回数据:
let imageData = NSData(contentsOfFile: path)
但是,当我的设备被密码锁定时,它返回 nil。当设备被锁定时,有什么方法可以访问文件系统中的图像?我可以很好地访问 UserDefaults,但不能访问我的共享组目录中的文件。下面是我创建路径的方法,调用imagePath
,在这两种情况下都正确填充了我期望的路径:
func rootFilePath() -> String?
let manager = NSFileManager()
let containerURL = manager.containerURLForSecurityApplicationGroupIdentifier(GROUP_ID)
if let unwrappedURL = containerURL
return unwrappedURL.path
else
return nil
func imagePath() -> String?
let rootPath = rootFilePath()
if let uPath = rootPath
return "\(uPath)/\(imageId).png"
else
return nil
【问题讨论】:
这方面有什么进展吗?我遇到了同样的问题。 不……还没有。这个帖子上的人声称他根本没有问题,虽然我不相信,我觉得文件系统只是用密码锁定了——尽管我还没有搜索过文档. ***.com/a/25844434/431271 【参考方案1】:我刚刚想通了!您需要相应地设置文件权限:
NSFileManager *fm = [[NSFileManager alloc] init];
NSDictionary *attribs = @NSFileProtectionKey : NSFileProtectionNone;
NSError *unprotectError = nil;
BOOL unprotectSuccess = [fm setAttributes:attribs
ofItemAtPath:[containerURL path]
error:&unprotectError];
if (!unprotectSuccess)
NSLog(@"Unable to remove protection from file! %@", unprotectError);
在许多情况下,您通常不希望这样做,但由于信息旨在从锁定屏幕中查看,我可以删除文件保护。
【讨论】:
你能分享完整的代码吗?如果 'containerURL' 为 nil,那么你如何在其上设置属性? @strangetimes 如果它是 nil,那么你遇到的问题比试图取消保护不存在的文件更大。我建议提出一个新问题。 对不起,我以为你在上面说它实际上返回 nil?你是在它给你零时取消保护它,还是在设备没有锁定之前你这样做? @strangetimes 理想情况下,您在编写时取消保护它。此特定代码适用于以前编写的代码,需要将其删除。这只能在设备解锁时完成。 谢谢韦恩。知道了。所以这就是我需要的。我的 SQLite 数据库已经创建,需要删除顶部的安全性。那么这是一个永久性的变化吗,我猜是。以上是关于设备锁定时在 Today 扩展中加载文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Visual Studio 2013 时在 Opencv 2.4.10 中加载文件时出错
Django:在使用模板继承时在基本模板文件中加载自定义过滤器时出现问题