Versiyon Kontrol

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Cevapla
edo
Üye
Mesajlar: 40
Kayıt: 05 Haz 2005 11:12

Versiyon Kontrol

Mesaj gönderen edo »

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
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Versiyon Kontrol

Mesaj gönderen thelvaci »

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.
edo
Üye
Mesajlar: 40
Kayıt: 05 Haz 2005 11:12

Re: Versiyon Kontrol

Mesaj gönderen edo »

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.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Versiyon Kontrol

Mesaj gönderen sadettinpolat »

Apk uzantisi degistirilmis bir rar dosyasidir. Rar dosyasi extract edilip icinden cikan manifest ya da diger dosyalardan belki birseyler elde edilebilir.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
edo
Üye
Mesajlar: 40
Kayıt: 05 Haz 2005 11:12

Re: Versiyon Kontrol

Mesaj gönderen edo »

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ı.
edo
Üye
Mesajlar: 40
Kayıt: 05 Haz 2005 11:12

Re: Versiyon Kontrol

Mesaj gönderen edo »

Çö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.

Kod: Tümünü seç

aapt.exe dumb badging "C:\ilgiliklasör\myApplication.apk"
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.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Versiyon Kontrol

Mesaj gönderen mrmarman »

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. :)

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;
Kullanımı :

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;
aapt.exe dumb badging çıktısı aşağıdaki şekilde iken...

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'
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ı.

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
Resim
Resim ....Resim
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: Versiyon Kontrol

Mesaj gönderen barisatalay »

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 :)
edo
Üye
Mesajlar: 40
Kayıt: 05 Haz 2005 11:12

Re: Versiyon Kontrol

Mesaj gönderen edo »

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.
Cevapla