programing

구글 크롬으로 커스텀 URL 스킴을 오픈할 수 있습니까?

itmemos 2023. 9. 14. 21:43
반응형

구글 크롬으로 커스텀 URL 스킴을 오픈할 수 있습니까?

맥 OS X에 등록된 서드파티 앱으로 스킴을 관리하는 프로토콜(http와 같은)이 있습니다. 즉, x-someapp://some action 등입니다.

구글 크롬으로 이 URL을 열려면 어떻게 해야 합니까?기본적으로 Chrome은 Google 엔진에서 검색을 시작합니다. 대신 App을 실행하고 URL 처리를 전달합니다.

Safari가 일부 등록된 앱을 실행합니다.그리고 옳은 일입니다.

Firefox 및 Opera에서 수행할 작업을 묻습니다...앱을 실행할 수도 있습니다.

하지만 크롬은...묻지 않습니다.

XHtpRequest를 보내기 위해 자바스크립트가 포함된 HTML 페이지를 작성하려고 하기도 했습니다.

function _httpExecuteCallback()
{
 if (httpRequestCallbackFunction != null) {
  if (httpRequest.readyState == 4) {
   if (httpRequest.status == 200) {
    httpRequestCallbackFunction();
    httpRequestCallbackFunction = null;
   }   
  }
 }
}

function _httpGet(url, callbackFunction)
{
 httpRequest = false;
 httpRequestCallbackFunction = callbackFunction;
 httpRequest = new XMLHttpRequest();
 httpRequest.onreadystatechange = _httpExecuteCallback;
 httpRequest.open('GET', url, true);
 httpRequest.send(null);
}


_httpGet('x-someapp://test',function(){})

결과도 없습니다...

현재 승인된 솔루션은 SSL https용 Chrome에 문제가 있습니다.Chrome은 콘솔 로그를 보면서 사용자 지정 url 프로토콜이 안전하지 않다고 생각하여 요청을 차단합니다.

[blocked] The page at reports blah blah ran insecure content from customproto//blah blah

다음은 해결책입니다(조사하는 데 며칠이 걸렸습니다).

    <input type='button' value='Test Custom Url' onclick='exec()'>

    <script>
    function submitRequest(buttonId) {
        var d = (window.parent)?window.parent.document:window.document
        if (d.getElementById(buttonId) == null || d.getElementById(buttonId) == undefined) return;
        if (d.getElementById(buttonId).dispatchEvent) {
                var e = d.createEvent("MouseEvents");
                e.initEvent("click", true, true);
                d.getElementById(buttonId).dispatchEvent(e);
        } 
        else {
                d.getElementById(buttonId).click();
        }
    }

    function exec(){
        var d = (window.parent)?window.parent.document:window.document
        var f = d.getElementById('customUrlLink')
        if (f ) {f.parentNode.removeChild(f);}
        var a = d.createElement('a');
        a.href =  'mycustomproto://arg1';    
        a.innerHTML = "Link"                                    
        a.setAttribute('id',        'customUrlLink');
        a.setAttribute("style", "display:none; "); 
        d.body.appendChild(a); 
        submitRequest("customUrlLink");
    }
    </script>

IE에서는 이 코드가 작동하지 않습니다.이 기법을 사용하면 IE가 사용자 지정 프로토콜의 인수를 1000자 미만으로 제한하고 iFrame 기법을 사용하면 2083자를 허용한다는 것을 알게 되었습니다.

자바스크립트에서 URL 제한을 극복할 수 있는 유일한 방법은 데이터를 척하고 여러 번 호출하는 것입니다.만약 누군가 그것을 시도하고 싶다면, 어떻게 되는지 알려주세요.그것을 사용하고 싶습니다.

실행 앱에서 긴 URL을 처리하려면 토큰을 앱에 전달하고 URL GET에서 데이터를 가져오도록 합니다.

그래서 지금은 Chrome/FF에 하나의 기능을 사용하고 IE에 다른 기능을 사용하고 있습니다.

이러한 링크를 통해 이 솔루션을 개발할 수 있었습니다.

https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page

링크에서 jQuery/JavaScript 클릭 시뮬레이션

(이 사실을 며칠 전에 알았더라면..)이것이 누군가에게 도움이 되길 바랍니다.

==================================================

업데이트: (8시간 후)

==================================================

Jake는 크롬에 대한 훌륭한 솔루션을 게시했습니다: https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page

크롬에서만 작동합니다.

 window.location.assign("customprotocol://");

iframe에서는 실패하므로 작동합니다.

var w = (window.parent)?window.parent:window
w.location.assign(service + '://' +  data)

