NSURL object represents a URL that can potentially contain the location of a resource on a remote server, the path of a local file on disk, or even an arbitrary piece of encoded data.
- iOS 8.0+
- macOS 10.10+
- tvOS 9.0+
- watchOS 2.0+
You can use URL objects to construct URLs and access their parts. For URLs that represent local files, you can also manipulate properties of those files directly, such as changing the file’s last modification date. Finally, you can pass URL objects to other APIs to retrieve the contents of those URLs. For example, you can use the
NSURLDownload classes to access the contents of remote resources, as described in URL Session Programming Guide.
URL objects are the preferred way to refer to local files. Most objects that read data from or write data to a file have methods that accept an
NSURL object instead of a pathname as the file reference. For example, you can get the contents of a local file URL as an
NSString object using the
init(contentsOf:encoding:) initializer, or as an
NSData object using the
You can also use URLs for interapplication communication. In macOS, the
NSWorkspace class provides the
open(_:) method to open a location specified by a URL. Similarly, in iOS, the
UIApplication class provides the
Additionally, you can use URLs when working with pasteboards, as described in NSURL Additions Reference (part of the AppKit framework).
Structure of a URL
NSURL object is composed of two parts—a potentially
nil base URL and a string that is resolved relative to the base URL. An
NSURL object is considered absolute if its string part is fully resolved without a base; all other URLs are considered relative.
For example, when constructing an
NSURL object, you might specify
file:///path/to/user/ as the base URL and
folder/file.html as the string part, as follows:
When fully resolved, the absolute URL is
A URL can be also be divided into pieces based on its structure. For example, the URL
https://johnny:email@example.com:443/script.ext;param=value?query=value#ref contains the following URL components:
NSURL class provides properties that let you examine each of these components.
Bookmarks and Security Scope
Starting with OS X v10.6 and iOS 4.0, the
NSURL class provides a facility for creating and using bookmark objects. A bookmark provides a persistent reference to a file-system resource. When you resolve a bookmark, you obtain a URL to the resource’s current location. A bookmark’s association with a file-system resource (typically a file or folder) usually continues to work if the user moves or renames the resource, or if the user relaunches your app or restarts the system.
In a macOS app that adopts App Sandbox, you can use security-scoped bookmarks to gain access to file-system resources outside your app’s sandbox. These bookmarks preserve the user’s intent to give your app access to a resource across app launches. For details on how this works, including information on the entitlements you need in your Xcode project, read Security-Scoped Bookmarks and Persistent Resource Access in App Sandbox Design Guide. The methods for using security-scoped bookmarks are described in this document in Working with Bookmark Data.
When you resolve a security-scoped bookmark, you get a security-scoped URL.
Security-scoped URLs provide access to resources outside an app’s sandbox. In macOS, you get access to security-scoped URLs when you resolve a security-scoped bookmark. In iOS, apps that open or move documents using a
UIDocumentPickerViewController also receive security-scoped URLs.
To gain access to a security-scoped URL, you must call the
startAccessingSecurityScopedResource() method (or its Core Foundation equivalent, the
CFURLStartAccessingSecurityScopedResource(_:) function). For iOS apps, if you use a
UIDocument to access the URL, it automatically manages the security-scoped URL for you.
true, you must relinquish your access by calling the
stopAccessingSecurityScopedResource() method (or its Core Foundation equivalent, the
CFURLStopAccessingSecurityScopedResource(_:) function). You should relinquish your access as soon as you have finished using the file. After you call these methods, you immediately lose access to the resource in question.
Security-Scoped URLs and String Paths
In a macOS app, when you copy a security-scoped URL, the copy has the security scope of the original. You gain access to the file-system resource (that the URL points to) just as you would with the original URL: by calling the
startAccessingSecurityScopedResource() method (or its Core Foundation equivalent).
If you need a security-scoped URL’s path as a string value (as provided by the
path method), such as to provide to an API that requires a string value, obtain the path from the URL as needed. Note, however, that a string-based path obtained from a security-scoped URL does not have security scope and you cannot use that string to obtain access to a security-scoped resource.
iCloud Document Thumbnails
With OS X v10.10 and iOS 8.0, the NSURL class includes the ability to get and set document thumbnails as a resource property for iCloud documents. You can get a dictionary of
NSImage objects in macOS or
UIImage objects in iOS using the
In macOS, you can set a dictionary of thumbnails using the
setResourceValue(_:forKey:) method. You can also get or set all the thumbnails as an
NSImage object with multiple representations by using the