January 2nd, 2010
I have been using shared objects to share data between swf files, so that changes in one can affect the other. On a website it works great as long as they share the same localPath and name, but this model doesn’t quite apply to AIR applications. Despite the name “shared objects” when you’re using them with AIR they’re private to each application, making sharing data using shared objects impossible as far as I know.
I’m a little surprised each application gets its own shared objects folder. I’m guessing it’s because there’s no domain to keep things properly separated, but I’m disappointed with the alternative. The localPath of a local shared object could default to a path containing the id of the application instead. This would keep local shared objects separate by default while still allowing more freedom. Treating each application as it’s own domain instead of the computer itself is frustrating.Â The best solution I’ve found is to create a shared application storage directory, then save any files to that.
These are the usual application storage directories (I’m not sure about the Mac OS X one, since I can’t test it, but it appears to be correct):
Windows: %APPDATA%Local Store<application id> Mac OS X: ~/Library/Preferences/Local Store/<application id> Linux: ~/.appdata/Local Store/<application id>
So, if we resolve the directory up two levels (“../../”), we get the following directories:
Windows: %APPDATA% Mac OS X: ~/Library/Preferences/ Linux: ~/.appdata/
Which is probably the best place to put the shared application storage directory. When creating this folder I would recommend using the same naming convention as your program id (which generally is similar to package names, e.g. “com.somewebsite.project”). It should not be the same id as another application.
Here’s the code in action…
var appStorageDir:File = new File(File.applicationStorageDirectory.nativePath); var saveFolder:File = appStorageDir.resolvePath("../../com.somewebsite.shared"); saveFolder.createDirectory(); // ensure the save folder exists var fileStream:FileStream = new FileStream(); fileStream.open(saveFolder.resolvePath("savedata.bin"), FileMode.WRITE); fileStream.writeObject(obj); fileStream.close();
I create a duplicate ofÂ File.applicationStorageDirectory because it doesn’t allow you to resolve paths beyond the root of the directory.
It’s important to realize that this is ultimately a hack. If the application directory changes it could save the file somewhere unexpected. Still, it’s unlikely to change in the current version of AIR and it’s the best way I’ve found to share data.