2012-12-04 12 views
14

Ciao, abbiamo sviluppato la nostra prima app aziendale di recente. Stiamo utilizzando l'opzione "In-House" per creare il certificato di distribuzione. Il cliente non sta ancora utilizzando l'app. Ma lo userà presto. Nel frattempo ho una domanda. Utilizzerà l'app e in futuro se ci saranno aggiornamenti per l'app da parte nostra, desideriamo che il client lo aggiorni anche dalla sua parte. Come ora ho app installate sul mio iPhone. Ottengo l'aggiornamento da AppStore dicendo che l'app XYZ è stata aggiornata. Quindi installo l'aggiornamento. Ora se il nostro client sta utilizzando l'app e ha salvato alcuni dati su di esso (la nostra app utilizza i dati di base e l'abbiamo costruita in modo che il client possa memorizzare alcuni dati sul dispositivo) vogliamo inviare un aggiornamento a lui che installerebbe l'aggiornamento, ma non cancellare eventuali dati client esistenti. È possibile? Come faccio? Sto usando l'installazione over the air in questo momento per installare l'app. Abbiamo un server sicuro, dove sono presenti i file .ipa e .plist e abbiamo una pagina html di download. Il cliente fa clic sul collegamento e l'app viene installata. Per favore fatemi sapere se avete bisogno di ulteriori informazioni. Grazie.Come aggiornare le app aziendali ios6 over-air

+0

controllo quest'altra domanda http://stackoverflow.com/questions/8439127/ios-enterprise-distribution-through-ota – tkanzakic

risposta

26

Sì, è possibile. Quando si distribuisce un'applicazione Enterprise, è necessario un plist che contenga metadati relativi all'applicazione. Questi metadati includono il numero di versione che è possibile utilizzare per verificare la presenza di aggiornamenti.

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

Una volta che si rileva l'aggiornamento è disponibile navigare l'utente alla URL di download

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

e verrà installato sopra la versione esistente lasciando tutti i dati in-tatto e anche aggiornare il database CoreData se si imposta la migrazione automatica e si apportano modifiche.

+0

@ Joe.Thank voi Ho guardato il file .plist e in cima vedo plist version = "1.0". Ora, dove scrivo il codice che hai messo qui? – RookieAppler

+0

È possibile generarlo da [Organzier in Xcode] (http://developer.apple.com/library/ios/#recipes/xcode_help-archives_organizer/articles/distributing_ios_apps.html), inserirlo manualmente o creare uno script che lo popola per le distribuzioni automatizzate. – Joe

+0

@ Joe.I nuovi per lo sviluppo di iOS. Tutto quello che ho usato in Organizer in Xcode è generare un nuovo schema e distribuire il pulsante. Faccio il salvataggio per la distribuzione aziendale, fornisco l'url dell'applicazione (... 1.0.ipa), il nome, gli URL delle immagini e ottengo i file .ipa e .plist. Quindi, quando ho un nuovo aggiornamento, cambia la versione del pacchetto nel file .plist di Xcode per supporre 2.0 e ripetere questo processo (fare clic sul pulsante di distribuzione, salvare per enterprise .. etc) e ottenere il nuovo .ipa e .plist e sostituire il vecchio ..1.0.ipa, .. 1.0.plist con ..2.0.ipa,. File .2.0.plist Cosa intendi quando dici "generalo da Organizer in Xcode". – RookieAppler

1

Basta distribuire l'aggiornamento nello stesso modo in cui si distribuisce l'originale. L'utente conserva i dati dalla versione precedente.

0

Per gli aggiornamenti delle app, i dati delle app esistenti permangono se l'ID del bundle per l'app rimane invariato.

di Apple spiega Enterprise App Distribuzione e aggiornamenti app qui: http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad802c

Consiglio inoltre incluso un correttore di aggiornamento in-app.

Per fare ciò, iVersion è una libreria ios di Nick Lockwood (aka Charcoal Design) che ti aiuterà a farlo. È disponibile qui: https://github.com/nicklockwood/iVersion

4

Grazie a Joe per una risposta fantastica. Ecco la versione estesa tradotta in swift. Si può mettere all'interno della viewDidLoad del controller vista principale

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) 
    }) 
} 
Problemi correlati