iOS7的Safari浏览器:保存到主屏幕和持久的令牌

对于iOS 6. [某些]起,全屏Web应用程序的Cookie,SQLite数据和localStorage数据与Safari数据分开存储。 我有一个令牌,我需要在保存到主屏幕时持久保存到主屏幕应用程序。

这里有一个cookiestesting器。 并在这里讨论。

有没有人find一个优雅的解决这个问题? 非常难看的解决scheme也将被视为:)

自iOS 5以来,苹果公司已经使得主屏幕书签在Safari浏览器和现在被认为是沙盒应用程序的数据共享方面越来越孤立。

  • iOS <= 5 :一切都很酷,本地存储,cookies,作品在主屏幕和网页之间共享。 网站和主屏幕之间的过渡是无缝的,网站开发人员很高兴。
  • iOS 6 :苹果开始将主屏幕应用程序(包括从networking保存的应用程序)视为沙盒应用程序。 本质上,显示您保存的网站的主屏幕应用程序成为一个WebView控件,并没有embeddedSafari本身。 这阻止了本地存储的传输,但是您仍然可以共享Cookie。
  • iOS <= 6.x :在某个点释放之后,Cookie变得有些不可靠,但它们仍然是共享的,但是在第一次保存时没有被传输。 如果你回到网站,并执行一些行动,cookie将神奇地成为主屏幕应用程序可用。
  • iOS 7 :主屏幕和保存网站的所有forms的数据共享(本地存储,cookies等)已经丢失(几乎),破坏了开发者的梦想。

在撰写本文时(iOS 7.1 beta版),您只有一个选项。

  1. 加载页面时,使用JavaScript( window.location.search )将标记/数据添加到URL中的查询string参数。 当用户将该站点保存到他们的主屏幕时,该URL被用作密钥。 如果您检测到您处于主屏幕模式( window.standalone ),则您的JavaScript可以轻松提取您之前潜入的查询string参数。 这应该永远工作,除了URL中的值也将永远存在。

  2. 另一个诀窍是“渲染”你想要传递到DOM主屏幕的任何值。 自iOS的早期版本起,保存到主屏幕时呈现的HTML将保持不变。 启动主屏幕networking应用程序时, 不会从url请求内容 它只是加载以前保存的HTML,没有初始的Web请求(HTML中的所有链接都将被请求,而不是页面本身)。 随着知识的HTML永远保存,所以你也会在其中呈现任何东西。 更新你的网页的唯一方法是做一个windows.reload或等效的redirect,如果你不是通过AJAX拉你的内容。 长话短说,将您的价值注入隐藏的input字段,例如,它将被转移。

选项#1可能会永远持续下去,主屏幕不可能以任何方式改变URL。 只要确保你有一些JS来翻转开关,并重新加载页面,如果你想摆脱它。

选项2有点冒险,因为有一天,所有知道的苹果都可以决定,实际上应该做一个初始的页面请求,而不是在保存点上使用相同的HTML。 这会消除你所拥有的数据和DOM中任何元素的当前状态。

更新 :DOM注入技术不再有效(iOS 7+),只有从服务器直接下载的DOM被保存到主屏幕。 运行时所做的任何dynamic更改都将丢失。 攻击选项#2,因为问题是针对iOS 7,它的工作时间更长,只剩下选项#1,向URL添加一些内容,这些内容将始终保存到主屏幕。