2013-04-08 2 views
14

Google Play 외부의 서버에서 호스팅되는 Android 앱을 제작 중입니다. 새 버전을 확인하고 앱을 시작할 때 업데이트하라는 사용자에게 앱이 필요합니다.Phonegap Android 앱 트리거 프로그래밍 방식으로 업데이트

잘 작동하는 새 버전 (서버에서 파일을 확인하고 버전을 비교하는 앱)을 확인하는 메커니즘을 만들었습니다. 그런 다음 사용자에게 업데이트를 요청하지만 사용자가 업데이트 진행을 선택하면 apk의 다운로드 및 설치를 시작할 수 없습니다. apkURL 서버에 호스팅 된 .apk 파일에 대한 전체 HTTP 링크입니다

window.open(apkURL); 

:

나는 단순히 APK URL을 여는 시도.

하지만 아무 것도하지 않는 것 같습니다.

저는 조사 중이지만 어떻게해야하는지에 대한 답을 찾지 못했습니다. 이 게시물 Install Application programmatically on Android처럼 네이티브 코드를 사용하여 몇 가지 제안을 찾았지만 내 Phonegap 앱에서 그 방법을 알지 못합니다.

Intent promptInstall = new Intent(Intent.ACTION_VIEW) 
.setData(Uri.parse("file:///path/to/your.apk")) 
.setType("application/vnd.android.package-archive"); 
startActivity(promptInstall); 

업데이트를 실행하는 올바른 방법입니까? Phonegap 앱에서 어떻게 이런 일을 할 수 있습니까?

감사합니다.

답변

15

File api와 WebIntent 플러그인을 사용하여 마침내 구현할 수있었습니다. 누군가를 도울 수 있도록 여기에 해결책을 게시 할 것입니다.

코드는 원격 서버에서 sdcard의 다운로드 폴더로 apk를 다운로드 한 다음 설치를 시작합니다. 코르도바 3+를 사용하는 너희들을 위해

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){ 
fileSystem.root.getFile('download/filename.apk', { 
    create: true, 
    exclusive: false 
    }, function(fileEntry) { 
    var localPath = fileEntry.fullPath, 
    fileTransfer = new FileTransfer();   
    fileTransfer.download(apkURL, localPath, function(entry) { 
     window.plugins.webintent.startActivity({ 
      action: window.plugins.webintent.ACTION_VIEW, 
      url: 'file://' + entry.fullPath, 
      type: 'application/vnd.android.package-archive' 
      }, 
      function(){}, 
      function(e){ 
       alert('Error launching app update'); 
      } 
     );        

    }, function (error) { 
     alert("Error downloading APK: " + error.code); 
    }); 
    }, function(evt){ 
     alert("Error downloading apk: " + evt.target.error.code);            
    }); 
}, function(evt){ 
alert("Error preparing to download apk: " + evt.target.error.code); 
}); 
+1

설치 후 apk에서 phonegap을 사용하면 어떻게 자동으로 apk를 시작할 수 있습니까? fileapi 또는 webintent 플러그인에 특정 방법이 있습니까? – nida

+1

http://download.com/update/myapp.apk에서 업데이트를 다운로드하고 싶습니다. 그렇다면 코드는 무엇입니까? 도와주세요. 귀하의 답변에 대해 –

0

슬프게도 플러그인을 사용하지 않고 Phonegap 웹 컨테이너에서 이러한 종류의 고유 기능에 액세스 할 수 없습니다. 예를 들어 네이티브 브라우저를 열어 사용자를 apk에 연결하고 설치하도록하십시오.

+0

