2012-12-04 6 views
14

Hallo, wir haben kürzlich unsere erste Enterprise-App entwickelt. Wir verwenden die Option "In-House", um das Verteilungszertifikat zu erstellen. Client verwendet die App noch nicht. Aber er wird es bald benutzen. Inzwischen habe ich eine Frage bekommen. Er wird die App nutzen und in Zukunft, wenn es von unserer Seite Aktualisierungen für die App gibt, möchten wir, dass der Client sie auf seiner Seite aktualisiert. Wie im Moment habe ich Apps auf meinem iPhone installiert. Ich bekomme vom AppStore ein Update, dass die XYZ-App aktualisiert wurde. Also installiere ich das Update. Wenn unser Kunde die App verwendet und einige Daten darauf gespeichert hat (unsere App verwendet Kerndaten und wir haben sie so erstellt, dass der Client einige Daten auf dem Gerät speichern kann), möchten wir ein Update an ihn senden, das installiert werden soll das Update, aber keine vorhandenen Kundendaten löschen. Ist das möglich? Wie mache ich das? Ich benutze gerade die Luftinstallation, um die App zu installieren. Wir haben einen sicheren Server, auf dem die .ipa- und .plist-Dateien vorhanden sind und wir haben eine Download-HTML-Seite. Der Kunde klickt auf den Link und die App wird installiert. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Vielen Dank.So aktualisieren Sie ios6 Enterprise-Apps drahtlos

+0

Check diese andere Frage stellen http://stackoverflow.com/questions/8439127/ios-enterprise-distribution-through-ota – tkanzakic

Antwort

26

Ja, es ist möglich. Wenn Sie eine Enterprise-Anwendung bereitstellen, benötigen Sie eine Anwendung, die Metadaten zur Anwendung enthält. Diese Metadaten enthalten die Versionsnummer, mit der Sie nach Updates suchen können.

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

Sobald erkennen Sie das Update verfügbar ist

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

und es wird über die bestehende Version zu verlassen, alle Daten in-Takt installieren und sogar

den Benutzer auf die Download-URL navigieren Aktualisieren Sie die CoreData-Datenbank, wenn Sie die automatische Migration einrichten und Änderungen vornehmen.

+0

@ Joe.Thank Sie Ich schaute auf die .plist Datei und ganz oben sehe ich plist Version = "1.0". Nun, wo schreibe ich den Code, den Sie hier eingeben? – RookieAppler

+0

Sie können es aus dem [Organzier in Xcode] (http://developer.apple.com/library/ios/#recipes/xcode_help-archives_organizer/articles/distributing_ios_apps.html) generieren, manuell eingeben oder ein Skript erstellen, das füllt es für automatisierte Bereitstellungen auf. – Joe

+0

@ Joe.Ich bin neu in iOS-Entwicklung.Alle ich in Organizer in Xcode verwendet wird, um neue Schema zu generieren und Schaltfläche zu verteilen. Ich mache das Speichern für die Unternehmensverteilung, gebe die Anwendungs-URL (... 1.0.ipa), den Namen, die Image-URLs und die .ipa- und .plist-Dateien. Wenn ich ein neues Update habe, ändere die Bundle-Version in Xcodes .plist-Datei auf 2.0 und führen Sie diesen Vorgang erneut aus (klicken Sie auf Verteilungsschaltfläche, speichern Sie für enterprise..etc), und rufen Sie die neue .ipa und .plist ab, und ersetzen Sie die alte ..1.0.ipa, .. 1.0.plist durch ..2.0.ipa,. .2.0.plist-Dateien? Was meinen Sie, wenn Sie sagen "Generate it from Organizer in Xcode". – RookieAppler

1

Verteilen Sie das Update einfach so, wie Sie das Original verteilen. Der Benutzer behält die Daten aus der früheren Version.

0

Bei App-Updates bleiben die vorhandenen App-Daten bestehen, wenn die Paket-ID für die App gleich bleibt.

von Apple erklärt Enterprise-App Deployment und App-Updates hier: http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad802c

Ich würde auch in-App mit einem Update-Checker empfehlen.

Um dies zu tun, ist iVersion eine Ios-Bibliothek von Nick Lockwood (aka Charcoal Design), die Ihnen dabei helfen wird. Es ist hier verfügbar: https://github.com/nicklockwood/iVersion

4

Dank Joe für eine fantastische Antwort. Hier ist die erweiterte Version übersetzt in Swift. Sie können es im Inneren Controller des viewDidLoad Ihrer Hauptansicht

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) 
    }) 
} 
Verwandte Themen