Communicating with/opening Containing app from Sha

2020-02-03 05:05发布

问题:

Closed. This question needs to be more focused. It is not currently accepting answers.

Want to improve this question? Update the question so it focuses on one problem only by editing this post.

Closed 5 years ago.

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?

回答1:

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.