【问题标题】:How to update ios6 enterprise apps over the air如何通过无线方式更新 ios6 企业应用程序
【发布时间】:2012-11-22 13:30:33
【问题描述】:

您好,我们最近开发了我们的第一个企业应用程序。我们正在使用“内部”选项来创建分发证书。客户尚未使用该应用程序。但他很快就会使用它。同时我有一个问题。他将使用该应用程序,并且将来如果我们这边对应用程序有任何更新,我们希望客户也可以在他这边进行更新。就像现在我的 iPhone 上安装了应用程序。我从 AppStore 收到更新,说 XYZ 应用程序已更新。所以我安装更新。现在,如果我们的客户正在使用该应用程序并在其上保存了一些数据(我们的应用程序使用核心数据,并且我们以客户端可以在设备上存储一些数据的方式构建它)我们想向他发送将安装的更新更新,但不删除任何现有的客户端数据。这可能吗?我该怎么做?我现在正在使用无线安装来安装应用程序。我们有一个安全的服务器,其中存在 .ipa 和 .plist 文件,并且我们有一个下载 html 页面。客户单击链接并安装应用程序。如果您需要更多信息,请告诉我。谢谢。

【问题讨论】:

标签: ios installation wireless enterprise updates


【解决方案1】:

是的,这是可能的。当您部署企业应用程序时,它需要一个包含有关应用程序元数据的 plist。此元数据包括可用于检查更新的版本号。

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 数据库。

【讨论】:

  • @Joe.Thank you.我查看了 .plist 文件,在最顶部我看到 plist version="1.0"。现在,我在哪里写你放在这里的代码?
  • 您可以从Organzier in Xcode 生成它,手动输入它,或者创建一个脚本来填充它以进行自动部署。
  • @Joe。我是 iOS 开发新手。我在 Xcode 的 Organizer 中使用的只是生成新方案和分发按钮。我为企业分发保存,提供应用程序 url(...1.0.ipa)、名称、图像 url 并获取 .ipa 和 .plist 文件。因此,当我有新的更新时,将 Xcode 的 .plist 文件中的 Bundle 版本更改为假设 2.0 并再次执行此过程(单击分发按钮,保存为企业..etc)并获取新的 .ipa 和 .plist 并替换旧的..1.0.ipa ,..1.0.plist 和 ..2.0.ipa, ..2.0.plist 文件?你说“从 Xcode 中的 Organizer 生成它”是什么意思。
  • 您在 Xcode 中的“摘要”选项卡中的目标设置下设置捆绑版本号。当您在 Organizer 中归档应用程序并保存以供分发时,它将生成一个 plist 文件,其中包含您在 Xcode 中设置的捆绑版本。您需要做的就是替换服务器上的 plist,上面的代码将能够检测到版本更改。上面的代码是同步的,我在应用启动时在单独的线程中运行它。我建议你也这样做。
  • 版本比较有问题。原来“CFBundleVersion”返回内部版本号(不是版本)。为了比较版本,我将其替换为“CFBundleShortVersionString”。
【解决方案2】:

感谢乔的精彩回复。这是翻译成 swift 的扩展版本。你可以把它放在你的主视图控制器的viewDidLoad里面

let plistUrl = "https://example.com/example.plist"
let installationUrl = "itms-services://?action=download-manifest&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)
    })
}

【讨论】:

    【解决方案3】:

    只需像分发原始版本一样分发更新。用户保留早期版本的数据。

    【讨论】:

      【解决方案4】:

      在 swift 4 中更新了@Vlad 的答案

       var plistUrl = "https://xxxxxxxxxxxxxxfgfgf/ex.plist"
      
      var installationUrl = URL(string : "itms-services://?action=download-manifest&url=https://xxxxxxxxxxxxxxfgfgf/ex.plist")
      
      
         func checkForUpdates() {
             let qos = DispatchQoS(qosClass: .background, relativePriority: 0)
             let backgroundQueue = DispatchQueue.global(qos: qos.qosClass)
          backgroundQueue.async(execute: {
              let updateDictionary = NSDictionary(contentsOf: NSURL(string: self.plistUrl)! as URL)!
      
                 let items = updateDictionary["items"]
              let itemDict = (items as AnyObject).lastObject as! NSDictionary
                 let metaData = itemDict["metadata"] as! NSDictionary
                 let serverVersion = metaData["bundle-version"] as! String
      
              print ("serverVersion=",serverVersion)
              let localVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String
              print ("localVersion=",localVersion)
      
                 let updateAvailable = serverVersion.compare(localVersion, options: .numeric) == .orderedDescending
              print("version is newer")
      
                 if updateAvailable {
                  self.showUpdateDialog(serverVersion: serverVersion)
                 }
             })
         }
      
         func showUpdateDialog(serverVersion: String) {
             DispatchQueue.main.async { () -> Void in
                 let alertController = UIAlertController(title: "New version of  App  available!", message:
                  "MCD \(serverVersion) has been released. Would you like to download it now?", preferredStyle: UIAlertController.Style.alert)
              alertController.addAction(UIAlertAction(title: "Not now", style: .cancel,handler: nil))
              alertController.addAction(UIAlertAction(title: "Update", style: .default, handler: { (UIAlertAction) in
                  UIApplication.shared.open(self.installationUrl!, options: [:], completionHandler: nil)
                 }))
      
              self.present(alertController, animated: true, completion: nil)
          }}
      

      但这只是一次,每次都需要更多修改

      【讨论】:

        【解决方案5】:

        对于应用更新,如果应用的捆绑包 ID 保持不变,现有应用数据将保持不变。

        Apple 在此处解释企业应用部署和应用更新:http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad802c

        我还建议在应用程序中包含更新检查器。

        要做到这一点,iVersion 是 Nick Lockwood(又名 Charcoal Design)的一个 ios 库,它可以帮助您做到这一点。它在这里可用: https://github.com/nicklockwood/iVersion

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-02
          • 1970-01-01
          • 2023-04-10
          • 2019-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多