Friday, November 21, 2014

iOS IPC via NSFileCoordinator and NSFilePresenter

Tom Harrington:

There’s still no full IPC mechanism on iOS. NSDistributedNotification hasn’t made the jump from OS X to iOS and probably never will. But file coordination and presentation can serve the same purpose, as long as the apps use the same app group.

When I was adding file coordination and presentation to my demo app, I realized that they could also be used for notifications between an app and its extensions. If one of them does a coordinated write while the other is using a file presenter for the file, the call to presentedItemDidChange happens almost instantly. Notification is the whole purpose of that method, so it makes sense it would work this way. I want to be notified if a specific file changes, and that’s how I get the notification.

But you don’t need to care about the file contents to be interested in notifications. If you just want a notification, choose a file name and use it as the notification mechanism. Any time one process needs to notify the other, make a change to the file. The other will get a file presenter call, and the notification is complete. It feels sort of like a hack but really this is exactly how the API is designed to work.

Update (2014-11-22): Apple TN2408 (via JanApotheker):

Using file coordination in an app extension to access a container shared with its containing app may result in a deadlock. This is usually the case if a process is suspended mid coordinated I/O. This can be more prevalent on iOS where most apps will be suspended after a short period of time after being moved to the background. Extensions should use alternatives to file coordination.

[…]

Regardless of this issue, the containing app (and all applications) should properly use background task assertions around file operations they require completed in a shared container (with or without extensions). This includes all writes or deletions. Such a process might still be killed by jetsam but at a much lower frequency.

Update (2014-11-29): Wade Spires recommends CFNotificationCenterGetDarwinNotifyCenter for iOS IPC.

Update (2014-12-01): Harrington has filed a bug on NSFileCoordinator:

This would seem to be a textbook example of a situation where NSFileCoordinator and NSFilePresenter would be ideal. Nay, it would seem to be the primary purpose for those classes to exist. The documentation for NSFileCoordinator even goes so far as to say that “…NSFileCoordinator class coordinates the reading and writing of files and directories among multiple processes.” But actually using it between different processes turns out to not be safe.

The tech note explains that “…you are obliged to write to that container in a coordinated manner to avoid data corruption. However, you must not use file coordination APIs directly for this.” This kind of documentation makes me sad.

4 Comments RSS · Twitter

[…] See also: iOS IPC via NSFileCoordinator and NSFilePresenter. […]

[…] You can read more on the topic from a few blog posts gathered by @mjtsai: iOS IPC via NSFileCoordinator and NSFilePresenter. […]

[…] Previously: iOS IPC via NSFileCoordinator and NSFilePresenter. […]

[…] Sharing data between iOS apps and app extensions […]

Leave a Comment