Versiyon Kontrol
Versiyon Kontrol
Arkadaşlar merhaba,
Kurum içi uygulamamızı kendi netwörkümüzdeki bir http sunucundan dağıtıyortuz. Kullanıcı butona basıp güncelleme al dediğinde tidhttp nesnesinin get metodu ile apk'yı çekip sonrasında kurulumu gerçekleştirebiliyoruz. Buraya kadar bir sorun yok fakat uygulamanın açılışında güncelleme kontrolü yapmak istediğimde sıkıntı başlıyor. Sunucudaki apk dosyasının versiyonunu alıp (elde edemediğim kısım burası), mobil cihazın version numarasıyla kıyaslama noktası nasıl bir yol izlenebilir? Versiyonu her seferinde sunucuda txt bir file'a yazmak ya da her seferinde manuel bir işlem yapmak istemiyorum. Sunucudaki apk dosyasının bir şekilde versiyon ya da başka bir bilgisini alıp kıyaslama şansımız yok mudur?
Yardımlarınız için şimdiden teşekkürler
Kurum içi uygulamamızı kendi netwörkümüzdeki bir http sunucundan dağıtıyortuz. Kullanıcı butona basıp güncelleme al dediğinde tidhttp nesnesinin get metodu ile apk'yı çekip sonrasında kurulumu gerçekleştirebiliyoruz. Buraya kadar bir sorun yok fakat uygulamanın açılışında güncelleme kontrolü yapmak istediğimde sıkıntı başlıyor. Sunucudaki apk dosyasının versiyonunu alıp (elde edemediğim kısım burası), mobil cihazın version numarasıyla kıyaslama noktası nasıl bir yol izlenebilir? Versiyonu her seferinde sunucuda txt bir file'a yazmak ya da her seferinde manuel bir işlem yapmak istemiyorum. Sunucudaki apk dosyasının bir şekilde versiyon ya da başka bir bilgisini alıp kıyaslama şansımız yok mudur?
Yardımlarınız için şimdiden teşekkürler
Re: Versiyon Kontrol
Sunucunuzda host'u nasıl yapıyorsunuz bilmiyorum ama duruma göre bir kaç senaryo var. Eğer host işini bir Datasnap uygulaması yapıyor ise; bu durumda rahatlıkla bir metod çağrımı yapıp; o çağrım içinde sunucu üzerindeki dosyanın versiyon bilgilerini okuyup geriye döndürebilirsiniz. Sonra cihaz üzerindeki çalışan uygulamanın versiyonu ile karşılaştırır ve download edip etmeyeceğinize karar verirsiniz.
Eğer static HTML kullanıyorsanız; yukarıda bahsettiğim işlemleri script dillerinden birisi ile yapmalısınız. ASP, ASP.Net, Php vb kullanıyorsanız da onlar üzerinde benzer işlevselliği sağlamalısınız.
Tam emin olmamak ile birlikte; her build'den sonra çalıştırılabilecek bir batch file ayarlayabilirsiniz sanıyorum IDE'de. Bu batch file; dosyanın versiyonunu alır ve sunucunuzda bir versiyon.txt içine yazabilir. Bu sayede; yukarıda bahsettiğim hiçbir şeye de ihtiyacınız olmaz.
Eğer static HTML kullanıyorsanız; yukarıda bahsettiğim işlemleri script dillerinden birisi ile yapmalısınız. ASP, ASP.Net, Php vb kullanıyorsanız da onlar üzerinde benzer işlevselliği sağlamalısınız.
Tam emin olmamak ile birlikte; her build'den sonra çalıştırılabilecek bir batch file ayarlayabilirsiniz sanıyorum IDE'de. Bu batch file; dosyanın versiyonunu alır ve sunucunuzda bir versiyon.txt içine yazabilir. Bu sayede; yukarıda bahsettiğim hiçbir şeye de ihtiyacınız olmaz.
Re: Versiyon Kontrol
Tuğrul hocam selamlar,
Sabit apk'linkini get ediyorum yalnız bu kısım çok önemli değil, gerekirse bir web service call edip bu kontrolü yaptırabilirim fakat asıl sıkıntı windows ortamında delphi'de apk'ya ait bu bilgilere erişmek. Apk'dan versiyon vs gibi bilgileri okuyabilen bir library C# tarafında var ("http://blog.iteedee.com/2014/03/parse-a ... ith-c-net/") fakat Delphi tarafında bu şekilde bir library ya da component bulamadım ve göremedim. Sıkıntı bu noktada başlıyor zaten.
Sabit apk'linkini get ediyorum yalnız bu kısım çok önemli değil, gerekirse bir web service call edip bu kontrolü yaptırabilirim fakat asıl sıkıntı windows ortamında delphi'de apk'ya ait bu bilgilere erişmek. Apk'dan versiyon vs gibi bilgileri okuyabilen bir library C# tarafında var ("http://blog.iteedee.com/2014/03/parse-a ... ith-c-net/") fakat Delphi tarafında bu şekilde bir library ya da component bulamadım ve göremedim. Sıkıntı bu noktada başlıyor zaten.
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Re: Versiyon Kontrol
Apk uzantisi degistirilmis bir rar dosyasidir. Rar dosyasi extract edilip icinden cikan manifest ya da diger dosyalardan belki birseyler elde edilebilir.
Re: Versiyon Kontrol
Sadettin hocam merhaba,
APK dosyasını extract edince içinden çıkan manifest dosyası tam olarak okunur bir formatta değil. Ayrıca bunu server'e gelen her request için extract etmek de ne kadar doğru olur (işlem yükü açısından) bilmiyorum açıkçası.
APK dosyasını extract edince içinden çıkan manifest dosyası tam olarak okunur bir formatta değil. Ayrıca bunu server'e gelen her request için extract etmek de ne kadar doğru olur (işlem yükü açısından) bilmiyorum açıkçası.
Re: Versiyon Kontrol
Çözüm olarak aapt.exe'yi (Delphi klasörleri içinde de var) aşağıdaki şekilde call edip result'ını alan bir webservis yazdım ve mobil'den bunu çağırdım.
Bulabildiğim en iyi çözüm bu oldu, aynı konuda çözüm arayanların bilgisine.
Daha iyi bir çözümü olan varsa paylaşırsa sevinirim.
Kod: Tümünü seç
aapt.exe dumb badging "C:\ilgiliklasör\myApplication.apk"
Daha iyi bir çözümü olan varsa paylaşırsa sevinirim.
Re: Versiyon Kontrol
Merhaba.
- Compile edilmiş XML'yi APK paketinden extract MemoryStream'e aktarıp BINARY parse etmek biraz emek ister. Uygun bir zamanım olunca ilgili fonksiyonu hazırlarım.
- Binary Structure olarak bu linkte ve devamını da bu linkte gördüm. Bunu delphi'ye dönüştürmek zor değil.
- Şimilik aşağıdaki ilk aşamayı elime yapışmaz deyip hazırladım.
- Sonraki aşaması BINARY yürüyecek ama senin işini kısa zamanda görebileceğin, senin kendi projenin TXT parse işlemini yapabileceğin bir çıkış noktası olsun diye okunabilir anlamlı karakterleri TXT dosya olarak çıktısını almayı sağladım. Sen de kendi APK dosyanı bu fonksiyona sokup ürün TXT dosyasını buradan paylaşırsan o konuda da yardımcı olmaya çalışırım. Sadece senin projene özel bir versiyon
- Delphi XE serisiyle derlemelisiniz, Zaten Android yazılımı yapıyor olanlar için olduğuna göre bunu hatırlatmama lüzum yok, zaten öyledir.
Kullanımı :
aapt.exe dumb badging çıktısı aşağıdaki şekilde iken...
Bu fonksiyonun örnek çıktısı TXT dosyası aşağıdaki şekilde
- Yukarıda dediğim gibi, BINARY parse işlemi yapılacak, aşağıdaki sadece senin için günü kurtaracak kısmı.
- Compile edilmiş XML'yi APK paketinden extract MemoryStream'e aktarıp BINARY parse etmek biraz emek ister. Uygun bir zamanım olunca ilgili fonksiyonu hazırlarım.
- Binary Structure olarak bu linkte ve devamını da bu linkte gördüm. Bunu delphi'ye dönüştürmek zor değil.
- Şimilik aşağıdaki ilk aşamayı elime yapışmaz deyip hazırladım.
- Sonraki aşaması BINARY yürüyecek ama senin işini kısa zamanda görebileceğin, senin kendi projenin TXT parse işlemini yapabileceğin bir çıkış noktası olsun diye okunabilir anlamlı karakterleri TXT dosya olarak çıktısını almayı sağladım. Sen de kendi APK dosyanı bu fonksiyona sokup ürün TXT dosyasını buradan paylaşırsan o konuda da yardımcı olmaya çalışırım. Sadece senin projene özel bir versiyon
- Delphi XE serisiyle derlemelisiniz, Zaten Android yazılımı yapıyor olanlar için olduğuna göre bunu hatırlatmama lüzum yok, zaten öyledir.

