Tenemos una aplicación empresarial para la cual estamos finalizando el soporte de iOS6. Durante una prueba reciente, creamos una compilación de la aplicación y establecimos los siguientes valores en Info.plist
<key>MinimumOSVersion</key>
<string>7.0</string>
La aplicación fue construida con el iOS 7.1 SDK. Si importa (y no estoy seguro de que lo haga), es un proyecto Xamarin.iOS.
Mientras estábamos probando, esperábamos que cuando intentáramos instalar en iOS6 la instalación fuera rechazada al principio del proceso, ya que estábamos instalando en una versión no compatible de iOS. Anticipamos que la versión instalada previamente de la aplicación continuaría funcionando como lo había hecho antes, sin todas las nuevas características.
En cambio, lo que sucedió fue que el error de instalación ocurrió más tarde en la instalación de lo esperado y que la versión anterior de la aplicación no se podía utilizar después de que fallara la actualización.
Para volver a verificar un par de cosas, descargué el archivo IPA y lo descomprimí. Dentro del Info.plist incluido, veo esto:
MinimumOSVersion = "7.0";
que es una buena señal. Sin embargo, creo que también explica por qué el intento de instalación rompió la versión instalada anteriormente.
Para las aplicaciones normales, es decir, las aplicaciones de la tienda de aplicaciones de iOS, no tiene la opción de instalar aplicaciones para las cuales su iOS instalado es demasiado antiguo, y la versión instalada de la aplicación permanece sin cambios.
¿Hay una manera de hacer algo así para las aplicaciones empresariales sin tener que construir todo? Estoy pensando que tal vez haya una configuración en el archivo manifest.plist que se usa para la implementación de OTA.
En aras de la minuciosidad, aquí está mi lista de información antes de compilar:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>OurApp Stage</string>
<key>CFBundleIconFiles</key>
<array>
<string>Images/OurApp_72.png</string>
<string>Images/OurApp_50.png</string>
<string>Images/OurApp_29.png</string>
<string>Images/OurApp_512.png</string>
</array>
<key>CFBundleIdentifier</key>
<string>com.ourappproject.staging.mycompany</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.ourappproject.staging-handler</string>
<key>CFBundleURLSchemes</key>
<array>
<string>ourapp-staging</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>2014.2.04.05</string>
<key>MinimumOSVersion</key>
<string>7.0</string>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
<key>UIDeviceFamily</key>
<array>
<integer>2</integer>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
Info.plist desde la API:
// !!! BINARY PROPERTY LIST WARNING !!!
//
// The pretty-printed property list below has been created
// from a binary version on disk and should not be saved as
// the ASCII format is a subset of the binary representation!
//
{ BuildMachineOSBuild = "13C1021";
CFBundleDevelopmentRegion = "en";
CFBundleDisplayName = "OurApp Stage";
CFBundleExecutable = "OurAppMobileApp";
CFBundleIconFiles = ( "OurApp_72.png", "OurApp_50.png", "OurApp_29.png" );
CFBundleIdentifier = "com.ourappproject.staging.mycompany";
CFBundleInfoDictionaryVersion = "6.0";
CFBundleName = "OurAppMobileApp";
CFBundlePackageType = "APPL";
CFBundleResourceSpecification = "ResourceRules.plist";
CFBundleSignature = "????";
CFBundleSupportedPlatforms = ( "iPhoneOS" );
CFBundleURLTypes = (
{ CFBundleURLName = "com.ourappproject.staging-handler";
CFBundleURLSchemes = ( "ourapp-staging" );
},
);
CFBundleVersion = "2014.2.04.05";
DTCompiler = "com.apple.compilers.llvm.clang.1_0";
DTPlatformBuild = "11D167";
DTPlatformName = "iphoneos";
DTPlatformVersion = "7.1";
DTSDKBuild = "11D167";
DTSDKName = "iphoneos7.1";
DTXcode = "0510";
DTXcodeBuild = "5B1008";
LSRequiresIPhoneOS = :true;
MinimumOSVersion = "7.0";
UIBackgroundModes = ( "audio" );
UIDeviceFamily = ( 2 );
UIRequiredDeviceCapabilities = ( "armv7" );
UISupportedInterfaceOrientations = ( "UIInterfaceOrientationLandscapeLeft", "UIInterfaceOrientationLandscapeRight" );
"UISupportedInterfaceOrientations~ipad" = ( "UIInterfaceOrientationLandscapeLeft", "UIInterfaceOrientationLandscapeRight" );
}
The manifest.plist:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- array of downloads. -->
<key>items</key>
<array>
<dict>
<!-- an array of assets to download -->
<key>assets</key>
<array>
<!-- software-package: the ipa to install. -->
<dict>
<!-- required. the asset kind. -->
<key>kind</key>
<string>software-package</string>
<!-- required. the URL of the file to download. -->
<key>url</key>
<string>https://arm.staging.ourappproject.com:443/Store/App/9/17/OurAppMobileApp.ipa</string>
</dict>
<!-- display-image: the icon to display during download .-->
<dict>
<key>kind</key>
<string>display-image</string>
<!-- optional. indicates if icon needs shine effect applied. -->
<key>needs-shine</key>
<true/>
<key>url</key>
<string>https://arm.staging.ourappproject.com:443/Assets/OurAppMobileApp.png</string>
</dict>
<!-- full-size-image: the large 512x512 icon used by iTunes. -->
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>https://arm.staging.ourappproject.com:443/Assets/OurApp_512.png</string>
</dict>
</array>
<key>metadata</key>
<dict>
<!-- required -->
<key>bundle-identifier</key>
<string>com.ourappproject.staging.mycompany</string>
<!-- optional (software only) -->
<key>bundle-version</key>
<string>2014.2.04.05</string>
<!-- required. the download kind. -->
<key>kind</key>
<string>software</string>
<!-- optional. displayed during download; typically company name -->
<key>subtitle</key>
<string>mycompany</string>
<!-- required. the title to display during the download. -->
<key>title</key>
<string>OurApp Mobile</string>
</dict>
</dict>
</array>
</dict>
</plist>
Cualquier y todas las sugerencias son apreciadas.