【问题标题】:SharedObject not saving data on IpadSharedObject 不在 Ipad 上保存数据
【发布时间】:2014-01-06 22:07:58
【问题描述】:

我一直在开发一个使用 SharedObject 的生产力应用程序。它将自定义类保存为基本对象和变量。它在模拟器上的计算机上完美运行,但是一旦我在 ipad 1st gen 上对其进行测试,它就无法正常工作。该应用程序将适当地后台运行,但是当我关闭后台进程并重新打开该应用程序时,所有条目都消失了。我还没有支付开发者费用,因为我不确定我是否想投资,所以我使用的是假证书和越狱设备。那会停止保存数据吗?再次,它完全符合 pc 上的需要,但是当我在 ipad 上关闭应用程序时,它不会保存任何东西。

编辑:我修好了 好的,问题只是由于脚本错误,刷新没有调用常规更改,而关闭的刷新在应用程序从后台关闭时不起作用。基本上我将它设置为保存在主页按钮和电源按钮上以及修复所有小保存。现在完美运行。文件太粗略了,因为我要存储一组自定义类。

【问题讨论】:

  • 哦,在 iOS 上开发的乐趣。 >.> 我没有回答,因为我不是 100% 确定,但我认为 SharedObjects 在进程结束时会在垃圾收集中被清除。
  • 你能把代码贴在你保存共享对象的地方吗?我怀疑正在发生的事情是它没有被调用,而不是共享对象被破坏了。
  • 我在任何时候更改变量时都会调用它。我也在关闭时再次调用它。它应该没有办法不打电话。我也手动关闭它。我无法使用跟踪测试以查看刷新是否有效,因为它在 ipad 上,并且闪存无法在越狱时进行实时诊断。我使用 NativeApplication.nativeApplication.addEventListener (Event.EXITS , onExitHandler) 来结束。而其他一切都只是当每件事都发生变化时,它会重新保存数据以防万一。
  • 其实我觉得可能是越狱的原因。因为没有适当的证书和 p12 就无法在 ios 设备上安装应用程序。由于我使用假发布 ipa 然后越狱并使用 appsync,也许 ios 没有给予它许可。但如果它可能是其他任何我很想知道的东西。我认为你需要支付 100 来开发和测试你的应用程序真的很愚蠢。我理解提交,但测试应该是免费的......
  • 对于它的价值,SharedObject 在 AIR 开发中通常被避免使用 FileFileStream。 SharedObject 有一个 100kb 的限制,这实际上只适合保存设置。而且,即便如此,我个人更喜欢File,因为我可以更好地控制它。

标签: ios actionscript-3 ipad flash


【解决方案1】:

为了避免添加到评论链中,我只是写一个答案。

正如我在评论中所说,大多数 AIR 开发人员出于各种原因避免使用 SharedObjects。它们被限制在 ~100kb,你无法控制它们,并且显然在 iOS 上被刷新。

话虽如此,大多数 AIR 开发人员更喜欢使用 FileFileStream,它们可以让您直接控制设备的文件系统。

FileStream 有一个名为writeObject() 的方法,它完全符合您的要求。假设您有以下要保存的强类型对象(注意: 只有 public 属性会保存到磁盘):

var a:Class1 = new Class1();
var s:Class2 = new Class2();
var d:Class3 = new Class3();
var f:Class4 = new Class4();

您需要将它们组合成一个对象,或单独保存它们。为此,我会将它们组合成一个对象。

// you could also use an array, or any other object, to do this
var obj:Object = {objA:a, objS:s, objD:d, objF:f}; 

然后你想使用File,它是对文件系统中文件或目录的引用,和FileStream,它是与文件系统通信的东西,来写对象。

var f:File = File.applicationStorageDirectory.resolvePath("prefs.conf");
var fs:FileStream = new FileStream();
fs.open(f, FileMode.WRITE);
fs.writeObject(obj);
fs.close() // NEVER forget to close()

就是这样。您的对象现在已保存到磁盘。您可以再次使用FileFileStream 打开它们。

fs.open(f, FileMode.OPEN);
var obj2:Object = fs.readObject();
fs.close();

obj2 将具有与obj 相同的属性,并且它们将匹配您最初保存的对象。值得注意的是,这些对象不会与您的自定义对象属于同一类型。除非它们是原语(ObjectArrayStringNumberintuint,也许还有其他几个),否则从字节流中读取的每个对象(无论是 @987654345 @、FileStreamURLStream 等)将作为标准 Object 输入。不过,您可以通过 registerClassAlias() 解决此问题。

编辑:作为一个快速说明,在 iOS 上,如果 File.preventBackup 不是首选项,则应始终将它们设置为 true。否则苹果会拒绝它。不过,好消息是,这些设置应该备份到 iCloud 并在安装之间保持不变。

【讨论】:

  • 谢谢,太好了!
猜你喜欢
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2015-05-22
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多