Instalacja aplikacji Enterprise na iOS, która jest za stara

4

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.

Kościół
źródło
[dla] aplikacji z iOS App Store, nie masz możliwości instalowania aplikacji, dla których zainstalowany iOS jest za stary <--- nie do końca prawda. W zależności od zachowania starszej wersji systemu iOS podczas instalowania aplikacji wymagającej nowszej wersji systemu iOS proces instalacji rozpoczyna się od zamknięcia App Store i umieszczenia ikony w aplikacji Springboard, a następnie sprawdzi, czy wersja systemu jest zgodny. Jeśli nie, czasami będziesz mieć możliwość zainstalowania ostatniej wersji aplikacji, która była kompatybilna z tą wersją iOS.
chillin
To interesujące. Zaczynam myśleć, że muszę mieć sprzęt ze starszymi systemami iOS. Więc kiedy aplikacja trafi na odskocznię, jeśli użytkownik nie zdecyduje się zainstalować ostatniej obsługiwanej wersji, to wersja, którą wcześniej zainstalowała, jest opiekana?
Kirk
Jeśli aplikacja była wcześniej instalowana na wcześniejszej wersji iOS, a teraz wcześniejsza wersja iOS nie jest już obsługiwana, aktualizacje będą kontynuowane do ostatniej wersji aplikacji zgodnej z tą wersją iOS. Jednak gdy ta wersja systemu iOS nie będzie już obsługiwana, proces będzie działał tak, jak opisano powyżej, ale w rezultacie instalacja się nie powiedzie, nie zostanie zainstalowana i poinformuje użytkownika, że ​​musi zaktualizować system, aby zainstalować Aplikacja.
chillin
Tak, rozumiem. Ponieważ jesteśmy programistami dla przedsiębiorstw, nie prowadzimy dystrybucji za pośrednictwem sklepu z aplikacjami, ale wymyśliliśmy całkiem proste rozwiązanie.
Kirk

Odpowiedzi:

2

Nie sądzę, że można to zrobić.

Jeśli korzystasz z wdrożenia internetowego, zawsze możesz sprawdzić wersję systemu operacyjnego w przeglądarce i wymusić to w ten sposób.

Możesz użyć Request.UserAgent, aby uzyskać wersję systemu operacyjnego, a następnie JQuery, aby wyłączyć przycisk i wysłać alert wyjaśniający użytkownikowi, dlaczego nie może pobrać.

        string agent = Request.UserAgent;


        if (agent.Contains("iPad; CPU OS 6_"))
        {
            ClientScript.RegisterStartupScript(this.GetType(), "iOS",
                                               " $('#appInstall a').click(function(e) {e.preventDefault();});",
                                               true);
            ClientScript.RegisterStartupScript(this.GetType(), "iOSAlert",
                                               " $('#appInstall a').click(function() {alert('The application is now only available on iPads running iOS 7 or higher. Please upgrade your iPad to get the latest version.');});",
                                               true);
        }
Matt Bentley
źródło
2

Znalazłem to:

Nie należy tego określać MinimumOSVersionw Info.plist.

Zamiast tego zobacz to w celu uzyskania informacji Informacje Lista właściwości Kluczowe odniesienie:

Informacje Klucz do listy właściwości ref

Ruskes
źródło
1
IDE automatycznie utworzyło dla mnie Info.plist. Nie jestem pewien, co mogę zrobić, aby zrobić inaczej, ani też nie jestem przekonany, że to faktycznie rozwiązuje dany problem.
Kirk
Właśnie zgłaszam to, czego nie udało mi się odtworzyć w twoim scenariuszu, i oczywiście twoje ustawienie nie działa zgodnie z objaśnieniem. Mówisz, że info.plist został stworzony na podstawie?
Ruskes
Ustawienie działa idealnie. Szukam sposobu, aby ustawienie zaczęło obowiązywać wcześniej w procesie instalacji. Na podstawie powyższego komentarza @chillin powiedziałbym, że to, czego chcę, nie jest możliwe bez dodatkowej pracy z mojej strony.
Kirk
Doceniam twój czas poświęcony na spojrzenie. Chodziło mi o to, że plik Info.plist został automatycznie wygenerowany przez narzędzie programistyczne, którego używamy. Nie utworzyłem pliku ręcznie.
Kirk
Skontaktuję się z obsługą Xamarin. W razie potrzeby wypełnij raport o błędzie.
Édouard
0

(To nie jest poprawna odpowiedź, ale jest za długa na komentarz).

Nie wiem dużo o Xamarinie, ale w Xcode ustawienie określające minimalną wymaganą wersję iOS nazywa się celem wdrożenia . Zobacz to pytanie i odpowiedzi na temat przepełnienia stosu, aby uzyskać kilka linków do niektórych szczegółów.

Zgodnie z tym artykułem , jedną z konsekwencji ustawienia celu wdrożenia jest dodanie ciągu MinimumOSVersion do pliku Info.plist, ale być może są też inne (w samym pliku binarnym?).

Jeśli jeszcze tego nie próbowałeś, spróbuj wyszukać szczegółowe informacje na temat „miejsca docelowego wdrożenia” zamiast MinimumOSVersion. Może zastanawiasz się również nad pytaniem o przepełnienie stosu?

Ashley
źródło
W Xamarin Studio jest również wyświetlany jako cel wdrażania. Ustawiliśmy go na 7.0 - i jest to ta sama oferta. Zmiana miejsca docelowego wdrożenia powoduje zmianę MinimalOSVersion w Info.plist.
Kirk