29

現在、Chrome Web Store に拡張機能があり、多くのユーザーが利用しています。現在、foo.site.com へのアクセスを要求していますが、bar.site.com を取得できるように権限を更新したいと考えています。

私が今理解しているように、これら 2 つの権限を必要とする新しい更新プログラム (新しい拡張機能バージョンを Chrome Web ストアにプッシュする場合) をプッシュすると、既存のユーザーは手動で再度有効にするまで拡張機能が無効になります。更新後に拡張機能をダウンロードする新しいユーザーは問題なく、両方の権限を持っています。ただし、現在のユーザーを無効にすることはできません。

これを回避する方法はありますか?

既存のユーザーの問題を解決するオプションのアクセス許可を検討しました (ボタンをクリックしてアクセス許可をアップグレードし、先に進むように依頼するだけです)。ただし、新しいユーザーの場合、拡張機能をインストールするだけでなく、オプションのアクセス許可を受け入れる必要がありますが、これは面倒です. 新規ユーザーがインストール時にすべての許可 (オプションおよび必須) を受け入れる方法はありますか?

4

4 に答える 4

8

はい、解決策があります。新しいアクセス許可をオプションとして設定し、ユーザーが新しい機能を使用する前にアクセス許可を要求します。は仕事100%です。

これをマニフェストに追加します。

"permissions": ["tabs","http://*/*","https://*/*"],

その後、次を使用できます。

chrome.permissions.request 

chrome.permissions.contains
于 2013-02-04T20:36:05.750 に答える
5

Chrome 16 以降、インストール時に optional_permission を設定し、実行時に権限の昇格を求めることができます。https://developer.chrome.com/extensions/permissionsを参照してください

manifest.json で:

  {
    "name": "My extension",
    ...
    "optional_permissions": [ "tabs", "http://bar.site.com/" ],
    ...
  }

popup.json で:

    document.querySelector('#my-button').addEventListener('click', function(event) {
    // Permissions must be requested from inside a user gesture, like a button's
    // click handler.
    chrome.permissions.request({
      permissions: ['tabs'],
      origins: ['http://bar.site.com/']
    }, function(granted) {
      // The callback argument will be true if the user granted the permissions.
      if (granted) {
        doSomething();
      } else {
        doSomethingElse();
      }
    });
  });
于 2015-08-05T05:49:43.147 に答える
5

拡張機能で同じ問題に直面したため、同じ質問を検索してこの投稿にたどり着きました。場合によっては許容できると思われるアップデートがあります。によると: https://support.google.com/chrome_webstore/answer/1054246 およびhttp://developer.chrome.com/extensions/permission_warnings.htmlの例

アクセス許可を更新すると、実際には拡張機能が無効になるようですが、変更についてユーザーにプロンプ​​トが表示され、簡単に「再度有効にする」ことができます。

あなたのシナリオでは受け入れられないかもしれませんが、私の場合、デフォルトで許可が追加された新しいユーザーの勝利は、既存のユーザーが再度有効にならないリスクよりも優先されます. これは、既存のユーザーが拡張機能が無効になっていることに気付いていなかった以前の方法よりも大幅に優れているためです...

この投稿が古いことは承知していますが、この質問に対する Google の結果のトップであるため、今後の参考のために更新するとよいと思います...

于 2013-09-12T08:27:23.023 に答える
1

既存のユーザーの拡張機能を無効にすることなく、新しい拡張機能のアクセス許可を追加する方法 (オプションのアクセス許可を使用) があります。また、新しいユーザーは、インストール後に必要なアクセス許可とオプションのアクセス許可の両方を受け入れるように求められます。

オプションのパーミッションは chrome.permissions.request API を使用してリクエストできますが、リクエストの前にユーザー アクションがある場合にのみ機能します。この要件を満たしながらシームレスなユーザー エクスペリエンスを提供する最も簡単な方法は、バックグラウンド ページでアクセス許可を確認し、実行時にポップアップでオプションのアクセス許可を要求することです。

許可要求は、拡張機能をロードした直後 (インストールおよびその後のブラウザーの起動後) にバックグラウンド ページで行うことができます。パーミッションのいずれかが不足している既存のユーザーは、ブラウザーを再起動した後、パーミッションを受け入れるように求められます。

