문제

고객의 기능 요청을 수용하기 위해 인터넷을 사용할 수 있을 때 내 애플리케이션이 새 버전을 사용할 수 있는지 웹 사이트에서 확인하고 싶습니다.

문제는 서버 측에서 수행해야 할 작업에 대해 전혀 모른다는 것입니다.

내 응용프로그램(Qt를 사용하여 C++로 개발됨)이 서버에 요청(HTTP?)을 보내야 한다고 상상할 수 있지만, 이 요청에 무엇이 응답할까요?방화벽을 통과하려면 포트 80을 사용해야 할까요?이 올바른지 ?

아니면 그러한 기능을 사용하려면 네트워크 관리자에게 통신할 특정 포트 번호를 열어달라고 요청해야 합니까?


@필리프 :자세한 답변에 감사드립니다.나에게는 아직 불분명한 것이 있습니다.

좋다

http://www.example.com/update?version=1.2.4

그런 다음 원하는 것을 반환할 수 있으며, 아마도 새 버전 설치 프로그램의 다운로드 URL도 반환할 수 있습니다.

어떻게 반품하나요?PHP 페이지일까요, 아니면 ASP 페이지일까요? (저는 PHP나 ASP에 대해 아무것도 모릅니다. 고백해야겠습니다.)어떻게 디코딩할 수 있나요? ?version=1.2.4 그에 따라 무언가를 반환하기 위해 부분?

도움이 되었습니까?

해결책

귀하의 웹 사이트에 일반 HTTP 요청을 수행하는 것이 좋습니다.다른 모든 것은 실패할 수밖에 없습니다.

로컬 애플리케이션 버전이 포함된 사이트의 특정 페이지에 HTTP GET 요청을 보내겠습니다.

좋다

http://www.example.com/update?version=1.2.4

그런 다음 원하는 것을 반환할 수 있으며, 아마도 새 버전 설치 프로그램의 다운로드 URL도 반환할 수 있습니다.

최신 버전의 정적 파일을 서버에 넣고 클라이언트가 결정하도록 하면 어떨까요?프로세스를 제어하기를 원하거나 필요로 할 수 있기 때문입니다.어쩌면 1.2가 나중에 서버와 호환되지 않을 수도 있으므로 서버에서 강제로 1.3으로 업데이트하기를 원하지만 1.2.4에서 1.2.6으로의 업데이트는 중요하지 않을 수 있으므로 클라이언트에 선택적 업데이트.

또는 설치 기반에 대한 분석을 원합니다.

또는 무엇이든.일반적으로 저는 서버에 대한 정보를 최대한 많이 유지하는 것이 가장 좋다는 것을 배웠습니다. 왜냐하면 서버는 최종적으로 제어할 수 있는 부분이기 때문입니다.

현장에서의 약간의 경험을 바탕으로 다음은 무엇이 잘못될 수 있는지(그리고 앞으로도 그럴 것인지에 대한 작은 미리 보기)입니다.

  • 귀하의 애플리케이션은 다양한 개인 방화벽 애플리케이션에 의해 HTTP 요청을 하는 것이 차단됩니다.
  • 상당수의 사용자에게는 실제로 업데이트 프로세스를 진행하는 데 필요한 권한이 없습니다.
  • 사용자가 개인 방화벽을 통과하여 이전 버전을 허용한 경우에도 해당 도구는 .EXE가 변경되었기 때문에 불만을 표시하고 사용자에게 새 exe 연결을 허용하지 말라고 권장합니다(사용자는 일반적으로 여기에서 보안 도구의 요구 사항을 따릅니다). .
  • 관리되는 환경에서는 웹에서 실행 가능한 콘텐츠를 로드한 다음 실제로 실행하기 위해 총격을 받고 교수형을 당하게 됩니다(꼭 그런 순서일 필요는 없음).

그래서 최대한 피해를 최소화하기 위해

  • 업데이트 서버에 연결할 수 없으면 자동으로 실패합니다.
  • 업데이트하기 전에 설치 디렉터리에 대한 쓰기 권한이 있는지 확인하고 그렇지 않은 경우 사용자에게 경고하거나 전혀 업데이트하지 마십시오.
  • 관리자가 자동 ​​업데이트를 끌 수 있는 방법을 제공합니다.

하려는 일을 하는 것은 재미가 없습니다. 특히 제가 여러 번 그랬던 것처럼 기술적인 성향이 없는 사용자를 상대할 때는 더욱 그렇습니다.

다른 팁

Pilif의 답변은 좋았으며 이에 대해서도 많은 경험이 있지만 더 추가하고 싶습니다.

