2012-12-04 10 views
14

हैलो हमने हाल ही में अपना पहला एंटरप्राइज़ ऐप विकसित किया है। हम वितरण प्रमाणपत्र बनाने के लिए "इन-हाउस" विकल्प का उपयोग कर रहे हैं। क्लाइंट अभी तक ऐप का उपयोग नहीं कर रहा है। लेकिन वह जल्द ही इसका इस्तेमाल करेगा। इस बीच मुझे एक सवाल मिला। वह ऐप का उपयोग करेगा और भविष्य में यदि हमारे पक्ष से ऐप के कोई अपडेट हैं, तो हम चाहते हैं कि ग्राहक इसे अपने पक्ष में भी अपडेट कर ले। अभी ठीक है मेरे पास अपने आईफोन पर एप्स इंस्टॉल हैं। मुझे ऐपस्टोर से अद्यतन मिलता है कि एक्सवाईजेड ऐप अपडेट किया गया है। तो मैं अद्यतन स्थापित करें। अब यदि हमारा ग्राहक ऐप का उपयोग कर रहा है और उस पर कुछ डेटा सहेजा है (हमारा ऐप कोर डेटा का उपयोग करता है, और हमने इसे इस तरह से बनाया है कि क्लाइंट डिवाइस पर कुछ डेटा स्टोर कर सकता है) हम उसे अपडेट भेजना चाहते हैं जो इंस्टॉल करेगा अद्यतन, लेकिन मौजूदा क्लाइंट डेटा मिटा नहीं है। क्या यह संभव है? मैं इसे कैसे कर सकता हूं? मैं ऐप इंस्टॉल करने के लिए अभी वायु स्थापना पर उपयोग कर रहा हूं। हमारे पास एक सुरक्षित सर्वर है, जहां .ipa और .plist फ़ाइलें मौजूद हैं और हमारे पास एक डाउनलोड HTML पृष्ठ है। ग्राहक लिंक पर क्लिक करता है और ऐप इंस्टॉल हो जाता है। यदि आपको अधिक जानकारी की जरूरत है तो कृपया मुझे बता है। धन्यवाद।हवा पर ios6 एंटरप्राइज़ ऐप्स को अपडेट करने के लिए कैसे करें

+0

जांच यह अन्य प्रश्न http://stackoverflow.com/questions/8439127/ios-enterprise-distribution-through-ota – tkanzakic

उत्तर

26

हां, यह संभव है। जब आप एंटरप्राइज़ एप्लिकेशन को तैनात करते हैं तो उसे एक प्लेलिस्ट की आवश्यकता होती है जिसमें एप्लिकेशन के बारे में मेटाडेटा होता है। इस मेटाडाटा में संस्करण संख्या शामिल है जिसका उपयोग आप अपडेट की जांच के लिए कर सकते हैं।

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

एक बार जब आप का पता लगाने के अद्यतन डाउनलोड URL

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

करने के लिए उपयोगकर्ता नेविगेट उपलब्ध है और इसे छोड़ने मौजूदा संस्करण पर स्थापित हो जाएगा इन-कुशलता और यहां तक ​​कि सभी डेटा यदि आप ऑटो माइग्रेशन सेट करते हैं और परिवर्तन करते हैं तो CoreData डेटाबेस को अपग्रेड करें।

+0

@ Joe.Thank आप मैंने .plist फ़ाइल को देखा और बहुत ऊपर मैं प्लिस्ट संस्करण = "1.0" देखता हूं। अब, मैं आपके द्वारा यहां डाला गया कोड कहां लिखूं? – RookieAppler

+0

आप इसे [एक्सकोडियर में एक्सकोडियर] से उत्पन्न कर सकते हैं (http://developer.apple.com/library/ios/#recipes/xcode_help-archives_organizer/articles/distributing_ios_apps.html), मैन्युअल रूप से इसे इनपुट करें, या एक स्क्रिप्ट बनाएं स्वचालित तैनाती के लिए इसे populates। – Joe

+0

@ जो। मैं आईओएस विकास के लिए नया हूं। मैं एक्सकोड में ऑर्गनाइज़र में इस्तेमाल करता हूं, नई योजना उत्पन्न करना और बटन वितरित करना है। मैं एंटरप्राइज़ वितरण के लिए बचत करता हूं, एप्लिकेशन यूआरएल (... 1.0.ipa), नाम, छवि यूआरएल देता हूं और .ipa और .plist फ़ाइलों को प्राप्त करता हूं। तो जब मेरे पास एक नया अपडेट है, तो 2 को मानने के लिए एक्सकोड की .plist फ़ाइल में बंडल संस्करण बदलें।0 और इस प्रक्रिया को दोबारा करें (वितरण बटन पर क्लिक करें, एंटरप्राइज़..एटीसी के लिए सहेजें) और नया .ipa और .plist प्राप्त करें और पुराने ..1.0.ipa, .. 1.0.plist ..2.0.ipa के साथ बदलें। .2.0.plist फाइलें? जब आप कहते हैं कि "एक्सकोड में ऑर्गनाइज़र से इसे उत्पन्न करें" तो आपका क्या मतलब है। – RookieAppler

1

बस उसी तरह वितरित करें जैसे आप मूल वितरित करते हैं। उपयोगकर्ता पहले संस्करण से डेटा को बरकरार रखता है।

0

ऐप अपडेट के लिए, मौजूदा ऐप डेटा तब भी बनी रहती है जब ऐप के लिए बंडल आईडी समान रहता है।

एप्पल बताते एंटरप्राइज एप्लिकेशन परिनियोजन और एप्लिकेशन यहां अपडेट: http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad802c

मैं भी एप्लिकेशन के तहत एक अद्यतन चेकर सहित सलाह देते हैं।

ऐसा करने के लिए, iVersion निक लॉकवुड (उर्फ चारकोल डिज़ाइन) द्वारा आईओएस लाइब्रेरी है जो आपको ऐसा करने में मदद करेगा। यह यहां उपलब्ध है: https://github.com/nicklockwood/iVersion

4

एक शानदार प्रतिक्रिया के लिए जो के लिए धन्यवाद। स्विफ्ट में अनुवादित विस्तारित संस्करण यहां दिया गया है। आप अपने मुख्य दृश्य नियंत्रक के 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) 
    }) 
} 
संबंधित मुद्दे