2012-12-04 29 views
14

Merhaba, son kurumsal uygulamanızı geliştirdik. Dağıtım sertifikasını oluşturmak için "Ev İçi" seçeneğini kullanıyoruz. İstemci henüz uygulamayı kullanmıyor. Ama yakında kullanacak. Bu arada bir sorum var. Uygulamayı kullanacak ve gelecekte tarafımızdan yapılacak herhangi bir güncellemenin olması durumunda, müşterinin de kendi tarafında güncellenmiş olmasını istiyoruz. Şu anda olduğu gibi iPhone'umda da uygulamaları var. XYZ uygulamasının güncellendiğini söyleyen AppStore'dan güncelleme alıyorum. Bu yüzden güncellemeyi yüklüyorum. Artık müşterimiz uygulamayı kullanıyorsa ve bazı verileri kaydettiyse (uygulamamız temel verileri kullanır ve müşterinin cihaza bazı verileri depolayabileceği şekilde oluşturduk), yüklemek istediği bir güncelleme göndermek istiyoruz Güncelleme, ancak mevcut herhangi bir istemci verisi silmek mümkün değil. Bunu nasıl yaparım? Uygulamayı yüklemek için şu anda hava kurulumunu kullanıyorum. .ipa ve .plist dosyalarının bulunduğu güvenli bir sunucumuz var ve bir indirme html sayfamız var. İstemci bağlantıyı tıklar ve uygulama yüklenir. Daha fazla bilgiye ihtiyacınız varsa lütfen bana bildirin. Teşekkürler.Havadaki ios6 kurumsal uygulamaları güncelleme

+0

çek koyabilirsiniz bu diğer soru http://stackoverflow.com/questions/8439127/ios-enterprise-distribution-through-ota – tkanzakic

cevap

26

Evet, bu mümkün. Bir Enterprise uygulamasını dağıttığınızda, uygulama hakkında meta veriler içeren bir plist gerektirir. Bu meta veriler, güncellemeleri kontrol etmek için kullanabileceğiniz sürüm numarasını içerir.

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

tüm verileri inceliğini-in ve hatta güncelleme indir URL'ye

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

için kullanıcı gezinmek kullanılabilir algılamak ve onu terk bulunan sürümün üzerine kuracak kez Otomatik geçişi ayarlar ve değişiklikler yaparsanız CoreData veritabanını yükseltin.

+0

@ Joe.Thank sen .plist dosyasına baktım ve en üstte plist version = "1.0" görüyorum. Şimdi, buraya koyduğun kodu nereye yazarım? – RookieAppler

+0

Bunu [Xcode'ta Organzier] 'den (http://developer.apple.com/library/ios/#recipes/xcode_help-archives_organizer/articles/distributing_ios_apps.html) oluşturabilir, el ile girebilir veya bir komut dosyası oluşturabilirsiniz. otomatik dağıtımlar için doldurur. – Joe

+0

@ Joe.I iOS geliştirmede yeniyim. Xcode'taki Organizer'da kullandığım yeni şema ve dağıtım düğmesi oluşturmaktır. Kurumsal dağıtım için kayıt yapıyorum, uygulama url (... 1.0.ipa), isim, resim urlleri ve .ipa ve .plist dosyalarını aldım. Bu yüzden yeni bir güncellemem olduğunda, Xcode'un .plist dosyasındaki Bundle versiyonunu 2 olarak değiştirin.0 ve bu işlemi tekrar yapın (dağıtmak için düğmesini tıklayın, kurumsal için kaydedin ... vb) ve yeni .ipa ve .plist alın ve eski ..1.0.ipa, .. 1.0.plist yerine ..2.0.ipa, ile değiştirin. .2.0.plist dosyaları? "Xcode'ta Organizer'dan oluştur" dediğinizde ne demek istiyorsunuz? – RookieAppler

1

Güncelleştirmeyi, orijinali dağıttığınız şekilde dağıtmanız yeterlidir. Kullanıcı önceki versiyondan verileri korur.

0

Uygulama güncellemeleri için, uygulamanın uygulama kimliği aynı kaldığında mevcut uygulama verileri devam eder. http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad802c

Ben de uygulama içi bir güncelleme denetleyici gibi öneriyoruz:

Elma Kurumsal Uygulaması Dağıtım ve burada uygulama güncellemeleri açıklar.

Bunu yapmak için iVersion, Nick Lockwood (aka Kömür Tasarımı) tarafından size yardımcı olacak bir ios kütüphanesidir. Şu an mevcut: https://github.com/nicklockwood/iVersion

4

Harika bir yanıt için Joe'ya teşekkürler. İşte hızlıca tercüme edilen genişletilmiş versiyon. Eğer ana görünümü denetleyicisi viewDidLoad

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