==================================================

업데이트: (몇 주 후)

==================================================

사용자 정의 프로토콜을 여는 모든 예는 나의 것을 포함하여 url에 "://"이 있습니다.그리고 이것이 SSL 경고의 원인입니다.

해결책은 "://"를 ":"로 바꾸는 것입니다.

따라서 이렇게 하십시오.

src="x-myproto:query"  .....

SSL 경고는 사라질 겁니다

==================================================

팔로우: (수개월간 생산 사용 후)

==================================================

이것은 chorme에게 잘 들어왔습니다.브라우저를 감지하고 크롬을 사용할 경우 다음 작업을 수행합니다.

var w = (window.parent)?window.parent:window
w.location.assign('myproto://xyzabcdefetc')

IE와 다른 브라우저의 경우 저는 약간 다른 일을 합니다.

브라우저는 사용자 정의 URL 프로토콜에 넣을 수 있는 데이터의 양에 제한을 가합니다.문자열이 800자 이하이면 모든 브라우저에서 사용할 수 있는 매직 넘버인 것 같습니다.

구글의 위치바 파싱이 방해가 되고 있는 것 같습니다.

그러나 브라우저는 사용자 정의 URL 스킴을 제대로 처리하는 것 같습니다.위치 표시줄에서 사용해 보십시오.

javascript:document.location = 'myscheme://whatever'

사용자 지정 구성표를 사용하는 페이지의 모든 링크도 올바른 작업을 수행해야 합니다.

크롬과 연동되는 솔루션을 찾았습니다.IFRAME 방식을 사용합니다.

예제(JQuery 포함):

$("body").append('<span id="__protoProxy"></span>');

function queryWord(aWord)
{
 var protoProxy = document.getElementById('__protoProxy');
 if (protoProxy)
 {   
  var word = aWord.replace('"','\"');
  protoProxy.innerHTML = '<div style="display:none;"><iframe src="x-myproto://query?' + word + '"></iframe></div>';
 }
}

queryWord('hello');

사용자가 앱을 가지고 있지 않을 경우 앱스토어/플레이스토어로 리디렉션하는 기능도 포함된 솔루션입니다.이를 위해 setTimeout을 사용합니다.또한 아이프레임을 사용하여 더 많은 브라우저를 지원합니다.그래서 이것은 Chrome과 다른 모든 모바일 브라우저에서 작동합니다.우리는 이것을 나의 회사로 사용합니다, 브랜치.당신의 URI와 App Store 링크에 맞게 아래 두 링크만 수정하면 됩니다.

<!DOCTYPE html>
<html>
    <body>
        <script type="text/javascript">
            window.onload = function() {
                // Deep link to your app goes here
                document.getElementById("l").src = "my_app://somepath";

                setTimeout(function() {
                    // Link to the App Store should go here -- only fires if deep link fails                
                    window.location = "https://itunes.apple.com/us/app/myapp/id123456789?ls=1&mt=8";
                }, 500);
            };
        </script>
        <iframe id="l" width="1" height="1" style="visibility:hidden"></iframe>
    </body>
</html>

iframe 덕분에 어느 브라우저에서나 작동할 수 있습니다.

Chrome이 URL 스킴을 인식하지 못하면 기본적으로 검색으로 전환됩니다.

이것이 제가 Safari에서 보는 것입니다: alt text http://img62.imageshack.us/img62/6792/clipboard02oh.jpg

Firefox에서 다음을 수행할 수 있습니다.

alt text http://img138.imageshack.us/img138/9986/clipboard04xk.jpg

크롬이 검색을 기본으로 하는 이유는 콜론을 사용하는 특별한 구글 검색이 있기 때문이라고 생각합니다.

예:

  • 정의: 사전
  • 파일 형식:pdf 구글 크롬

이것은 Firefox에 대한 불편함 중 하나입니다. 이러한 유형의 검색을 실행하려면 주소 표시줄이 아닌 "검색 상자"로 이동해야 합니다.Chrome에는 Firefox와 IE 및 Safari처럼 별도의 검색창이 없기 때문에 이 기능이 필요합니다.

아약스의 요청으로는 해결할 수 없습니다.

몇 주 후에..

처럼 보인다window.location.replace('myscheme://whatever')모든 크로스컨트리를 지원하며 크롬, 크롬, 크롬, 크롬, 엣지, 엣지 등과 함께 작동합니다. https://developer.mozilla.org/en-US/docs/Web/API/Location/replace 참조

언급URL : https://stackoverflow.com/questions/2330545/is-it-possible-to-open-custom-url-scheme-with-google-chrome

반응형