如何通过无线方式更新ios6企业应用程序
您好,我们最近开发了第一个企业应用程序。我们正在使用“内部”选项创建分发证书。客户端尚未使用该应用程序。但他很快就会使用它。与此同时,我有一个问题。他将使用该应用程序,将来如果我们这边有任何应用程序更新,我们希望客户端也在他这边更新。就像现在我的iPhone上安装了应用程序一样。我从AppStore得到更新,说XYZ应用程序已更新。所以我安装了更新。现在,如果我们的客户端正在使用该应用程序,并且已经在其上保存了一些数据(我们的应用程序使用核心数据,并且我们以客户端可以在设备上存储一些数据的方式构建了该应用程序),我们希望向他发送一个更新,该更新将安装更新,但不会删除任何现有的客户端数据。这可能吗?我该怎么做?我现在正在使用无线安装来安装应用程序。我们有一个安全的服务器,其中有.ipa和.plist文件,我们有一个下载html页面。客户端单击链接,应用程序就会安装。如果你需要更多信息,请告诉我。谢谢。只需像分发原件一样分发更新。用户保留早期版本的数据。是的,这是可能的。部署企业应用程序时,需要包含应用程序元数据的plist。此元数据包括可用于检查更新的版本号如何通过无线方式更新ios6企业应用程序,ios,installation,wireless,enterprise,updates,Ios,Installation,Wireless,Enterprise,Updates,您好,我们最近开发了第一个企业应用程序。我们正在使用“内部”选项创建分发证书。客户端尚未使用该应用程序。但他很快就会使用它。与此同时,我有一个问题。他将使用该应用程序,将来如果我们这边有任何应用程序更新,我们希望客户端也在他这边更新。就像现在我的iPhone上安装了应用程序一样。我从AppStore得到更新,说XYZ应用程序已更新。所以我安装了更新。现在,如果我们的客户端正在使用该应用程序,并且已经在其上保存了一些数据(我们的应用程序使用核心数据,并且我们以客户端可以在设备上存储一些数据的方式构
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服务://?操作=下载清单和url=
如果设置自动迁移并进行更改,它将安装在现有版本上,保留所有数据,甚至升级CoreData数据库。对于应用程序更新,如果应用程序的捆绑ID保持不变,则现有应用程序数据将持续存在 Apple在此处解释企业应用程序部署和应用程序更新: 我还建议在应用程序中包含一个更新检查器 为了做到这一点,iVersion是Nick Lockwood(又名Carbon Design)的ios库,它将帮助您实现这一点。可在以下位置获取:
感谢乔的精彩回应。以下是翻译成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)
})
}
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)
}}
但这只是一次,每次都需要更多修改检查另一个问题@Joe.谢谢。我查看了.plist文件,在最上面我看到了plist version=“1.0”。现在,我在哪里编写您放在这里的代码?您可以从生成代码、手动输入代码,或者创建一个脚本来填充它以进行自动部署。@Joe。我是iOS开发的新手。我在Xcode的Organizer中使用的所有功能都是生成新方案并分发按钮。我为企业发行版保存,提供应用程序url(…1.0.ipa)、名称、图像url,并获取.ipa和.plist文件。因此,当我有一个新的更新时,将Xcode的.plist文件中的捆绑包版本更改为假设2.0,并再次执行此过程(单击Distribute按钮,为enterprise保存..等),然后获取新的.ipa和.plist,并将旧的..1.0.ipa、..1.0.plist替换为..2.0.ipa、..2.0.plist文件?你说“从Xcode中的Organizer生成它”是什么意思。您可以在“摘要”选项卡的“目标设置”下的Xcode中设置捆绑包版本号。当您在Organizer中归档应用程序并保存以供分发时,它将生成一个plist文件,其中包含您在Xcode中设置的捆绑包版本。您需要做的就是在服务器上替换plist,上面的代码将能够检测到版本更改。上面的代码是同步的,我在应用程序启动时在一个单独的线程中运行它。我建议您也这样做。在版本比较上遇到了一些问题。结果是“CbundLeverVersion”返回内部版本号(而不是版本号)。为了比较版本,我将其替换为“CbundleShortVersionString”。