2017-10-18 5 views
3

正常に動作していたアプリでChromeのストレージを使用しています。このプロセスは非常に簡単です。ユーザーが電子メールとパスワードを入力すると、アプリはXHR要求を使用して確認し、chrome.storage.local.setを使用してセッションを維持します。セッションが設定されたら、chrome.runtime.reload()を使ってアプリケーションをリロードします。すべてのリロードで私はセッションがアクティブかどうかを確認するためにcheckLogin関数を使用します。それは正常に動作していた。しかし、今、私はこのエラーを取得しています:chrome.runtime.reload()の後にchrome.storage.local.getが空になりました - パッケージ化されたアプリケーション

enter image description here

ストレージは、ストレージ内のキーワードを見つけることができないアプリやアプリをリロードし、未定義のエラーを返した後、空になっているようです。ここで

ユーザーが認証された後に呼び出されるコード:

postLogin = function (resultData) { 
if (resultData.authStatus == 1) { 
    chrome.storage.local.set({'userData': resultData}, function(){ 
     console.log("session saved"); 
    }); 
    chrome.runtime.reload() 
} 
else { 
    $("#result").html(resultData.authMsg); 
    $("#result").attr('style', 'display: inline-block !important'); 
} 
return false 
} 

アプリがリロードされたら、私は保存されたセッションチェック:私はエラーを取得しています。この時点で

checkLogin = function() { 
console.log(chrome.storage); 
chrome.storage.local.get("userData",function(result) { 
    userData = result.userData; 
    if (userData && userData.authStatus == 1) { 
     console.log("--- user signed In ---") 
     return true; 
    } 
    console.log(" ---- unable to find user session ----") 
    $("#auth-dialog").attr('style', 'display: inline !important'); 
    return false; 
}) 
} 

を上記のスクリーンショットに添付されています。また、ストレージの状態を確認するのにconsole.log(chrome.storage);を使用しました。 奇妙なことは、私は手動でコードの.get部分が正常に動作するアプリを再起動したことです。最初は、格納されたストレージの値を取得するためにページをリロードしなければならないというエラーが表示されます。

マニフェスト:

{ 
    ... 
    "permissions": [ "unlimitedStorage", "clipboardRead", "clipboardWrite", "nativeMessaging" , "storage" ], 
} 

UPDATE:記事の見出しに述べたように

問題がchrome.storageではありません。主な問題はchrome.runtime.reload()です。最初のアプリの起動後、私がchrome.runtime.reload()に電話をかけるとすぐに、chrome.から始まるアプリがリロードされても機能しません。

+0

これはアプリですか、拡張機能ですか?それは1つだけでなければなりません。あなたの質問を編集して、適切なタグだけを入力してください。 – Makyen

+0

トピックを作成するには[編集]してください:問題を再現する[mcve]を含める*。 Chrome拡張機能やFirefox WebExtensionsの場合は、* manifest.json *とバックグラウンド、コンテンツ、ポップアップスクリプト/ HTML、およびウェブページのHTML /スクリプトを含める必要があります。 (1)必要な動作、(2)特定の問題またはエラー、および(3)それを再現するために必要な最短のコードを含める必要があります。質問自体に*。また、[ここではどのような話題を聞くことができますか?](/ help/on-topic)、[ask]を参照してください。 – Makyen

+0

コード、エラー、データを画像ではなく** text **([using code formatting](// stackoverflow.com/editing-help#code))として追加してください。画像:A)テスト用のコード/エラー/データをコピー&ペーストすることはできません。 B)コード/エラー/データの内容に基づいて検索を許可しない。 [もっと多くの理由がある](https://meta.stackoverflow.com/a/285557)。一般に、テキスト形式のコード/エラー/データ>>>>コード/エラー/データとしてのイメージ>>なし。画像は、テキストコード/エラー/データだけで伝えられない重要なものが追加された場合、コードフォーマット*のテキストに加えて*使用する必要があります。 – Makyen

答えて

2

解決策は見つかりませんでしたが、回避策が見つかりました。私の元々の想定は、アプリケーションを再ロードした後にchrome.storageが動作しないということでした。何度かデバッグした後、私がchrome.runtime.reload()と呼ぶたびに、chrome.から始まる何かがリロードされるとすぐに呼び出されます。この問題をテストするには、アプリケーションからすべてを削除しました。マニフェストの詳細を示すログメッセージconsole.log(chrome.runtime.getManifest())と、chrome.runtime.reload()というクリックイベントに1つのボタン「リロード」があります。最初のアプリの起動時には、マニフェストの詳細を示すコンソールログメッセージですべて正常に動作します。私はそれを示してリロードボタンやアプリのリロードをクリックすると:

Uncaught TypeError: chrome.runtime.getManifest() is not a function

私は同じ未定義のエラーでchrome.storage.local.set/getのような他の機能を使用してみました。

この問題を解決するには、アプリをリロードする代わりに新しいウィンドウを作成し、前のウィンドウを閉じます。

chrome.app.window.create(
    'main.html', 
    opt); 
setTimeout(function() { 
    //close previous window 
}, 300); 

同じ問題を抱えていて誰かがこれに対してより良い/よりクリーンな回避策を見つけた場合は、共有してください。

+0

私は似たような問題を抱えています。時には、起動時にChromeアプリケーションが「高速」に実行され、chrome.runtime.getManifestまたはchrome.runtime.getPlatformInfoが定義されていないため、同じようにソリューションを使用する必要があります。私はクロムコードを辿って、次のように見つけました: – Imskull

+0

"apiFunctions.setHandleRequest( 'getManifest'、function(){ return runtimeNatives.GetManifest(); }));" 非同期コードによってクロムバグが発生しましたか?しかし、私は分かりません。 – Imskull

関連する問題