设备锁定时在 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:在使用模板继承时在基本模板文件中加载自定义过滤器时出现问题

在滚动时在 recyclerview 中加载更多数据

如何在按钮单击事件中的模式弹出扩展器中的iframe中加载页面?

如何在后台工作人员运行时在 uwp 中加载图像

如何在滑动时在 PageView 中加载新数据