NSFileCoordinated iOS IPC

IOS IPC? For reals? Well, for a “your app group” definition of “P”, yep pretty much:

Sharing data between iOS apps and app extensions

You’ll want to use NSFileCoordinator any time you want to read or write your shared files. You’ll also want to implement NSFilePresenter any time you need to know if a file has changed. These were introduced as companions to iCloud, where both your app and the iCloud daemon might want to access the same file. They’re not iCloud specific, though…

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.

Cool beans! That opens up the extension useful problem space a good deal, doesn’t it now?

h/t: Michael Tsai!

UPDATES:

Accessing Shared Data from an App Extension and its Containing App

Important: When you create a shared container for use by an app extension and its containing app in iOS 8, 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 [UPDATE: in iOS 8.1.x and earlier]. If you use file coordination APIs directly to access a shared container from an extension in iOS 8.0 [UPDATE: in iOS 8.1.x and earlier], there are certain circumstances under which the file coordination machinery deadlocks.

WatchKit Data Sharing: Beware of the NSFileCoordinator and NSFilePresenter

Introducing MMWormwhole

ddeville / LLBSDMessaging: Interprocess communication on iOS with Berkeley sockets

Interprocess communication on iOS with Mach Messages

File Coordination Fixed: “In iOS 8.2 or higher, the obvious approach should now be safe.” as noted above.

Alex | November 30, 2014

Leave a Reply