I've been working on a different sort of project lately, using Ionic Framework to build an iPad app for an upcoming conference. Among other things, this app will collect contact info from potential clients at the conference.
You would think that writing a few fields to CSV and exporting it to another machine would be easy. Ionic and Cordova made it pretty simple simple... It was a breeze when testing on an Android VM! Unfortunately, iOS made it needlessly difficult and unintuitive.
In a nutshell, Android and iOS have different attitudes on sharing files between apps. The
$cordovaFile plugin documentation shows how Android allows non-private directories for apps to store their files, where iOS does not: http://ngcordova.com/docs/plugins/file/.
This meant that I could write a CSV file to
cordova.file.externalDataDirectory on Android, open the file with
$cordovaFileOpener2, and it would be opened right in Excel. On iOS all of the
cordova.file directories are private, which means
$cordovaFileOpener2 cannot open any files in the app's private directory.
My nemesis: UIFileSharingEnabled
Ionic has several
config.xml settings that automatically translate to the appropriate Android or iOS config values.
Orientation are just a few examples. The full list can be found at https://cordova.apache.org/docs/en/latest/config_ref/. Unfortunately, iOS file sharing is not an Ionic config setting.
After some research, I found out that iOS requires the
UIFileSharingEnabled value to be set to
true in the app's
Info.plist file. This is the "Application supports iTunes file sharing" setting in XCode. Yes, you read that right... The Apple Way™ requires you to use iTunes to download app files off your device. It doesn't make much sense to me, either.
Most threads I could find online about adding
plist entries used a Cordova hook developed by Marco Carnazzo: https://gist.github.com/marcocarnazzo/6f01a57d390e8fe3071f. This hook allows you to add tags to the Ionic
config.xml, and have them transformed to the appropriate Android or iOS config values. I ran into some errors while using the script, and couldn't make it work for me. Since I only needed iOS-specific config values written, I decided to take a less dynamic, low-tech approach.
PlistBuddy to the rescue
I came across the
PlistBuddy utility from this StackOverflow thread: http://stackoverflow.com/a/31845828/152133. I ran into trouble with this hook as written, but I was able to modify it to suit my needs. I saved the following code in
#!/bin/bash PLIST=platforms/ios/*/*-Info.plist /usr/libexec/PlistBuddy -c "Add :UIFileSharingEnabled bool YES" $PLIST true
Retrieving your files in iTunes
First, click the device button in iTunes.
Next select the Apps menu item, and scroll down to File Sharing.
Select your app, and download the files you need!