Safari localStorage 不会在会话之间保留
Safari localStorage not persisted between sessions
我们有一个在 Facebook 中运行的网络应用程序(即 运行 在不同域的 iFrame 中)。如果 Safari 用户将 Cookie 和网站数据设置为默认值 "Allow from websites I visit",我们通过 localStorage.setItem 存储的数据就像 sessionStorage 一样,即它在用户当前会话之外不可用(即在用户关闭后)选项卡)。如果我们将设置更改为 "Always allow",它可以正常工作,就像在 Chrome、IE 等
中一样
作为测试,我们尝试将浏览器直接导航到我们应用程序的域 (https://ourappname.appspot.com),它在那里工作正常。然后应该确实是访问过的网站,但是回到Facebook里面的游戏,问题依旧。
请注意,setItem 调用是成功的,只是 getItem 在后续会话中没有 return 任何东西。 (因此,当用户处于隐私浏览状态并且 setItem 调用本身因超出配额错误而失败时,情况并非如此。)
我们需要做什么来支持 Safari,以便我们的应用程序,运行 在 Facebook 中,可以按预期使用 localStorage,数据将在会话之间保留?
这可能是 Safari 中的错误或安全功能。
您正在访问 FaceBook,而不是您的网站。您的应用位于 iframe 中,如果它允许您从浏览器读取任何数据,这将违反安全模型。想想竞争对手网站是否读取了它 did/didn 未设置的数据。那会构成信息泄露。
Safari 在这方面做得很好。
理想情况下,在"Allow from websites I visit"模式下,浏览器不应该让iframe设置数据到localStorage;即使每个域都有自己的存储沙箱。
让我感到困扰的是,为什么他们甚至允许您从 iframe 写入 localStorage(在您的 'Allow for only sites I visit' 模式下)?这实际上可能是一个错误 - 一个启用错误的信息欺骗攻击。
我认为这是因为在请求的非同一方来源的情况下,安全异常已从 localStorage 中删除。所以 Safari 可能实际上不会抛出错误,而是让它默默地失败(在某些情况下)。这可能就是您的 setItem 调用成功的原因。
在这一点上,根据给定的信息,我怀疑,先生,由于 Safari 程序员严格遵循 standard,您运气不佳。
我仍在等待 Apple 的回复,但可以肯定地说,我们无法解决此问题。所以 Anubhav 的回答是准确的,但我们仍然需要一个解决方案。
因此,作为解决方法,我们在服务器上为 persisting/restoring 游戏状态创建了新端点。我们仅将此用于 Safari,对于所有其他浏览器,我们仍将游戏状态保存在 localStorage 中。
用户的性能会略有下降。以及少量的服务器成本。这不是一个性感的解决方案,但现在我们的 Facebook canvas 应用程序支持 Safari。
我们有一个在 Facebook 中运行的网络应用程序(即 运行 在不同域的 iFrame 中)。如果 Safari 用户将 Cookie 和网站数据设置为默认值 "Allow from websites I visit",我们通过 localStorage.setItem 存储的数据就像 sessionStorage 一样,即它在用户当前会话之外不可用(即在用户关闭后)选项卡)。如果我们将设置更改为 "Always allow",它可以正常工作,就像在 Chrome、IE 等
中一样作为测试,我们尝试将浏览器直接导航到我们应用程序的域 (https://ourappname.appspot.com),它在那里工作正常。然后应该确实是访问过的网站,但是回到Facebook里面的游戏,问题依旧。
请注意,setItem 调用是成功的,只是 getItem 在后续会话中没有 return 任何东西。 (因此,当用户处于隐私浏览状态并且 setItem 调用本身因超出配额错误而失败时,情况并非如此。)
我们需要做什么来支持 Safari,以便我们的应用程序,运行 在 Facebook 中,可以按预期使用 localStorage,数据将在会话之间保留?
这可能是 Safari 中的错误或安全功能。
您正在访问 FaceBook,而不是您的网站。您的应用位于 iframe 中,如果它允许您从浏览器读取任何数据,这将违反安全模型。想想竞争对手网站是否读取了它 did/didn 未设置的数据。那会构成信息泄露。
Safari 在这方面做得很好。
理想情况下,在"Allow from websites I visit"模式下,浏览器不应该让iframe设置数据到localStorage;即使每个域都有自己的存储沙箱。
让我感到困扰的是,为什么他们甚至允许您从 iframe 写入 localStorage(在您的 'Allow for only sites I visit' 模式下)?这实际上可能是一个错误 - 一个启用错误的信息欺骗攻击。
我认为这是因为在请求的非同一方来源的情况下,安全异常已从 localStorage 中删除。所以 Safari 可能实际上不会抛出错误,而是让它默默地失败(在某些情况下)。这可能就是您的 setItem 调用成功的原因。
在这一点上,根据给定的信息,我怀疑,先生,由于 Safari 程序员严格遵循 standard,您运气不佳。
我仍在等待 Apple 的回复,但可以肯定地说,我们无法解决此问题。所以 Anubhav 的回答是准确的,但我们仍然需要一个解决方案。
因此,作为解决方法,我们在服务器上为 persisting/restoring 游戏状态创建了新端点。我们仅将此用于 Safari,对于所有其他浏览器,我们仍将游戏状态保存在 localStorage 中。
用户的性能会略有下降。以及少量的服务器成本。这不是一个性感的解决方案,但现在我们的 Facebook canvas 应用程序支持 Safari。