Librerias de apoyo (App Version)

Otra herramienta útil para gestionar una aplicación móvil es conocer la versión de la aplicación. En cada entorno de desarrollo necesitamos funciones diferentes para conocer la versión en ejecución. El control de versiones es importante ya que una vez publicado un juego o aplicación todos los archivos adjuntos a la aplicación no se actualizarán.



Imaginemos que nuestra app utiliza un fichero de BBDD *.db que necesitamos actualizar al publicar una nueva versión en la tienda. Cuando los usuarios actualicen la app, no sabremos desde que versión están actualizando. Además los nuevos ficheros que de distribuyen con el fichero APK serán actualizados, pero aquellos que ya existían no serán actualizados. Tener un control de la versión de la app nos permitirá controlar los cambios y actualizar los ficheros manualmente que sean necesarios.


Para la gestión de versiones yo uso estas rutinas:

 unit AppVersion;  
 interface  
 {$IF DEFINED(iOS)}  
  uses Macapi.CoreFoundation;  
 {$ENDIF}  
 {$IF DEFINED(ANDROID)}  
  uses  
   Androidapi.JNI.JavaTypes,  
   FMX.Helpers.Android,  
   Androidapi.JNI.GraphicsContentViewText,  
   Androidapi.Helpers;  
 {$ENDIF}  
 {$IF DEFINED(MSWINDOWS)}  
  uses  
   SysUtils;  
 {$ENDIF}  
 function GetAppVersionStr: string;  
 implementation  
 {$IF DEFINED(MSWINDOWS)}  
 function GetAppVersionStr: string;  
 var  
  Rec: LongRec;  
 begin  
  Rec := LongRec(GetFileVersion(ParamStr(0)));  
  Result := Format('%d.%d', [Rec.Hi, Rec.Lo])  
 end;  
 {$ENDIF}  
 {$IF DEFINED(ANDROID)}  
 function GetAppVersionStr: string;  
 var  
  PackageManager: JPackageManager;  
  PackageInfo : JPackageInfo;  
 begin  
  PackageManager := SharedActivity.getPackageManager;  
  PackageInfo := PackageManager.getPackageInfo(SharedActivityContext.getPackageName(), TJPackageManager.JavaClass.GET_ACTIVITIES);  
  Result:= JStringToString(PackageInfo.versionName);  
 end;  
 {$ENDIF}  
 {$IF DEFINED(iOS)}  
 function GetAppVersionStr: string;  
 var  
  CFStr: CFStringRef;  
  Range: CFRange;  
 begin  
  CFStr := CFBundleGetValueForInfoDictionaryKey(  
   CFBundleGetMainBundle, kCFBundleVersionKey);  
  Range.location := 0;  
  Range.length := CFStringGetLength(CFStr);  
  SetLength(Result, Range.length);  
  CFStringGetCharacters(CFStr, Range, PChar(Result));  
 end;  
 {$ENDIF}  
 end.  

Librerias de apoyo (FlyFilesUtils)

Cuando te enfrentas a un proyecto profesional y tu equipo de trabajo no es extenso, necesitas herramientas de apoyo para poder hacer la vida un poco más fácil. En este post os quería presentar unas librerías muy prácticas cunado desarrollas juegos en Delphi o aplicaciones móviles en general.





La primera de ellas es FlyFilesUtils. Este proyecto opensource presenta algunas herramientas muy útiles para el desarrollo móvil.


Para el desarrollo de juegos y aplicaciones móviles en general podemos usar las rutinas de información de dispositivos ya que nos permitirá en tiempo de ejecución conocer qué tipo de dispositivo está corriendo nuestra aplicación.


 // Funciones  
 function GetScreenPixelsXY(const Context: TFmxObject = nil): TPoint;  
 function GetScreenClientPixelsXY(const Context: TFmxObject = nil): TPoint;  
 function GetScreenInchXY(const Context: TFmxObject = nil): TPointF;  
 function GetScreenDPIXY(const Context: TFmxObject = nil): TPointF;  
 function GetScreenDPI(const Context: TFmxObject = nil): Single;  
 function GetScreenInches(const Context: TFmxObject = nil): Single;  
 function GetFormXY(const AForm: TCustomForm): TPointF;  
 function GetFormClientXY(const AForm: TCustomForm): TPointF;  
 function GetFormClient(const AForm: TCustomForm): TRectF;  
 function GetFormPixelsXY(const AForm: TCustomForm): TPointF;  
 function GetFormClientPixelsXY(const AForm: TCustomForm): TPointF;  


A partir de etas funciones podemos calcular que tipo de pantalla se está ejecutando nuestra aplicación y ajustar la GUI al dispositivo. A partir de una función rudimentaria podemos conocer si la aplicación se ejecuta en una Tablet o un Smartphone.

  {$IF DEFINED(iOS) or DEFINED(ANDROID)}  
  if FlyFilesUtils.GetScreenInches>=6.5 then  
  begin  
   Tablet:= True;  
  end;  
  {$ENDIF}  



Además está librería tiene otras funciones relacionadas con acceso a ficheros en dispositivos móviles, así como funciones de conversión que nos pueden resultar útiles más adelante.

Entrando en el mercado chino (9)

Por fin he recibido el correo donde se validaba la aplicación final y el juego era apto para publicarse en tiendas de aplicaciones chinas. ...