まず、問題の背景:
フロントページに入ると、それはアプリのトークンにリンクを運ぶでしょう、そしてあなたが必要なすべての基本的な情報と、グローバルwindowオブジェクトにフィールドを追加しますが、問題は、最初のエントリ問題はないが、Appleの6P / 6spことです10バージョン、Alipayの決済アプリを呼び出し、その後、アプリ内で返却した後、必要なウィンドウオブジェクト内の情報の損失があった、支払いから返された結果は、それがログインページにジャンプします。
図1に示すように、コード・ロジック調査
(1)アプリは、オブジェクトをキャプチャアプリの後、基本的な情報が必要なウィンドウに追加されたときにページがWebViewのを開くたびに更新され、追加することで、通常の
(2)フロントエンドのコードページ、過負荷各ページのリフレッシュは、最初のウィンドウオブジェクトからではなくキャッシュから取得する情報を取得し、その後の値はwindow.name値であるか否かを判断し、使用window.nameがあり、最終的にキャッシュを設定します情報を返します。
アプリのヘルプ改ページから(3)と、問題のコードを実行することが分かっが実行中で、ここに表示され、ウィンドウ。CarisokConfig = JSON 。パース(ウィンドウ。名前の前に)、すべてが正常ですが、実行中のウィンドウ。CarisokConfig = JSON 。パース(ウィンドウ。名前キャッチの実装の一部は、基本的な情報が空に設定するために必要な間)、エラーが発生しました。
(4)于是排查window.name,发现正常的机子下,断点抓到的window.name值如下:
而在苹果6p/6sp,10版本这类异常的机子下,断点抓到的window.name值如下:
很意外,没有代码对window.name进行格式化,也没添加nameStorage,但此处竟然异变了,百思不得其解....
二、解决思路:
添加代码,判断window.name值是否带了{},可以被Json.parse,否则将不赋值window.name给window.carisokConfig,防止window.carisokConfig被置空,当然是考虑这样限制不会给其他端,比如需要用到window.name的环境造成影响。