If an user has an iPad and iPhone, and synchronizes an Universal app which has stored files in the Documents directory in one of these devices (say iPhone), do these files become available to the other device (say iPad) after synchronizing?
No, they don't. Contents of the Documents and Library directory are not part of the sync process (iTunes backups them, though).
Related
I have an app for ipad and iphone and since users can download files in there i've enabled UIFileSharingEnabled and LSSupportsOpeningDocumentsInPlace in my plist, so users can find the files. (I store them in FileManager.default.url(for:.documentsDirectory,...))
However the app also needs to write texts to files, that shouldn't be accessable for the users. Where should i store those?
I have an app that allows me to download characters (images), sounds, etc. When the user chooses which character to download can I store that in a directory in my App Bundle? If not, where is the best place to store my content (data)? I was thinking the documents directory, but then I saw somewhere that Apple now wants data stored in the caches directory.
Thanks for the help.
can I store that in a directory in my App Bundle?
No, you can not modify the app bundle.
If not, where is the best place to store my content (data)?
If your app must support iOS 5.0 or earlier, you will need to store your app data in the Caches directory. However, keep in mind the files could be deleted in low space situations so your app will need to degrade gracefully if your app data is deleted.
As of iOS 5.0.1, you can store your data files in the Documents Directory and flag them as "do not back up". By flagging the files, your app complies with the guideline that apps are responsible for ensuring that only user data and not application data is backed up to iCloud and iTunes and avoids a possible rejection by Apple. In this case, the files will not be deleted in low space situations.
As of iOS 5.1, you can store your data files in the Documents Directory and use either NSURLIsExcludedFromBackupKey or kCFURLIsExcludedFromBackupKey file properties to exclude files from backups. Either of these APIs is preferred over flagging them as "do not back up". In this case, your app complies with the App Store guidelines and the files will not be deleted in low space situations.
I know that this is quite a long discussion, but you should probably read it. :)
The iOS Data Storage Guidelines state:
To ensure that backups are as efficient as possible, be sure to store your app’s data according to the following guidelines:
Only documents and other data that is user-generated, or that cannot otherwise be recreated by your application, should be stored in the /Documents directory and will be automatically backed up by iCloud.
Data that can be downloaded again or regenerated should be stored in the /Library/Caches directory. Examples of files you should put in the Caches directory include database cache files and downloadable content, such as that used by magazine, newspaper, and map applications.
Data that is used only temporarily should be stored in the /tmp directory. Although these files are not backed up to iCloud, remember to delete those files when you are done with them so that they do not continue to consume space on the user’s device.
If you have an OS X or Unix background, it’s easy to understand Apple’s position that such directories have no guarantee as to how long the data in them will persist.
The fact that the tmp directory in in the app’s sandbox is not the same as the root /tmp directory, should not make a difference how you think about this directory.
If you have never observed files being removed from these directories in the past, that is not a guarantee that it will not change in the future. Especially when the change is in accordance with documentation. This is a general rule.
Changes/gaps in Apple’s documentation:
As late as June 29, 2011 Apple’s documentation regarding /Documents said:
Use this directory to store user documents and application data files.
This is pretty clear. No wonder developers are unhappy that the rules for the Documents directory have changed in iOS 5 without any suitable alternative.
Regarding /Library/Caches:
Use this directory to write any application-specific support files that you want to persist between launches of the application or during application updates. Your application is generally responsible for adding and removing these files. It should also be able to re-create these files as needed because iTunes removes them during a full restoration of the device.
App review rejections
Developers are reporting that apps that store any/some/much data in the Documents directory are being rejected by App Review.
It’s unlikely that the App Review team has detailed knowledge of which files are being stored in which directory and which of those are user generated vs. data that can be downloaded again or regenerated. Some developers have reported success in responding to the App Review team with an explanation of how their app is storing data and how that is in accordance with the rules.
What is being backed up by iTunes and iCloud
Everything in the app’s home directory is backed up, with the exception of:
The app bundle itself (.app)
/tmp directory
/Library/Caches directory
Other documentation clearly states that the Application Support directory is also backed up by iTunes (and presumably iCloud). In the discussions some developers have suggested that Application Support directory would be safer (= more permanent) alternative to Caches. To me it seems that App Review would crack down on large amounts of data stored in Application Support with the same fervor as for the Documents directory, since it’s all about iCloud storage.
Changes in behavior in iOS 5
As of iOS 5, /Library/Caches may be purged while your app is not running if the device experiences a low disk space warning.
There is no longer a directory where your app can store files that are:
Not backed up to iTunes/iCloud
Not at risk of being purged
Downloaded content should not be stored in the Documents directory according to Apple's Guidelines:
Only documents and other data that is user-generated, or that cannot otherwise be recreated by your application, should be stored in the <Application_Home>/Documents
Use the /Library/Caches directory instead
Data that is used only temporarily should be stored in the <Application_Home>/tmp directory.
I'm wanting to access applications storage via iTunes, where i can save documents and be available in my app.
I have looked all over google, but without a specific name i don't know what I'm looking for.
Some of the app's that use this functionality are VLC & usb Disk; there are many many more.
So I'm asking what the API is called and if anyone knows of sample code or an example.
Essentially, all you have to do is add a boolean UIFileSharingEnabled (YES) key to your app's info.plist. Then the documents added through iTunes will be available in your app's documents directory.
UIFileSharingEnabled (Boolean - iOS) specifies whether the application
shares files through iTunes. If this key is YES, the application
shares files. If it is not present or is NO, the application does not
share files. Applications must put any files they want to share with
the user in their /Documents directory, where
is the path to the application’s home directory.
In iTunes, the user can access an application’s shared files from the
File Sharing section of the Apps tab for the selected device. From
this tab, users can add and remove files from the directory.
This key is supported in iOS 3.2 and later.
Apple's sample code: DocInteraction
I'm diving into iOS development and I have a quick noob question about Core Data. As I understand it, any data that in an app's Documents folder is backed up to iTunes when the user syncs their device. Does that mean if my core data sqlite db is in the Documents folder, then that data will be synced between multiple devices with the same iTunes account?
If so, how does it sync it with a device that already has the core data file in the Documents directory? Does it just overwrite it with the file on the last device that was synced?
Thanks for your help!
Backups are completely managed by iTunes and stored per device, so they cannot be used to transfer information between the same app on different devices. More precisely, iTunes stores a single backup for each different iOS device you sync. So if you have an iPad and an iPhone, iTunes will have one backup for the iPad and one backup for the iPhone.
Moreover, the single backup is overwritten each time you sync the device. The only way data can get from a backup file to a device is if you use iTunes to restore the backup, which will overwrite any existing data on the device.
Unfortunately, backups are really only meant to be just that and are not helpful in terms of syncing between devices.
See this Apple support document for more details.
I need a copy of the store that is saved as Core Data sqlite file inside a test app installed on my device.
I know how to get files out of the the simulator at path: ~/Library/Application Support/iPhone Simulator/[Version]/Applications/[AppID]/Documents
...but i need get the .sqlite file from the app on the device itself.
Unless the app itself has file sharing built in, you can't access the documents folder from outside the app. It is a security precaution and part of the sandbox.
Update:
I misunderstood the context of the question. To get files off a developers iPhone, connect the device and open Xcode>Window>Organizer. Select the device in the lefthand pane. In the righthand pane will be a list of applications. Your custom apps will have an arrow next to it. Hit the arrow and you will see "Application Data" hit the down arrow icon and it will let you download the data to folder. That folder will contain the apps Document, Library and tmp folders.
I wrote an application specifically for this to distribute to my customers and testers of my applications when they have problems. iPhoneRescue is free and allows you to get at all of the backup information in your iPhone; this includes any sqlite files.
All the users have to do is find their device backup, find the application, and then save the application files or just a specific file. (This does not work if they have encrypted their backups).