web-dev-qa-db-ja.com

iOS7 Safari:ホーム画面に保存してトークンを保持

IOS 6. [something]以降の場合、フルスクリーンWebアプリのCookie、SQLiteデータ、およびlocalStorageデータは、Safariデータとは別に保存されます。ホーム画面に保存するときにホーム画面アプリに永続化する必要があるトークンがあります。

クッキーテスターがあります ここ 。そして議論 ここ

誰かがこの問題のエレガントな解決策を見つけましたか?非常に醜い解決策も検討されます:)

22
TheGwa

IOS 5以降、Appleは、Safariブラウザと現在サンドボックスアプリケーションと見なされているものとの間でデータを共有するという点で、ホーム画面のブックマークをますます分離しています。

  • iOS <= 5:すべてがクールで、ローカルストレージ、Cookie、作品はホーム画面とWebページの間で共有されました。サイトとホーム画面の間の移行はシームレスで、Web開発者は満足していました。
  • iOS 6:Appleホームスクリーンアプリ(Webから保存されたアプリを含む)をサンドボックスアプリケーションとして扱い始めました。基本的に、保存されたサイトを表示するホームスクリーンアプリはWebViewになりました。制御し、Safari自体を埋め込んでいませんでした。これにより、ローカルストレージが転送されなくなりましたが、Cookieを共有することはできました。
  • iOS <= 6.x:特定のドットリリース後にCookieの信頼性が低下し、共有されたままでしたが、最初の保存時に転送されませんでした。サイトに戻って何らかのアクションを実行すると、Cookieが魔法のようにホーム画面アプリで利用できるようになります。
  • iOS 7:ホーム画面とそれが保存されたサイトとの間のあらゆる形式のデータ共有(ローカルストレージ、Cookieなど)が(ほぼ)失われ、世界中の開発者の夢が崩壊しました。

執筆時点(ベータ版のiOS 7.1)では、選択肢は1つだけです。

  1. ページが読み込まれたら、JavaScript(window.location.search)を使用してURLのクエリ文字列パラメーターにトークン/データを追加します。ユーザーがサイトをホーム画面に保存すると、URLがキーとして使用されます。 JavaScriptは、ホーム画面モード(window.standalone)であることを検出した場合、以前に潜入したクエリ文字列パラメーターを簡単に抽出できます。これは、URLの値も永久に存在することを除いて、永久に機能するはずです。

  2. DOMのホーム画面に伝えたい値を「レンダリング」するもう1つのトリック。 iOSの初期バージョン以降、ホーム画面に保存されるときにレンダリングされるHTMLは変更されません。ホーム画面のWebアプリを起動すると、RLからのコンテンツは要求されません。最初のWebリクエストなしで以前に保存されたHTMLをロードするだけです(HTML内のCSSおよびJSへのすべてのリンクがリクエストされますが、ページ自体はリクエストされません)。 HTMLは永久に保存されるという知識があれば、HTMLでレンダリングしたものもすべて保存されます。ページを更新する唯一の方法は、AJAXを介してコンテンツをプルしていない場合は、windows.reloadまたは同等のリダイレクトを実行することです。簡単に言うと、たとえば非表示の入力フィールドに値を挿入すると、値が転送されます。

オプション#1はおそらく永遠に続くでしょう、それはホームスクリーンが決してURLを変えることはないでしょう。それを取り除きたい場合は、スイッチを切り替えてページをリロードするためのJSが配置されていることを確認してください。

オプション#2は、ある日、すべてを知っているAppleが、保存された時点で同じHTMLを使用する代わりに、最初のページ要求を実際に行う必要があると判断する可能性があるため、やや危険です。これにより、ワイプされます。あなたが持っているデータとDOM内の要素の現在の状態を取り出します。

[〜#〜] update [〜#〜]:DOMインジェクション手法も無効になり(iOS 7以降)、サーバーから直接ダウンロードされたDOMのみがホーム画面に保存されます。実行時に行われた動的な変更はすべて失われます。質問はiOS7に関するものであり、それが長く機能するため、オプション#2を削除しました。これにより、オプション#1のみが残り、URLに何かを追加して、常にホーム画面に保存されます。

44
BrutalDev