Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Communicating with/opening Containing app from Share extension [closed]

Here is what I have tried that has NOT worked:

  • Using openURL to attempt to open the containing app

Here is what I have thought of that wouldn't work:

  • Using local notifications to provide a link to the containing app (creating the local notification from the extension)

Here are options I am considering:

  • Using a UIDocumentInteractionController and a custom file extension type to provide a link to my containing app (and my containing app only)
  • Starting a "fake" NSURL session to get the following functionality: In iOS, if your extension isn’t running when a background task completes, the system launches your containing app in the background and calls the application:handleEventsForBackgroundURLSession:completionHandler: app delegate method.

The UIDocumentInteractionController is confirmed to work in Xcode 6.5, but the flow is kind of wonky. The NSURL thing should work as well, but it's also a bit fishy. Does anyone have any other ideas of getting my containing app to open from a share extension, or an idea to communicate with it from a share extension?

like image 764
arcticmatt Avatar asked Aug 12 '14 01:08

arcticmatt


People also ask

What does app extension mean?

An app extension lets you extend custom functionality and content beyond your app and make it available to users while they're interacting with other apps or the system. You create an app extension to enable a specific task.

What is the iOS app extension?

App Extensions are an iOS feature that allows developers to extend the functionality and content of their app beyond the app itself, making it available to users in other apps or in the main operating system.

How do app extensions work?

The extension displays its view within the context of the host app and then uses the items it received in the host app's request to perform its task (in this example, the extension receives the selected text).


1 Answers

I have confirmed that the NSURLSession way (second bullet under the "considering" options above) indeed does work. I'm still working out some kinks, but here are the basics. Using this method, you can indeed open your app from a share extension.

This method requires 3 main steps, as follows:

  1. Make a background NSURLSession in a Share Extension.
  2. Start a download task.
  3. Call exit(0).

Make sure the thing you are downloading takes long enough so that the extension terminates before the download task finishes.

NSString *address = @"https://googledrive.com/host/0B5zObXR9UzgmbFpob2J5eXpjNXc/file3m";
self.mySession = [self configureMySession];
NSURL *url = [NSURL URLWithString:address];
NSURLSessionTask *myTask = [self.mySession downloadTaskWithURL:url];
[myTask resume];
exit(0);

Then, in your containing application's UIApplicationDelegate class, implement the

application:handleEventsForBackgroundURLSession:completionHandler: 

method. This method gets called when the download task finishes after your extension has been terminated. Then, in this method, you can call

[[UIApplication sharedApplication] openURL:url];

or do some other stuff in your containing app.

The main problem with this method is that there is a delay between the time when the extension terminates and the time when the the containing app starts up. The main advantage of this method over the UIDocumentInteractionController method is that no extra user interaction is needed. More details will come as I continue to experiment.

like image 63
arcticmatt Avatar answered Oct 04 '22 04:10

arcticmatt