Installazione di app aziendali su iOS troppo vecchie


4

Abbiamo un'applicazione aziendale per la quale stiamo finendo il supporto di iOS6. Durante un recente test, abbiamo creato una build dell'app e impostato i seguenti valori in Info.plist

<key>MinimumOSVersion</key>
<string>7.0</string>

L'app è stata creata con l'SDK di iOS 7.1. Se è importante (e non sono sicuro che lo faccia), è un progetto Xamarin.iOS.

Mentre stavamo testando, ci aspettavamo che quando abbiamo tentato di installare su iOS6 che l'installazione fosse stata rifiutata all'inizio del processo, dal momento che stavamo installando su una versione non supportata di iOS. Abbiamo previsto che la versione dell'app precedentemente installata continuasse a funzionare come prima, senza tutte le nuove funzionalità.

Invece quello che è successo è che il guasto dell'installazione è avvenuto più tardi nell'installazione del previsto, e la vecchia versione dell'app era inutilizzabile dopo l'aggiornamento fallito.

Per ricontrollare un paio di cose, ho scaricato il file IPA e l'ho decompresso. All'interno del pacchetto Info.plist, vedo questo:

MinimumOSVersion = "7.0";

che è un buon segno Tuttavia, penso che spieghi anche perché l'installazione tentata abbia rotto la versione precedentemente installata.

Per le app normali, ad esempio app da iOS App Store, non ti viene offerta l'opzione di installare applicazioni per cui iOS installato è troppo vecchio e la versione installata dell'app rimane invariata.

C'è un modo per fare una cosa del genere per le App Enterprise senza dover costruire tutto? Sto pensando che forse c'è un'impostazione in manifest.plist che viene utilizzata per la distribuzione OTA.

Per motivi di completezza, ecco il mio Info.plist prima della costruzione:

<?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 dall'interno dell'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" );
}

Il 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>

Qualsiasi e tutti i suggerimenti sono apprezzati.


[per] app dall'App Store iOS, non ti viene data l'opzione di installare applicazioni per le quali il tuo iOS installato è troppo vecchio & lt; --- non strettamente vero. A seconda del comportamento della versione iOS precedente, quando si installa un'app che richiede una versione iOS più recente, il processo di installazione inizia chiudendo l'App Store e posizionando nella Springboard l'icona dell'app, quindi verificherà se la versione del sistema è compatibile. In caso contrario, a volte ti verrà data la possibilità di installare l'ultima versione dell'app compatibile con quella versione di iOS.
chillin

Interessante. Sto iniziando a pensare che ho bisogno di mantenere l'hardware con iOS più vecchi su di esso. Quindi, una volta che l'app ha colpito il trampolino di lancio, se l'utente non sceglie di installare l'ultima versione supportata, la versione precedentemente installata è stata tostata?
Kirk

Se l'app è già stata installata nella versione iOS precedente e ora la versione precedente di iOS non è più supportata, gli aggiornamenti continueranno fino all'ultima versione dell'app compatibile con quella versione di iOS. Tuttavia, una volta che la versione di iOS non è più supportata, il processo funzionerà come descritto sopra, ma il risultato è che l'installazione avrà esito negativo, non verrà installata e informerà l'utente di cui ha bisogno per aggiornare il proprio sistema per l'installazione l'applicazione.
chillin

Si Capisco. Dal momento che siamo sviluppatori aziendali, non stiamo distribuendo tramite l'app store, ma abbiamo creato un lavoro piuttosto semplice.
Kirk

Risposte:


2

Non penso sia possibile farlo.

Se si utilizza una distribuzione basata sul Web, è sempre possibile verificare la presenza di una versione del sistema operativo dal browser e forzarla in questo modo.

È possibile utilizzare Request.UserAgent per ottenere la versione del sistema operativo e quindi JQuery per disabilitare il pulsante e generare un avviso che spieghi all'utente perché non è possibile scaricare.

        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);
        }

2

L'ho trovato:

Non dovresti specificare MinimumOSVersion nel tuo Info.plist.

Invece vedi questo per guida Informazioni Elenco delle proprietà Riferimento chiave:

Information Property List key ref


1
L'IDE ha creato Info.plist automaticamente per me. Non sono sicuro di quello che posso fare per farlo diversamente, né sono convinto che questo in realtà risolva il problema in questione.
Kirk

Sto solo segnalando quello che ho trovato non è stato in grado di replicare il tuo scenario, e ovviamente le tue impostazioni non funzionano come hai spiegato. Hai detto che il file info.plist è stato creato sulla base di?
Buscar웃

L'impostazione funziona perfettamente. Sto cercando un modo per rendere effettive le impostazioni prima del processo di installazione. Sulla base del commento di @chillin sopra, direi che quello che sto cercando di fare non è possibile senza un sacco di lavoro extra da parte mia.
Kirk

Apprezzo il tuo tempo per guardare. Quello che intendevo dire era che il file Info.plist veniva generato automaticamente dallo strumento di sviluppo che usiamo. Non ho creato il file manualmente.
Kirk

Vorrei contattare il supporto Xamarin. Se necessario, forse riempire una segnalazione di bug.
Édouard

0

(Questa non è una risposta corretta, ma è troppo lunga per un commento.)

Non so molto su Xamarin, ma in Xcode, l'impostazione che specifica la versione minima di iOS richiesta è chiamata obiettivo di distribuzione . Vedere questa domanda e risposte StackOverflow per alcuni link ad alcuni dettagli.

Secondo Questo articolo una delle conseguenze dell'impostazione dell'obiettivo di distribuzione consiste nell'aggiungere una stringa MinimumOSVersion al file Info.plist, ma forse ce ne sono anche altre (nel file binario stesso?).

Se non lo hai già provato, prova a cercare i dettagli su "target di distribuzione" anziché su MinimumOSVersion. Inoltre, potresti prendere in considerazione la possibilità di porre la tua domanda su StackOverflow?


In Xamarin Studio, si presenta anche come obiettivo di distribuzione. Lo abbiamo impostato a 7.0 - ed è lo stesso affare. La modifica del target di implementazione fa sì che MinimumOSVersion cambi in Info.plist.
Kirk
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.