답장을 보내 주셔서 감사합니다. 나는 그것이 작동 할 수 있는지보기 위해 [webintent] (https://github.com/phonegap/phonegap-plugins/tree/master/Android/WebIntent) phonegap 플러그인을 점검하고 있습니다. APK에 대한 링크를 말하면 일반 링크입니까? 왜 링크가 작동하지만 내 창은 열리지 않습니까? 감사. – Vero

+0

물론 플러그인을 사용하면 Cordova의 한계를 우회 할 수 있습니다.이 플러그인을 알지 못했지만 작동해야한다고 생각합니다. 링크를 통해 실제로 navigator.app.loadUrl과 같은 apk를 열도록 기본 브라우저를 열려고했습니다. – zakinster

11

은, 베로의 같은 유사한 솔루션이 가능합니다 :

그래서 우리는 처음의 .apk 파일을 다운로드하는 것입니다. 이를 위해 파일 전송 플러그인이 필요합니다. 당신은 다음과 같은 명령으로 설치할 수 있습니다

phonegap local plugin add org.apache.cordova.file-transfer 

을 둘째로, 우리는 webintent을 시작하는 다른 플러그인이 필요합니다. 이 webintent는 사용자에게 업데이트가 있는지 묻는 메시지를 표시합니다.

: 응용 프로그램의 업데이트가 경우가 .apk 파일을 다운로드하고 사용자에게 메시지를 표시하는 코드에서이 두 기능을 사용할 수 있습니다, 그리고

phonegap local plugin add https://github.com/Initsogar/cordova-webintent.git 

다음과 같은 명령으로 설치할 수 있습니다

/* 
* Uses the filetransfer plugin 
*/ 
function downloadApkAndroid(data) { 
    var fileURL = "cdvfile://localhost/persistent/CegekaMon.apk"; 

    var fileTransfer = new FileTransfer(); 
    var uri = encodeURI(data.android); 

    fileTransfer.download(
     uri, 
     fileURL, 
     function (entry) { 

      console.log("download complete: " + entry.fullPath); 

      promptForUpdateAndroid(entry); 
     }, 
     function (error) { 
      console.log("download error source " + error.source); 
      console.log("download error target " + error.target); 
      console.log("upload error code" + error.code); 
     }, 
     false, 
     { 

     } 
    ); 
} 
/* 
* Uses the borismus webintent plugin 
*/ 
function promptForUpdateAndroid(entry) { 
    window.plugins.webintent.startActivity({ 
      action: window.plugins.webintent.ACTION_VIEW, 
      url: entry.toURL(), 
      type: 'application/vnd.android.package-archive' 
     }, 
     function() { 
     }, 
     function() { 
      alert('Failed to open URL via Android Intent.'); 
      console.log("Failed to open URL via Android Intent. URL: " + entry.fullPath); 
     } 
    ); 
} 
+2

주셔서 감사합니다. downloadApkAndroid 함수의 '데이터'매개 변수는 무엇입니까? 그것을 호출하는 예제를 공유 할 수 있습니까? – carlospiles

+0

문자열의 배열 인 'data.android'에는 다운로드 할 APK의 URL이 포함되어 있습니다. – janpio

+0

어떻게 그 함수를 호출합니까? –

0

답변 해 주셔서 감사합니다 ... 도와 주시면 ... 코드바 파일 플러그인 마지막 버전에 코드에 문제가 있습니다. 파일 플러그인 버전 1.0.0 이상을 사용하는 경우 entry.tolRL()으로 entry.fullPath를 바꿉니다. entry.fullPath를 사용하면 '패키지를 파싱하는 데 문제가 있습니다.'오류가 발생합니다.

from file-transfer plugin on github

이러한 경로는 이전에 FileEntry 및하여 DirectoryEntry의 fullpath에 속성에 노출 된

는 파일 플러그인에 의해 반환되는 객체. 그러나 File 플러그인의 새 버전은 더 이상 이러한 경로를 JavaScript에 노출하지 않습니다.

File의 새 버전 (1.0.0 이상)으로 업그레이드하고 이전에 entry.fullPath를 인수로 사용하여 download() 또는 upload() 한 경우 코드를 변경해야합니다 파일 시스템 URL을 대신 사용하십시오.

FileEntry.toURL()와 DirectoryEntry.toURL() 형식의 파일 시스템의 URL을 반환

cdvfile : // localhost를/지속/경로/절대 파일 대신 사용할 수 있습니다/파일 에 path는 download() 및 upload() 메서드 모두에서 사용할 수 있습니다.

관련 문제