Kod: Tümünü seç
USES Zip;
function APKManifest( strAPK: String ): String;
Const
KabulEdilen = ['A'..'Z', 'a'..'z', '0'..'9', '.', ',', '/', '(', ')', '[', ']', Chr($0D) ];
Var
zipAPK : TZipFile;
aStream : TStream;
LocalHeader : TZipHeader;
strIcerik : String;
bByte : Byte;
strAra : String;
const
strManifest = 'AndroidManifest.xml';
begin
Result := 'Sürüm bilgisi için parse edilecek...';
if TZipFile.IsValid( strAPK ) then
begin
ZipAPK := TZipFile.Create;
ZipAPK.Open( strAPK, zmRead );
if ZipAPK.IndexOf( strManifest ) > 0 then
begin
aStream := TStream.Create;
ZipAPK.Read( strManifest, aStream, LocalHeader );
// Elimizde AndroidManifest.xml var...
aStream.Seek( 0, soFromBeginning );
With TMemoryStream.Create do
begin
LoadFromStream(aStream);
Seek(0, soFromBeginning);
while Position < Size-1 do
begin
bByte := $0;
Read( bByte, 1 );
if Chr(bByte) in KabulEdilen
then strIcerik := strIcerik + Chr(bByte);
end;
strAra := 'manifest';
System.Delete( strIcerik, 1, pos(strAra, strIcerik) + Length(strAra)-1);
SaveToFile( ChangeFileExt( strAPK, '.XML') );
Free; // TMemoryStream
end;
With TStringList.Create do
begin
Text := strIcerik;
SaveToFile( ChangeFileExt( strAPK, '.TXT') );
Free; // TStringList
end;
Result := 'OK';
aStream.Free;
ShowMessage( 'BINARY Manifest Dosyası : "'
+ ChangeFileExt( strAPK, '.XML') + '"'
+ #13#13
+ 'TEXT içeriği "'
+ ChangeFileExt( strAPK, '.TXT') + '"'
+ #13
+ 'ismiyle kaydedildi...'
);
end;
zipAPK.Close;
zipAPK.Free;
end else
begin
Result := '';
MessageDlg('Android APK Paketi bozuk', mtError, [mbCancel], 0);
end;
end;
Kod: Tümünü seç
procedure TForm1.BitBtn1Click(Sender: TObject);
Var
strDosya : String;
begin
strDosya := 'd:\Programcilik\Android_Works\XE7_Projeleri\SQLite_Ornek\Android\Debug\YuzmeOkulu\bin\YuzmeOkulu.apk';
ShowMessage( APKManifest( strDosya ) );
end;
Kod: Tümünü seç
package: name='com.embarcadero.YuzmeOkulu' versionCode='1' versionName='1.0.0'
sdkVersion:'9'
targetSdkVersion:'11'
uses-permission:'android.permission.ACCESS_COARSE_LOCATION'
uses-permission:'android.permission.ACCESS_FINE_LOCATION'
uses-permission:'android.permission.CALL_PHONE'
uses-permission:'android.permission.CAMERA'
uses-permission:'android.permission.INTERNET'
uses-permission:'android.permission.READ_CALENDAR'
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
uses-permission:'android.permission.READ_PHONE_STATE'
uses-permission:'android.permission.WRITE_CALENDAR'
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
application-label:'YuzmeOkulu'
application-icon-120:'res/drawable-ldpi/ic_launcher.png'
application-icon-160:'res/drawable-mdpi/ic_launcher.png'
application-icon-240:'res/drawable-hdpi/ic_launcher.png'
application-icon-320:'res/drawable-xhdpi/ic_launcher.png'
application-icon-480:'res/drawable-xxhdpi/ic_launcher.png'
application: label='YuzmeOkulu' icon='res/drawable-mdpi/ic_launcher.png'
application-debuggable
launchable-activity: name='com.embarcadero.firemonkey.FMXNativeActivity' label='YuzmeOkulu' icon=''
uses-feature:'android.hardware.camera'
uses-feature:'android.hardware.camera.autofocus'
uses-implied-feature:'android.hardware.camera.autofocus','requested android.permission.CAMERA permission'
uses-feature:'android.hardware.location'
uses-implied-feature:'android.hardware.location','requested a location access permission'
uses-feature:'android.hardware.location.gps'
uses-implied-feature:'android.hardware.location.gps','requested android.permission.ACCESS_FINE_LOCATION permission'
uses-feature:'android.hardware.location.network'
uses-implied-feature:'android.hardware.location.network','requested android.permission.ACCESS_COARSE_LOCATION permission'
uses-feature:'android.hardware.telephony'
uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature'
uses-feature:'android.hardware.touchscreen'
uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional'
main
other-receivers
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240' '320' '480'
native-code: 'armeabi' 'armeabi-v7a' 'mips' 'x86'
- Yukarıda dediğim gibi, BINARY parse işlemi yapılacak, aşağıdaki sadece senin için günü kurtaracak kısmı.
Kod: Tümünü seç
com.embarcadero.YuzmeOkulu1.0.0usessdkusespermission)android.permission.ACCESSCOARSELOCATIONandroid.permission.ACCESSFINELOCATIONandroid.permission.CALLPHONEandroid.permission.CAMERAandroid.permission.INTERNETandroid.permission.READCALENDAR(android.permission.READEXTERNALSTORAGEandroid.permission.READPHONESTATEandroid.permission.WRITECALENDAR)android.permission.WRITEEXTERNALSTORAGEapplicationYuzmeOkuluactivity,com.embarcadero.firemonkey.FMXNativeActivitymetadataandroid.app.libname
intentfilteractionandroid.intent.action.MAINcategoryandroid.intent.category.LAUNCHERreceivercom.embarcadero.firemonkey.notifications.FMXNotificationAlarmLp
ZL8888
888888
tL())(8(,,(8)..)8/00//00
- barisatalay
- Üye
- Mesajlar: 398
- Kayıt: 02 Nis 2013 05:43
- İletişim:
Re: Versiyon Kontrol
Muharrem abi yatmadan bi gezeyim formu dedim paylaştığını görünce yorum yazmassam kötü hissederdim herzaman ki gibi bizi bilginle araştırmacılığın ve çözümlerinde aydınlattığın için teşekkürler abi 

Yeni bloğum: http://brsatalay.blogspot.com.tr/
Re: Versiyon Kontrol
VersionCode görebildiğim kadarıyla binary'den dönmüyor, sadece VersionName var çıktı da. Ayrıca aapt.exe'nin çıktısı parse işlemi açısından daha rahat ama verdiğiniz örnek kodlar çok faydalı olmuş.
Teşekkürler.
Teşekkürler.