yourapp.exe를 시작하면 "업데이트 프로그램"이 yourapp.exe를 최신 버전으로 덮어쓰려고 시도한다는 점을 기억하세요.운영 체제와 프로그래밍 환경에 따라(C++/QT에 대해 언급하셨지만 저는 이에 대한 경험이 없습니다) ~ 아니다 덮어쓸 수 있다 yourapp.exe 사용될 것이기 때문입니다.

내가 한 일은 런처를 만드는 것입니다."실제 exe"를 실행하기 위해 구성 파일(xml, 매우 간단함)을 사용하는 MyAppLauncher.exe가 있습니다.새 버전이 존재하는 경우 Launcher는 사용 중이 아니기 때문에 "실제 exe"를 업데이트한 다음 새 버전을 다시 시작할 수 있습니다.

그것만 명심하면 안전할 것입니다.

남자 이름,

물론 당신 말이 옳습니다.하지만 설치 프로그램과 함께 런처를 제공하겠습니다.아니면 설치 프로그램을 다운로드하고 실행한 후 최대한 빨리 종료하세요.그 이유는 런처의 버그 때문입니다.업데이트할 수 없는 구성 요소에 의존하고 싶지는 않을 것입니다(또는 초기 드롭에 포함하는 것을 잊어버린 경우).

따라서 내 애플리케이션의 업데이트 프로세스와 함께 배포하는 페이로드는 단지 표준 설치 프로그램일 뿐이며 중요한 UI가 없습니다.클라이언트는 설치 프로그램이 성공적으로 실행될 수 있는지 확인하고 업데이트 프로그램을 다운로드한 후 이를 실행하고 자동으로 종료됩니다.

그러면 업데이트 프로그램이 실행되어 원래 설치 디렉터리에 페이로드를 설치하고 (업데이트되기를 희망하는) 애플리케이션을 다시 시작합니다.

아직:프로세스는 매우 복잡하므로 응용 프로그램의 사용 범위가 광범위할 경우 Windows 플랫폼에서 자동 업데이트 기능을 구현하기 전에 다시 한 번 생각하는 것이 좋습니다.

PHP에서는 문제가 쉽습니다.

<?php
    if (version_compare($_GET['version'], "1.4.0") < 0){
        echo "http://www.example.com/update.exe";
    }else{
        echo "no update";
    }
?>

물론 이를 확장하여 현재 사용 가능한 버전이 스크립트 내부에 하드 코딩되지 않도록 할 수 있지만 이는 단지 요점을 설명하기 위한 것입니다.

애플리케이션에는 다음과 같은 의사 코드가 있습니다.

result = makeHTTPRequest("http://www.example.com/update?version=" + getExeVersion());
if result != "no update" then
    updater = downloadUpdater(result);
    ShellExecute(updater);
    ExitApplication;
end;

중요하고 필수 업데이트인지 여부를 클라이언트에게 알리기 위해 PHP 스크립트가 반환할 수 있는 항목을 지정하여 "프로토콜"을 자유롭게 확장하세요.

또는 사용자에게 표시할 텍스트를 추가할 수 있습니다. 변경된 내용에 대한 정보가 포함될 수도 있습니다.

당신의 가능성은 매우 무한합니다.

내 Qt 앱은 QHttp를 사용하여 내 웹사이트에서 최신 버전 번호가 포함된 작은 XML 파일을 읽습니다.현재 버전 번호보다 크면 다운로드 페이지로 이동할 수 있는 옵션이 제공됩니다.매우 간단합니다.잘 작동합니다.

나는 @Martin과 @Pilif의 답변에 동의하지만 다음을 추가합니다.

최종 사용자가 실제로 업데이트를 설치할지 여부를 결정하도록 허용하거나, 프로그램 사용을 마칠 때까지 업데이트 설치를 연기하는 것을 고려해보세요.

앱의 목적/기능은 모르지만 사용자가 특정 작업을 수행해야 할 때 많은 애플리케이션이 시작됩니다. 앱을 시작한 다음 새 버전을 찾았다는 말을 듣는 것보다 더 짜증나는 것은 없습니다. 다운로드될 때까지 기다렸다가 앱을 종료하고 다시 시작하세요.프로그램에 업데이트될 수 있는 다른 리소스(참조 파일, 데이터베이스 등)가 있는 경우 문제는 더욱 악화됩니다.

우리는 약 400개 상점에서 EPOS 시스템을 실행하고 있었고 처음에는 프로그램이 업데이트를 찾아 다운로드하도록 하는 것이 좋을 것이라고 생각했습니다(위의 제안과 매우 유사한 버전 번호가 포함된 파일을 사용하여)...좋은 생각이야.모든 상점이 거의 같은 시간(오전 8시 45분~8시 50분)에 시스템을 시작했고 우리 서버가 400개의 원격 서버에 20Mb 이상의 다운로드를 제공하는 데 문제가 있었습니다. 그러면 로컬 소프트웨어가 업데이트되어 오류가 발생했습니다. 재시작.카오스 - 약 10분 동안 누구도 거래할 수 없습니다.

