&iOS

NSURL 官方文档阅读

2017-06-09  本文已影响225人  AppleTTT

NSURL

Overview

NSURL对象表示可能包含远程服务器上的资源位置,磁盘上本地文件的路径或甚至任意编码数据的URL。

我们可以使用URL对象来构造URL并访问其部件。对于表示本地文件的URL,你还可以直接操作这些文件的属性,例如更改文件的最后修改日期。最后,我们可以将URL对象传递给其他API以检索这些URL的内容。例如,你可以使用NSURLSession,NSURLConnection和NSURLDownload类访问远程资源的内容。

URL对象是引用本地文件的首选方式。大多数从文件读取数据或将数据写入文件的对象都有接受NSURL对象而不是路径名作为文件引用的方法。例如,我们可以可以使用initWithContentsOfURL:encoding:error:初始化字符串或使用initWithContentsOfURL:options:error:初始化NSData对象来获取本地的内容。

我们还可以使用URL进行应用间通信。在macOS中,NSWorkspace类提供了openURL:方法来打开URL指定的位置。类似地,在iOS中,UIApplication类提供了openURL:方法。

另外,我们可以在使用粘贴板时使用URL,如NSURL Additions Reference(AppKit框架的一部分)中所述。

NSURL与CF框架里面的对应的类是可以桥接的("Toll-Free Bridging").

Important:Swift覆盖到Foundation框架提供了URL结构,它与NSURL类进行了桥接。 URL值类型提供与NSURL引用类型相同的功能,两者可以与Swift代码交互使用,与Objective-C API交互。 此行为类似于Swift将标准字符串,数字和集合类型桥接到其相应的Foundation类。

Structure of a URL

一个NSURL对象由两部分组成:一个潜在的为nil的base URL和一个相对于基本URL解析的字符串。 如果NSURL对象的字符串部分在没有base的情况下能完全解析,则认为它是绝对的; 所有其他网址被认为是相对的。
例如,构造NSURL对象时,可以指定file:///path/to/user/作为base URL和folder/file.html作为字符串部分,如下所示:

NSURL *baseURL = [NSURL fileURLWithPath:@"file:///path/to/user/"];
NSURL *URL = [NSURL URLWithString:@"folder/file.html" relativeToURL:baseURL];
NSLog(@"absoluteURL = %@", [URL absoluteURL]);

完全解析后,absolute URL 为: file:///path/to/user/folder/file.html.

URL也可以根据其结构分为几个部分。 例如,https://johnny:p4ssw0rd@www.example.com:443/script.ext;param=value?query=value#ref 包含以下URL组件:

Component Value
scheme https
user johnny
password p4ssw0rd
host www.example.com
port 443
path /script.ext
pathExtension ext
pathComponents ["/", "script.ext"]
parameterString param=paramvalue
query query=value
fragment ref

NSURL类提供了可以检查每个组件的属性(见后文Symbols)。

Bookmarks and Security Scope

从OS X v10.6和iOS 4.0开始,NSURL类提供了创建和使用书签对象的功能。书签提供对系统文件资源的持久引用。定义一个书签时,你将获得资源当前位置的URL。如果用户移动或重命名资源,或者用户重新启动应用程序或重新启动系统,则书签与文件资源(通常为文件或文件夹)的关联通常会还会存在。

有关使用书签的一般介绍,请参阅“文件系统编程指南”中的“使用书签查找文件”。

当我们获取一个security-scoped书签时,你将获得一个security-scoped的URL。

Security-Scoped URLs

security-scoped的URL可以访问应用程序沙箱外的资源。在macOS中,当我们解析security-scoped的书签时,我们可以访问security-scoped的URL。在iOS中,使用UIDocumentPickerViewController打开或移动文档的应用程序也会收到security-scoped的URL。

要访问security-scoped的URL,我们必须调用startAccessingSecurityScopedResource方法(或其Core Foundation里面的CFURLStartAccessingSecurityScopedResource函数)。对于iOS应用程序,如果我们使用UIDocument访问该URL,则系统会自动管理security-scoped的URL。

如果startAccessingSecurityScopedResource(或CFUrLStartAccessingSecurityScopedResource)返回YES,则必须通过调用stopAccessingSecurityScopedResource方法(或其Core Foundation的CFURLStopAccessingSecurityScopedResource函数)来停止访问。一旦我们完成使用该文件,我们应该停止访问。在调用这些方法后,我们立即失去对该资源的访问权限。

警告:如果我们在不再需要文件系统资源时无法停止访问权限,则我们的应用程序会出现泄漏内核资源的问题。 当内核资源泄漏到一定量的时候,我们的应用程序将失去将系统文件位置添加到沙箱,使用Powerbox,security-scoped的书签或类似的API的功能,直到重新启动APP。

Security-Scoped URLs and String Paths

在macOS应用程序中,当你复制安全范围的URL时,副本具有原始安全范围。 你可以像使用原始URL一样访问文件系统资源(URL指向):通过调用startAccessingSecurityScopedResource方法(或其Core Foundation等效的函数)。

如果你需要一个security-scoped的URL的path来作为一个字符串的值(由path的getter方法获得),例如需要从URL的path获取到的字符串的API,但是请注意,从security-scoped的URL获取到path并没有security scoped,并且我们不能通过此路径获取到security-scoped的URL对应的资源

iCloud Document Thumbnails

在OS X v10.10和iOS 8.0,NSURL类可以获取和设置文档缩略图作为iCloud文档的资源属性。 你可以使用getResourceValue:forKey:error:或getPromisedItemResourceValue:forKey:error:方法在iOS中获取UIImage对象字典的字典或macOS中获取NSImage对象的字典。例子如下:

NSURL *URL = [self URLForDocument];
NSDictionary *thumbnails = nil;
NSError *error = nil;
 
BOOL success = [URL getPromisedItemResourceValue:&thumbnails
                                          forKey:NSURLThumbnailDictionaryKey
                                           error:&error];
if (success) {
  NSImage *image = thumbnails[NSThumbnail1024x1024SizeKey];
} else {
  // handle the error
}

在macOS中,你可以使用setResourceValue:forKey:error:方法设置缩略图字典。 你还可以使用NSURLThumbnailKey获取或设置具有多个表示形式的NSImage对象所有缩略图。例子如下:

NSURL *URL = [self URLForDocument];
NSImage *thumbnail = [self createDocumentThumbnail];
NSError *error = nil;
 
BOOL success = [URL setResourceValue:@{NSThumbnail1024x1024SizeKey : thumbnail}
                              forKey:NSURLThumbnailDictionaryKey
                               error:&error];
 
if (!success) {
  // handle the error
}

NOTE: 不要直接设置NSURLThumbnailDictionaryKey键。 修改此Key会干扰文档跟踪,并导致文档的重复项以及其他可能的问题。

在iOS中,使用UIDocument子类来管理你的文件。 通过覆盖文档的fileAttributesToWriteToURL:forSaveOperation:error:方法并返回包含正确的缩略图键(以及任何其他文件属性)的字典来设置缩略图。

NOTE: 虽然缩略图API旨在支持多种图像分辨率,但目前它只支持1024 x 1024像素的缩略图。

Symbols

Creating an NSURL Object
















Identifying and Comparing Objects


Querying an NSURL




Accessing the Parts of the URL




















由于 NSURL 里面有太多方法,而且大多数我看了下,大部分的场景是用不到的,比如书签相关的,所以到此就不再翻译 NSURL 相关的,有兴趣的同学可以自己看下官方文档,或者是留言和我讨论。

上一篇下一篇

猜你喜欢

热点阅读