2012-12-04 12 views
14

Witam, ostatnio 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, aw przyszłości, jeśli będą jakieś 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, a my zbudowaliśmy ją w taki sposób, że klient może przechowywać pewne dane na urządzeniu), chcemy przesłać aktualizację do niego, która zainstaluje aktualizacji, ale nie można usunąć żadnych istniejących danych klienta. Czy to możliwe? Jak to zrobić? Korzystam teraz z instalacji powietrznej, aby zainstalować aplikację. Mamy bezpieczny serwer, na którym znajdują się pliki .ipa i .plist, a my mamy stronę pobierania html. Klient klika łącze, a aplikacja zostaje zainstalowana. Daj mi znać, jeśli potrzebujesz więcej informacji. Dzięki.Jak zaktualizować aplikacje korporacyjne ios6 przez Internet

+0

czek to inna kwestia http://stackoverflow.com/questions/8439127/ios-enterprise-distribution-through-ota – tkanzakic

Odpowiedz

26

Tak, jest to możliwe. Podczas wdrażania aplikacji Enterprise wymaga plist, który zawiera metadane dotyczące aplikacji. Te metadane obejmują numer wersji, którego można użyć do sprawdzenia 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 wykryć aktualizacja jest dostępna nawigacja użytkownika do pobierania URL

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

i będzie zainstalować na istniejącej wersji pozostawiając wszystkie dane w-takt, a nawet uaktualnij bazę danych CoreData, jeśli skonfigurujesz automatyczną migrację i wprowadzisz zmiany.

+0

@ Joe.Thank ty Spojrzałem na plik .plist i na samej górze widzę plist version = "1.0". Gdzie mogę napisać kod, który tutaj umieściłeś? – RookieAppler

+0

Można go wygenerować za pomocą [Organzier w Xcode] (http://developer.apple.com/library/ios/#recipes/xcode_help-archives_organizer/articles/distributing_ios_apps.html), ręcznie wprowadzić go lub utworzyć skrypt, który zapełnia go dla automatycznych wdrożeń. – Joe

+0

@ Joe.Jestem nowym deweloperem iOS. Wszystko, czego użyłem w Organizerze w Xcode, to wygenerowanie nowego schematu i przycisku dystrybucji. Wykonuję zapis dla dystrybucji w przedsiębiorstwie, podaję adres URL aplikacji (... 1.0.ipa), nazwę, adresy URL obrazów i otrzymuję pliki .ipa i .plist. Tak więc, gdy mam nową aktualizację, zmień wersję pakietu w pliku .plist Xcode, aby przypuszczać, że 2.0 i wykonaj ten proces ponownie (kliknij przycisk dystrybucji, zapisz dla enterprise..etc) i pobierz nowe .ipa i .plist i zastąp stare ..1.0.ipa, .. 1.0.plist przez .2.0.ipa,. .2.0.plist files? Co masz na myśli mówiąc "generuj z Organizatora w Xcode". – RookieAppler

1

Po prostu rozprowadź aktualizację w ten sam sposób, w jaki rozpowszechniasz oryginał. Użytkownik zachowuje dane z wcześniejszej wersji.

0

W przypadku aktualizacji aplikacji istniejące dane aplikacji pozostają aktualne, jeśli identyfikator pakietu dla tej aplikacji pozostanie taki sam.

Jabłko wyjaśnia Enterprise App Wdrożenie i aktualizacje aplikacji tutaj: http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad802c

Chciałbym również polecić w tym sprawdzania aktualizacji w aplikacji.

Aby to zrobić, iVersion jest biblioteką ios autorstwa Nick Lockwood (znaną również jako Charcoal Design), która pomoże ci to zrobić. Jest dostępny tutaj: https://github.com/nicklockwood/iVersion

4

Dzięki Joe za fantastyczną odpowiedź. Oto rozszerzona wersja przetłumaczona na szybką. Można umieścić go wewnątrz viewDidLoad swojego 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) 
    }) 
} 
Powiązane problemy