APP检测更新可以使用两种方法。第一种是和安卓等系统一样,获取自己服务器的APP版本号与已安装的APP版本号比较;第二种是根据已发布到app store上的应用版本号与已安装的APP版本号比较更新。第一种检测更新方法的优点是:检测更新速度快、检测稳定;缺点是:和app store上的应用版本号不同步(app上架需要审核时间,不确定什么时候成功更新到app store上)。第二种方法检测更新方法的优点是:检测版本号是实时同步的;缺点是:苹果网络不稳定,检测更新延时严重,部分APP获取不到任何参数。第一种,只需要后台服务器根据app store上架版本号手动修改数据就行了,APP版本号格式也可以自己定义。
iOS程序自动提示更新的实现方案大致分为两种:
第一种,自己服务器提供一个接口,告知相关app的当前版本,是否需要更新,以及更新的地址等信息 。
第二种,就是利用苹果的appstore 提供的相关api进行查询更新。
由于此前没有找到iOS程序更新的方法,就用了第一种方式,但后来发现了一些问题,自己提供服务器,需要维护,程序提交更新后,由于苹果需要审核,中间会有时间差,这个时间不好把握。后台就找苹果的相关文档,终于找到了。
http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html
实现机制:
#define APP_URL @"http://itunes.apple.com/lookup?id=你程序的appId" ASIFormDataRequest *formRequst = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:APP_URL]]; 请求网络数据,返回的大致数据如下,其他还有好多数据,我们把关键的给截取出来 { resultCount = 1; results = ( { artistId = 开发者 ID; artistName = 开发者名称; price = 0; isGameCenterEnabled = 0; kind = software; languageCodesISO2A = ( EN ); trackCensoredName = 审查名称; trackContentRating = 评级; trackId = 应用程序 ID; trackName = 应用程序名称"; trackViewUrl = 应用程序介绍网址; userRatingCount = 用户评级; userRatingCountForCurrentVersion = 1; version = 版本号; wrapperType = software; } ); }
取得这些数据后关键的信息就是“ version”最新版本号和“ trackViewUrl”程序地址。然后与本地程序的版本比较即可。
上面的build 对应info.plist文件里的“Bundle version”字段,供程序调试用,即内部调试版本号,不是显示在appstore上面的
version 对应info.plist文件里的“Bundle versions string, short”字段,这才是真正的版本号,显示在appstore上的。由于之前学习的时候,上网查资料,有好多人老是把这两个给弄混了,我也纠结了一会,特此说明一下,以备记忆。
//获取appstore最新的版本号 NSString *newVersion = [rightDic objectForKey:@"version"]; //获取应用程序的地址 NSString *newURL = [rightDic objectForKey:@"trackViewUrl"]; //取得本地程序的版本号 NSDictionary *localDic =[[NSBundle mainBundle] infoDictionary]; NSString *localVersion =[localDic objectForKey:@"CFBundleShortVersionString"]; CCLog(@"appStore 版本号为:%@ 本地版本号为:%@",newVersion,localVersion);
然后便是比较,这两个版本号是否一致来决定是否更新。
如果我们需要实现版本的 app 自动更新,那么我们需要获取当前运行程序的版本信息和 appstore 里发布的最新版本信息。
当前运行程序的版本信息,可以在 mainBundle 里面获取:
NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; NSString *currentVersion = [infoDict objectForKey:@"CFBundleVersion"];
而 appstore 里发布的最新版本信息获取稍微复杂一些,有两种方案,思路都是一样的:
其一:在某个服务器上存储最新发布的版本信息,需要的时候向该服务器查询;
其二:在需要的时候向 appstore 查询;
在这里介绍第二种方法:向 appstore 查询应用程序信息,包括作者,版本,app 介绍页面地址等信息。
英文好的同学可以参考 apple 的文档:www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html
具体步骤如下:
1,用 POST 方式发送请求:
http://itunes.apple.com/search?term=你的应用程序名称&entity=software
更加精准的做法是根据 app 的 id 来查找:
http://itunes.apple.com/lookup?id=你的应用程序的ID
如果是中国地区的程序,用这个:http://itunes.apple.com/cn/lookup?id=
2,从获得的 response 数据中解析需要的数据。因为从 appstore 查询得到的信息是 JSON 格式的,所以需要经过解析。解析之后得到的原始数据就是如下这个样子的:
{ resultCount = 1; results = ( { artistId = 301724683; artistName = Citibank; artistViewUrl = "http://itunes.apple.com/us/artist/citibank/id301724683?uo=4"; artworkUrl100 = "http://a5.mzstatic.com/us/r1000/117/Purple/a1/85/a9/mzl.hvwnfdkw.png"; artworkUrl512 = "http://a5.mzstatic.com/us/r1000/117/Purple/a1/85/a9/mzl.hvwnfdkw.png"; artworkUrl60 = "http://a2.mzstatic.com/us/r1000/099/Purple/67/86/7e/mzi.utfdvrgy.png"; averageUserRating = "3.5"; averageUserRatingForCurrentVersion = 5; contentAdvisoryRating = "4+"; currency = USD; description = "Description of you app."; features = ( iosUniversal ); fileSizeBytes = 4141195; genreIds = ( 6015 ); genres = ( Finance ); ipadScreenshotUrls = ( "http://a1.mzstatic.com/us/r1000/095/Purple/e0/a6/17/mzl.pbbxcjzt.1024x1024-65.jpg", "http://a3.mzstatic.com/us/r1000/036/Purple/cc/14/98/mzl.dyairego.1024x1024-65.jpg" ); isGameCenterEnabled = 0; kind = software; languageCodesISO2A = ( EN ); price = 0; primaryGenreId = 6015; primaryGenreName = Finance; releaseDate = "2011-01-24T06:14:35Z"; releaseNotes = "* View Real-time streaming prices for U.S. Treasuries * Open and Save your Citi Research in your favorite PDF Reader and Library such as iBooks * Search for your favorite videos"; screenshotUrls = ( "http://a3.mzstatic.com/us/r1000/066/Purple/17/51/fb/mzl.zywiavgn.png", "http://a5.mzstatic.com/us/r1000/026/Purple/73/85/97/mzl.csmdtndk.png" ); sellerName = "Citibank, N.A."; sellerUrl = "http://"; supportedDevices = ( all ); trackCensoredName = "Citi Velocity"; trackContentRating = "4+"; trackId = 414697122; trackName = "Citi Velocity"; trackViewUrl = "http://itunes.apple.com/us/app/citi-velocity/id414697122?mt=8&uo=4"; userRatingCount = 5; userRatingCountForCurrentVersion = 1; version = "1.4"; wrapperType = software; } ); } 然后从中取得 results 数组即可,具体代码如下所示: NSDictionary *jsonData = [dataPayload JSONValue]; NSArray *infoArray = [jsonData objectForKey:@"results"]; NSDictionary *releaseInfo = [infoArray objectAtIndex:0]; NSString *latestVersion = [releaseInfo objectForKey:@"version"]; NSString *trackViewUrl = [releaseInfo objectForKey:@"trackViewUrl"]; 如果你拷贝 trackViewUrl 的实际地址,然后在浏览器中打开,就会打开你的应用程序在 appstore 中的介绍页面。当然我们也可以在代码中调用 safari 来打开它。 UIApplication *application = [UIApplication sharedApplication]; [application openURL:[NSURL URLWithString:trackViewUrl]]; 这是评论的地址: 在iPhone应用里直接打开app store 评论页面的方法: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=abc"]]; 复制代码 更换下id号就可以。 如果想要打开下载页面,把url改为 itms-apps://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=40461254 更换下id号就可以。