Mamy aplikację dla przedsiębiorstw, dla której kończymy wsparcie dla iOS6. Podczas ostatniego testu stworzyliśmy wersję aplikacji i ustawiliśmy następujące wartości w Info.plist
<key>MinimumOSVersion</key>
<string>7.0</string>
Aplikacja została zbudowana z pakietem iOS 7.1 SDK. Jeśli ma to znaczenie (i nie jestem pewien, czy tak), jest to projekt Xamarin.iOS.
Podczas testowania spodziewaliśmy się, że kiedy będziemy próbować zainstalować na iOS6, instalacja zostanie odrzucona na początku procesu, ponieważ instalujemy na nieobsługiwanej wersji iOS. Spodziewaliśmy się, że wcześniej zainstalowana wersja aplikacji będzie nadal działać tak, jak wcześniej, bez wszystkich nowych funkcji.
Zamiast tego zdarzyło się, że błąd instalacji nastąpił później w trakcie instalacji niż oczekiwano, a stara wersja aplikacji była niezdatna do użytku po niepowodzeniu aktualizacji.
Aby dokładnie sprawdzić kilka rzeczy, pobrałem plik IPA i rozpakowałem go. W pakiecie Info.plist widzę to:
MinimumOSVersion = "7.0";
co jest dobrym znakiem. Myślę jednak, że wyjaśnia to również, dlaczego próba instalacji zepsuła poprzednio zainstalowaną wersję.
W przypadku zwykłych aplikacji, tj. Aplikacji ze sklepu iOS App Store, nie ma opcji instalowania aplikacji, dla których zainstalowany system iOS jest zbyt stary, a zainstalowana wersja aplikacji pozostaje niezmieniona.
Czy istnieje sposób na zrobienie czegoś takiego w przypadku aplikacji dla przedsiębiorstw bez konieczności budowania wszystkiego? Myślę, że być może w manifest manifest.pl jest ustawienie używane do wdrażania OTA.
Dla zachowania dokładności, oto moja Info.plist przed kompilacją:
<?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 z IPA:
// !!! 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" );
}
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>
Wszelkie sugestie są mile widziane.