말할 필요도 없이 이로 인해 우리는 '업데이트 확인' 기능을 끄고 상점에서 그날 늦게까지 업데이트를 '지연'할 수 있도록 재설계했습니다.:-)

편집하다:그리고 ADOBE의 누군가가 책을 읽고 있다면, 도대체 내가 문서를 읽기 위해 시동을 걸고 싶은데 왜 빌어먹을 곡예사 독자가 업데이트를 다운로드하려고 고집하고 헛소리를 하는 걸까요?PDF를 읽고 싶을 때마다 업데이트를 찾기 위해 내 인생의 20~30초를 더 낭비하지 않고도 시작할 때 충분히 느리고 충분히 부풀어오르지 않습니까?
그들은 자신의 소프트웨어를 사용하지 않습니까??!!! :-)

서버에는 최신 버전의 버전 번호(및 다운로드 URL)가 포함된 간단한 "latestversion.txt" 파일만 있을 수 있습니다.그런 다음 클라이언트는 간단한 HTTP 요청(예, 포트 80에 대한)을 사용하여 이 파일을 읽어서 검색하면 됩니다. http://your.web.site/latestversion.txt, 그런 다음 구문 분석하여 버전 번호를 얻을 수 있습니다.이렇게 하면 멋진 서버 코드가 필요하지 않습니다. 기존 웹사이트에 간단한 파일만 추가하면 됩니다.

example.com의 업데이트 디렉터리에 파일을 보관하는 경우 이 PHP 스크립트는 이전에 언급한 요청에 따라 해당 파일을 다운로드해야 합니다.(업데이트는 yourprogram.1.2.4.exe입니다.

$version = $_GET['version'];    
$filename = "yourprogram" . $version . ".exe";
$filesize = filesize($filename);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: post-check=0, pre-check=0");
header("Content-type: application-download");
header('Content-Length: ' . $filesize);
header('Content-Disposition: attachment; filename="' . basename($filename).'"');
header("Content-Transfer-Encoding: binary");

이렇게 하면 웹 브라우저가 애플리케이션을 다운로드하고 있다고 생각하게 됩니다.

이를 실현하는 가장 간단한 방법은 다음과 같은 라이브러리를 사용하여 HTTP 요청을 실행하는 것입니다. libcurl 온라인 버전이 포함되어 있고 온라인에서 새 버전을 사용할 수 있는 ini 또는 xml 파일을 다운로드하도록 합니다.

xml 파일을 구문 분석한 후 새 버전이 필요한지 확인하고 libcurl을 사용하여 새 버전을 다운로드하여 설치할 수 있습니다.

최신 버전의 버전 번호와 새 버전을 다운로드할 수 있는 URL이 포함된 (XML) 파일을 서버에 올리기만 하면 됩니다.그런 다음 애플리케이션은 XML 파일을 요청하고 버전이 자체 버전과 다른지 확인한 후 그에 따라 조치를 취할 수 있습니다.

버전 확인 목적으로만 사용하려면 서버에 있는 간단한 XML 파일이면 충분할 것 같습니다.

그러면 서버에 ftp 계정만 있으면 되며 새 버전을 구축한 후 ftp를 통해 파일을 보낼 수 있는 시스템을 구축해야 합니다.해당 빌드 시스템은 설치 파일/zip을 웹사이트에 직접 넣을 수도 있습니다!

정말 기본적인 내용을 유지하려면 정수 버전 번호가 포함된 version.txt를 웹 서버에 업로드하기만 하면 됩니다.다운로드한 최신 version.txt에 대해 해당 검사를 다운로드한 다음 msi 또는 설치 패키지를 다운로드하여 실행하세요.

더 고급 버전은 rss, xml 또는 이와 유사한 것을 사용하는 것입니다.RSS를 구문 분석하려면 타사 라이브러리를 사용하는 것이 가장 좋으며 원하는 경우 변경 사항에 대해 사용자에게 표시되는 정보를 포함할 수 있습니다.

기본적으로 간단한 다운로드 기능만 있으면 됩니다.

이 두 솔루션 모두 클라이언트 측에서 나가는 포트 80에 액세스하기만 하면 됩니다.일반적으로 방화벽이나 네트워킹(클라이언트 측)을 변경할 필요가 없으며 인터넷에 연결된 웹 서버(웹 호스팅, 코로케이션 또는 자체 서버 - 모두 여기에서 작동함)만 있으면 됩니다.

몇 가지 상용 자동 업데이트 솔루션을 사용할 수 있습니다.나는 Click-Once 및 Updater Application Block을 사용하는 .net 측에서만 경험이 있기 때문에 이에 대한 권장 사항은 다른 응답자에게 맡길 것입니다(후자는 더 이상 계속되지 않습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top