次の例には、次のものが含まれます。

  • バックグラウンド ページ JavaScript (background_page.js)
  • 通知ポップアップ html ファイル (notification_popup.html)
  • 通知ポップアップ JavaScript (notification_popup.js)

この例を機能させるには、manifest.json で "optional_permissions" を宣言する必要もあります。この例は、Chrome 拡張機能と Firefox アドオンの両方で機能します。

background_page.js

var brwsr = null;
if (typeof chrome != "undefined") {
    brwsr = chrome;
}
else{
    brwsr = browser;
}
var opt_perms = brwsr.runtime.getManifest().optional_permissions; 
var requiredOptionalPermissions = {}
if(typeof opt_perms!="undefined" && opt_perms.length>0){
    var perms = []
    var origins = []
    var re = new RegExp("^(http|https)://", "i");
    for(var i=0; i<opt_perms.length; i++){
        if(opt_perms[i]==="<all_urls>"|| re.test(opt_perms[i])){
            origins.push(opt_perms[i])
        }
        else{
            perms.push(opt_perms[i])
        }
    }
    if(perms.length>0){
        requiredOptionalPermissions.permissions = perms
    }
    if(origins.length>0){
        requiredOptionalPermissions.origins = origins
    }
}
var requiresPermission = ()=>{
// add your code here
}
// check if optional permission exists and request if not
var runFunctionsRequiringOptPermissions = function(requiredPermissions={}, userGesture=false, callback=()=>{}){
    if(typeof requiredPermissions.permissions!="undefined" || typeof requiredPermissions.origins!="undefined"){
        brwsr.permissions.contains(requiredPermissions, function(res) {
            if (!res) {
                // The extension doesn't have the permissions.)
                if(userGesture){
                    brwsr.permissions.request(requiredPermissions, function(granted){
                        if(granted){
                            // perform actions that required the permission
                            requiresPermission()
                        }
                        callback();
                    });
                    return;
                }
                // open the notification popup 
                window.open("notification_popup.html", "extension_popup", "width=530,height=190,status=no,scrollbars=yes,resizable=no,screenY=+"+(screen.height/2-95)+",screenX="+(screen.width/2-265));
            }
            else{
                // perform actions that required the permission
                requiresPermission()
            }
        });
    }
}

runFunctionsRequiringOptPermissions(requiredOptionalPermissions)
// add listener 
brwsr.runtime.onConnect.addListener(function(port) {
    if(port.name == "optionalPermRequestPopup"){
        port.onMessage.addListener(
            function(request, sender, sendResponse) {
                if (request.okButtonClicked === true) {
                    runFunctionsRequiringOptPermissions(requiredOptionalPermissions, true, function(){
                        // callback to close the notification popup
                        port.postMessage({'close':true});
                    })
                    return;
                } 
                port.postMessage({'close':true})
            }
        );      
    }
});

notification_popup.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Extension Name</title>
    <style>
      .container {
        font-size:medium;
        text-align:center;
      }
      .button{
        height: 30px;
        width: 70px;
        background-color: #448be9;
        color: white;
        border-color: #448be9;
        border-width: thin;
        margin-right: 10px;
        float: right;
      }
      .btnCancel{
        background-color: white;
        color: #448be9
      }
      </style>
    </head>
    <body>
    <div class="container">
        <p class='text'>Please upgrade the permissions to enable the latest features.</p>
        <button class="button btnCancel">Cancel</button>
        <button class="button btnOk">OK</button>
    </div>
    <script src="notification_popup.js"></script>
    </body>
</html>

notification_popup.js

var brwsr = null;
if (typeof chrome != "undefined") {
    brwsr = chrome;
}
else{
    brwsr = browser;
}
var port = brwsr.runtime.connect({
    name : "optionalPermRequestPopup"
});
window.addEventListener("load", function(event) {
    var okButtons = document.querySelectorAll(".btnOk");
    okButtons.forEach(function(okButton) {
        okButton.addEventListener("click", function(event) {
            port.postMessage({okButtonClicked: true})
        });
    });
    port.onMessage.addListener(function(request) {
        for (var key in request) {
            switch(key){
                case "close":
                    window.close();
                    break;
                default:
                    break;
            }               
        }
    });
});
于 2020-05-30T08:51:09.490 に答える