Welcome to Part 3 of my Blog series about Sharing Files to and from mobile Qt Apps.
Part 1 was about sharing Files or Content from your Qt App with native Android or iOS Apps, Part 2 explained HowTo share Files with your Qt App from other native Android Apps – this part now does the same from other native iOS Apps.
Some preliminary notes
- Try it out: all sources are available at ⦁ GitHub
- Android Permissions not checked in Example App: enable WRITE_EXTERNAL_STORAGE manually
- Current Android release is for Target SDK 23 ! (Android 7 requires ⦁ FileProvider – wait for Blog Part 4)
- All Use-Cases are implemented to be used x-platform – currently Android and iOS
If you‘re looking for an Android-only solution please also take a look at AndroidNative project.
Prepare iOS Info.plist
Similar to Android intent-filter in AndroidManifest.xml we must add some informations to Info.plist. If you haven‘t already done copy the Info.plist from your build directory into your project:
Then add this into your .pro:
ios { ... QMAKE_INFO_PLIST = ios/Info.plist ... }
Open the Info.plist and insert these lines:
CFBundleDocumentTypes CFBundleTypeNameGeneric FileCFBundleTypeRoleViewerLSHandlerRankAlternateLSItemContentTypespublic.data
See all the details from Apple Documentation „Registering File Types“.
Here‘s a short overview how the Types are organized:
public.data is similar to MimeType */* we are using to filter Android Intents in our Example App.
After adding the lines to Info.plist our App will appear as a target App if Files or Attachments should be shared from other iOS Apps.
Fortunately iOS doesn‘t provide our own App as target if we want to share Files from our Example App with other iOS Apps.
Remember: On Android we had to create a custom Chooser to filter out our own App as target.
Get the incoming URL
The Files from other iOS Apps will be passed to the Qt App via application:openURL:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
see also Apple documentation.
From Part 2 (Android implementation) you know that we have to wait until the Qt App is ready to handle the incoming URL and be able to emit a SIGNAL to QML UI.
We don‘t need this for iOS, because there‘s a Qt method we can use out of the box and grab the passed file url by registering QDesktopServices::setUrlHandler:
QDesktopServices::setUrlHandler("file", this, "handleFileUrlReceived");
This is easy to implement. We already have the IosShareUtils.mm class where we handle sharing …read more
Source:: http://blog.qt.io/blog/2018/02/06/sharing-files-android-ios-qt-app-part-3/