Jak aktualizować aplikacje iOS6 enterprise w powietrzu

Witam niedawno opracowaliśmy naszą pierwszą aplikację dla przedsiębiorstw. Używamy opcji" in-House", aby utworzyć certyfikat dystrybucji. Klient nie korzysta jeszcze z aplikacji. Ale wkrótce go użyje. Tymczasem mam pytanie. Będzie korzystać z aplikacji, a w przyszłości, jeśli pojawią się jakiekolwiek aktualizacje aplikacji z naszej strony, chcemy, aby Klient również ją zaktualizował . Tak jak teraz mam zainstalowane aplikacje na moim iPhonie. Dostaję aktualizację z AppStore mówiąc, że aplikacja XYZ została zaktualizowana. Więc instaluję aktualizację. Teraz, jeśli nasz klient korzysta z aplikacji i zapisał na niej pewne dane(nasza aplikacja wykorzystuje Dane podstawowe i zbudowaliśmy je w taki sposób, że klient może przechowywać pewne dane na urządzeniu) chcemy wysłać do niego aktualizację, która zainstaluje aktualizację, ale nie usunie żadnego istniejącego klienta data.Is to możliwe? Jak to zrobić?Używam teraz instalacji over the air, aby zainstalować aplikację. Mamy bezpieczny serwer, gdzie .ipa oraz .pliki plist są obecne i mamy stronę HTML do pobrania. Klient kliknij link, a aplikacja zostanie zainstalowana. Proszę dać mi znać, jeśli potrzebujesz więcej informacji. Dzięki.

Author: RookieAppler, 2012-12-05

4 answers

Tak, to możliwe. Podczas wdrażania aplikacji korporacyjnej wymagana jest lista plików zawierająca metadane dotyczące aplikacji. Te metadane obejmują numer wersji, którego można użyć do sprawdzania aktualizacji.

BOOL updateAvailable = NO;
NSDictionary *updateDictionary = [NSDictionary dictionaryWithContentsOfURL:
                                  [NSURL URLWithString:@"http://www.example.com/pathToPlist"]];

if(updateDictionary)
{
    NSArray *items = [updateDictionary objectForKey:@"items"];
    NSDictionary *itemDict = [items lastObject];

    NSDictionary *metaData = [itemDict objectForKey:@"metadata"];
    NSString *newversion = [metaData valueForKey:@"bundle-version"];
    NSString *currentversion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    updateAvailable = [newversion compare:currentversion options:NSNumericSearch] == NSOrderedDescending;
}

Po wykryciu aktualizacji przejdź do adresu URL pobierania

itms-services://?action=download-manifest&url=<url-path-to-plist>

I zainstaluje się nad istniejącą wersją, pozostawiając wszystkie dane w takcie, a nawet zaktualizuje bazę danych CoreData, jeśli skonfigurujesz automatyczną migrację i wprowadzić zmiany.

 27
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 20:28:52

Dzięki Joe za fantastyczną odpowiedź. Oto rozszerzona wersja przetłumaczona na swift. Możesz umieścić go wewnątrz viewDidLoad głównego kontrolera widoku

let plistUrl = "https://example.com/example.plist"
let installationUrl = "itms-services://?action=download-manifest&amp;url=https://example.com/example.plist"


override func viewDidLoad() {
    super.viewDidLoad()

    //Check for the updates        
    checkForUpdates()
}

func checkForUpdates() {
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
    dispatch_async(backgroundQueue, {
        let updateDictionary = NSDictionary(contentsOfURL: NSURL(string: self.plistUrl)!)!

        let items = updateDictionary["items"]
        let itemDict = items?.lastObject as! NSDictionary
        let metaData = itemDict["metadata"] as! NSDictionary
        let serverVersion = metaData["bundle-version"] as! String
        let localVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
        let updateAvailable = serverVersion.compare(localVersion, options: .NumericSearch) == .OrderedDescending;

        if updateAvailable {
            self.showUpdateDialog(serverVersion)
        }
    })
}

func showUpdateDialog(serverVersion: String) {
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        let alertController = UIAlertController(title: "New version of Example available!", message:
            "Example \(serverVersion) has been released. Would you like to download it now?", preferredStyle: UIAlertControllerStyle.Alert)
        alertController.addAction(UIAlertAction(title: "Not now", style: .Cancel,handler: nil))
        alertController.addAction(UIAlertAction(title: "Update", style: .Default, handler: { (UIAlertAction) in
            UIApplication.sharedApplication().openURL(NSURL(string: self.installationUrl)!)
        }))

        self.presentViewController(alertController, animated: true, completion: nil)
    })
}
 4
Author: Vlad Spreys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-01 23:37:14

Po prostu rozpowszechniaj aktualizację w ten sam sposób, w jaki rozpowszechniasz oryginał. Użytkownik zachowuje dane z poprzedniej wersji.

 1
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 20:17:58

W przypadku aktualizacji aplikacji istniejące dane aplikacji pozostają nadal, jeśli identyfikator pakietu aplikacji pozostaje taki sam.

Apple wyjaśnia wdrażanie aplikacji korporacyjnych i aktualizacje aplikacji tutaj: http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad802c

Polecam również włączenie sprawdzania aktualizacji w aplikacji.

Aby to zrobić, iVersion to biblioteka iOS autorstwa Nicka Lockwooda (aka Charcoal Design), która Ci w tym pomoże. Jest dostępny proszę.: https://github.com/nicklockwood/iVersion

 0
Author: blalond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 17:56:39