Adobe AIR SharedObject – Android / iOS – 未find更新

正如标题所述,我的用户在iOS和Android上报告他们的保存数据已经被删除时,我推动更新到尊敬的店面。 游戏在应用程序加载和退出时正确保存和恢复数据。 我没有更改任何保存信息位置或软件包名称…只是修正了错误,构build,推送。

任何澄清都会有帮助,或者提出冗余数据备份scheme我应该追求的,以确保terminal用户体验从此不受负面影响。 我还想更好地了解我如何testing这个版本,因为发布包不允许更新市场安装的应用程序。

var so:SharedObject = SharedObject.getLocal("storage"); var u:User; if(so.data != null){ u = so.data.user; } trace("Loading application..."); if(u != null){ trace("LOADING SAVE DATA"); user = u; }else{ trace("NO SAVE DATA EXISTS"); user = new User(); } 

我发现了这个问题的原因,似乎Adobe已经确定并解决了这个问题(从AIR 3.5开始)。 https://bugbase.adobe.com/index.cfm?event=bug&id=3347676

SharedObjects存储在根据应用程序使用的SWF命名的目录中,因此,如果您的应用程序正在运行“myApp.swf”,则SharedObject将存储在“myApp”目录中。 如果您更改此SWF的名称(即您的AIR项目的相应XML构build表configuration文件),则任何后续构build都会将其SharedObject存储在新的位置。

在这个bug中描述的问题是专门针对iOS的,其中应用程序没有将SharedObject存储在如上所述的对应的SWF位置中,而是在项目的XML构build表中由“filename”属性表示的单独位置中。

我也发现Adobe确实在移动平台上容忍持久存储的SharedObject的使用。

我为未来的版本开发了一个简单的备份保存冗余,以防将来的更新无法持久化SharedObject。

 /** the last timestamp a deep save was completed */ private var mLastSave:Number = -1; /** * save the state of the globals object and all of its * sub objects. * @warning * all objects must implement variables in a "public" state. * Private variables are not saved within the persistance manager */ public function save():void{ var so:SharedObject = SharedObject.getLocal("storage"); so.data.user = user; so.flush(); saveDeep(); } /** * Save the SharedObject to denoted mobile applicationStorageDirectory. */ public function saveDeep():void{ // save on first application save or after // every 5 minutes if(mLastSave == -1 || mLastSave < getTime() + 300000){ mLastSave = getTime(); var file:File = File.applicationStorageDirectory.resolvePath("userSave"); var fileStream:FileStream = new FileStream(); fileStream.open(file, FileMode.WRITE); var ba:ByteArray = new ByteArray(); ba.writeObject(user); fileStream.writeBytes(ba); fileStream.close(); } } /** * Load the application from the SharedObject be default * if the SharedObject DNE attempt to load from the * applicationStorageDirectory, if neither exist * create new User object */ public function load():void{ registerClassAlias("user", User); // Create/read a shared-object named "userData" var so:SharedObject = SharedObject.getLocal("storage"); var u:User; if(so.data != null){ u = so.data.user; } trace("Loading application..."); if(u != null){ trace("LOADING SAVE DATA"); user = u; }else{ trace("NO SAVE DATA EXISTS"); var file:File = File.applicationStorageDirectory.resolvePath("userSave"); if(file.exists){ trace("Found userSave backup -attempting to load"); var fileStream:FileStream = new FileStream(); fileStream.open(file, FileMode.READ); var ba:ByteArray = new ByteArray(); fileStream.readBytes(ba); fileStream.close(); try{ user = (ba.readObject() as User); }catch( e : EOFError ){ trace("SharedObject did not exist, attempted userSave load, failed"); } }else{ user = new User(); trace("created New user..."); } } }