Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS自动检查更新

iOS自动检查更新

作者头像
Cloudox
发布于 2021-11-23 02:58:24
发布于 2021-11-23 02:58:24
60100
代码可运行
举报
文章被收录于专栏:月亮与二进制月亮与二进制
运行总次数:0
代码可运行

我们每天在app store收到新的应用更新通知,打开应用时也是不是弹出更新的提示框,自动检查更新这个功能随处可见,虽然作为用户来说老看到这种提示挺烦的,但是作为开发者来说让用户始终更新到最新的版本是最好的,个人认为减少用户厌烦情绪的方法之一是详细地说明更新的地方和原因,这样用户会好接受的多。现在就讲讲怎么在工程内实现自动检查更新。

两种方法:

1、检测服务器上给出的版本号,与自身版本对比

如果不是单机应用或游戏,那就会经常需要与自身的后台服务器进行数据通信,与其他通信一样,可以在打开app时向后台请求最新的版本号,得到回复后,与自身的版本号进行对比,如果有新的版本,则提示用户进行更新。

这一方法在android应用上比较常见,因为应用市场多且杂,由自己来掌握更新会放心得多,但作为ios端来说,因为提交新版本给app store需要一段时间的审核才能让用户下载到,所以实时性有些差,这也是为什么有时候会碰到应用提示更新而app store并没有看到更新字样的原因,解决办法就是等审核通过后再把后台服务器上提供的版本号更新,也很方便,另一个缺点可能就是需要一个服务器了吧。 这种方法与其他的与后台进行通信没什么不同,就不具体讲了。

2、向app store请求版本信息,与自身版本对比

苹果市场的统一在这里就体现出优势了,所有的应用都在这里,只要更新提交审核通过了就可以获取最新的版本信息,没通过的话获取的就还是原来的版本信息,实时性是很好的,而且在请求版本信息时,去往app store下载的链接也会一并返回,可以直接使用,非常方便。但像苹果的服务器请求数据想象起来还是没有向自己的服务器请求的靠谱,具体使用效果如何,等我体验过之后,才会知道啦。

这种方法需要向苹果的服务器请求数据,本文重点说明这一种方法。

向app store请求版本信息:

AppID:当我们在自己的开发者中心创建一个应用后,就会得到一个应用的专属AppID,这个AppID不是我们创建证书时创建的那个Identifier,而是自动生成的一串唯一的数字,在开发者中心创建应用后,进入应用的网页后,网址最后面的那串数字就是我们应用的AppID,我们就是凭借这个AppID告诉app store我们要查询的是哪个应用的版本信息。

查到自己的AppID后就可以进行版本信息的请求了,url是固定的,改变的只有最后的AppID,同时我们也把当下的版本获取到,这里简单地写一个,真是应用的话,应该长久保存在本地。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString *currentVersion = @"0.9"; // 现在的版本  
NSString *appID = @"你的应用的AppID";// 此app的ID  
// 请求url  
NSString *versionUrl = [NSString stringWithFormat:@"http://itunes.apple.com/cn/lookup?id=%@", appID];  
NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:versionUrl]];  

处理返回的数据:

app store 返回的数据是一个多层嵌套的json数据,这里直接给出如何解析获得我们需要的版本号及下载链接。其实获取的还有其他的信息,具体想了解的话可以输出查看一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 收到的回复  
NSData *response = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:nil];  
  
// 转换成键值对形式  
NSError *error;  
NSDictionary *appInfoDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];  
if (error) {  
    NSLog(@"error: %@", [error description]);  
    return;  
}  
NSLog(@"%@", appInfoDic);// 可输出查看回复的详细信息  
  
// 查看具体内容中内容数是否为空  
NSArray *resultsArray = [appInfoDic objectForKey:@"results"];  
if (![resultsArray count]) {  
    NSLog(@"error: resultsArray == nil");  
    return;  
}  
// 获取具体需要的信息  
NSDictionary *infoDic = [resultsArray objectAtIndex:0];  
self.latestVersion = [infoDic objectForKey:@"version"];// 版本号  
self.trackViewUrl = [infoDic objectForKey:@"trackViewUrl"];// 更新的url地址  

这里在第一次转换成Dictionary格式后,可以输出看看都获取了一些什么信息,之后就是具体提出我们需要的版本号来进行对比,以及去往app store更新的url地址。

提示用户更新:

获取到app store上最新的版本号后,就可以和本地存储的版本号进行对比了,如果有新的版本,就弹出提示框提示用户有新版本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 弹出提示框  
if (![currentVersion isEqualToString:self.latestVersion]) {  
    NSString *messageStr = [NSString stringWithFormat:@"发现新版本:%@,是否前往更新?", self.latestVersion];  
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"更新提示" message:messageStr delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"更新", nil nil];  
    alert.tag = 10000;// 给提示框加上标签告知是更新的提示框  
    [alert show];  
} 

PS:当应用更迭了很多个版本后,我们可能很难一直维护支持所有的版本,有时候旧版本的健壮性不是很好的话,甚至使用起来会出很多问题,所以可能就需要会要强制更新,这是提示框应该只提供更新的按钮,不更新则不允许使用应用。如果是采用的第一种方法来检测更新,我们就可以传递一个数据告知应用低于多少版本的需要更新,但是如果采用的是第二种方法,向app store检测更新的话,如何告诉应用必须更新呢?这里我还没想好,希望有大神可以指教一下~

如果用户点击更新的话,就通过刚才获取的url跳转到app store去更新:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 提示框的响应  
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {  
    if (alertView.tag == 10000) {// 是更新的提示框  
        if (buttonIndex == 1) {  
            // 前往app store更新  
            NSURL *url = [NSURL URLWithString:self.trackViewUrl];  
            [[UIApplication sharedApplication]openURL:url];  
        }  
    }  
}

至此就完成了第二种方法的实现,向app store请求版本号来实现自动检测更新。

这里有工程源码:https://github.com/Cloudox/UpdateTest

参考资料:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/11/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS开发之诱导用户为自己的App评论功能
allluckly.cn.jpg "由于我自己的App下载量少,评论也少,出于App的aso优化,想尽办法,而评论是aso里边比较重视的一块,前面的版本都没有诱导用户评论的这一功能,导致有些被动。" 由此自己简单的封装了该功能,下面我们先看看效果图: 1.png 弹出试图并没有做什么处理,就是系统的8.0以前用的UIAlertView8.0以上用的UIAlertController 具体的一些算法,都可以看代码,闲话不多说,直接贴码, 新建一个NSObject的类命名为LBToAppStore 具
Bison
2018/07/04
1K0
实践-小细节Ⅵ
有时候,UITableView 的cell个数很少,可是UITableView的headView又是一个有颜色背景的View,当我们下拉的时候,拉扯出来的区域也是白色的,很不协调
進无尽
2018/09/12
9950
实践-小细节Ⅵ
【IOS开发高级系列】MVVM—ReactiveCocoa架构设计专题(二)
        Streams 表现为RACStream类,可以看做是水管里面流动的一系列玻璃球,它们有顺序的依次通过,在第一个玻璃球没有到达之前,你没法获得第二个玻璃球。
江中散人_Jun
2023/10/16
3960
【IOS开发高级系列】MVVM—ReactiveCocoa架构设计专题(二)
iOS开发·runtime原理与实践: 关联对象篇(Associated Object)(应用场景:为分类添加“属性”,为UI控件关联事件Block体,为了不重复获得某种数据)
分类(category)与关联对象(Associated Object)作为objective-c的扩展机制的两个特性:分类,可以通过它来扩展方法;Associated Object,可以通过它来扩展属性;
陈满iOS
2018/09/10
3K0
iOS开发·runtime原理与实践: 关联对象篇(Associated Object)(应用场景:为分类添加“属性”,为UI控件关联事件Block体,为了不重复获得某种数据)
实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面
ios122
2018/01/03
7600
实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面
【IOS 开发】基本 UI 控件详解 (UISegmentedControl | UIImageView | UIProgressView | UISlider | UIAlertView )
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50163725
韩曙亮
2023/03/27
3.4K0
【IOS 开发】基本 UI 控件详解 (UISegmentedControl | UIImageView | UIProgressView | UISlider | UIAlertView )
RestKit ,一个用于更好支持RESTful风格服务器接口的iOS库
简介 RestKit 是一个用于更好支持RESTful风格服务器接口的iOS库,可直接将联网获取的json/xml数据转换为iOS对象. 最新示例: 点击下载 注意: 如果无法直接运行示例根目录的工程
ios122
2018/01/02
2.5K0
iOS_11_tableViewCell使用alertView变更数据
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117667.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/05
5040
iOS_11_tableViewCell使用alertView变更数据
iOS下JS与原生OC互相调用(总结)
iOS开发免不了要与UIWebView打交道,然后就要涉及到JS与原生OC交互,今天总结一下JS与原生OC交互的两种方式。
Haley_Wong
2018/08/22
5K0
iOS 闹钟功能实现+本地通知+音频播放
问题描述:通过picker设置时间,到了设定好的时间 闹钟响起,并弹出提示框,点击确定,停止播放音频。如果设置好了闹钟,没有停在该页面,而是返回了手机主屏幕或是手机锁屏,当到了闹钟设定的时间,会弹出消息通知。(如果设定的时间是已经过去的时间,页面不会有响应,直到设置正确的时间为止.)
好派笔记
2021/10/29
1.5K0
ios开发基础知识 - 1
输出 command+shift+r NSLog(@"log: %@ ", myString);  NSLog(@"log: %f ", myFloat);  NSLog(@"log: %i ", myInt); 显示图片 CGRect myImageRect = CGRectMake(0.0f, 0.0f, 320.0f, 100.0f); UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect]; [myImage
用户1172164
2018/01/16
6390
iOS微信支付简单的使用
APP微信商户申请APPID步骤地址 微信支付 SDK与 Demo地址下载 微信SDK与 Demo 把微信支付 SDK 拖到工程上 SDK 添加微信支付依赖库
LeeCen
2018/10/11
9880
iOS微信支付简单的使用
iOS微信之简单文本分享(ShareSDK)
参考博文: http://www.jianshu.com/p/839dc30f2250 http://www.jianshu.com/p/c9b688fdb961
专注APP开发
2019/11/07
8360
iOS微信之简单文本分享(ShareSDK)
实现iOS图片等资源文件的热更新化(四): 一个最小化的补丁更新逻辑
ios122
2018/01/02
1.1K0
实现iOS图片等资源文件的热更新化(四): 一个最小化的补丁更新逻辑
iOS UIAlertView 的基本使用方法
来源:https://www.oschina.net/question/54100_36098
静静的晨光
2020/06/04
1.7K0
iOS简易蓝牙对战五子棋游戏设计思路之一——核心蓝牙通讯类的设计
    本系列博客将系统的介绍一款蓝牙对战五子棋的开发思路与过程,其中的核心部分有两个,一部分是蓝牙通讯中对战双方信息交互框架的设计与开发,一部分是五子棋游戏中棋盘逻辑与胜负判定的算法实现。本篇博客将介绍游戏中蓝牙通讯类的设计思路
珲少
2018/08/15
1.2K0
iOS网络请求之上传图片:从示例到源码解析 -- 以上传Face++SDK回调的图片为例(HYNetworking,AFNetworking,XMNetworking)
本文一开始上传图片以调用HYNetworking的API为例,这个网络框架是以AFNetworking为基础进行的封装。HYNetworking内部实现上传图片的时候,其实就是采用AFNetworking关于上传图片的API,都是AFNetworking里面一个API。后面再讲XMNetworking上传图片请求的操作方法,它也是基于AFNetworking上传进行的封装,不过比HYNetworking更加隐晦而已。
陈满iOS
2018/09/10
2.2K0
iOS网络请求之上传图片:从示例到源码解析 -- 以上传Face++SDK回调的图片为例(HYNetworking,AFNetworking,XMNetworking)
iOS·长按保存图片到相册:系统原生UIActionSheet与UIAlertView,UIAlertController等方案
场景: 在一个VC中,为一个UICollectionViewCell中的图片添加长按图片保存的事件。 长按保存图片 前提:infoPlist中添加相应权限:Privacy - Photo Libr
陈满iOS
2018/09/10
1.8K0
iOS·长按保存图片到相册:系统原生UIActionSheet与UIAlertView,UIAlertController等方案
iOS微信之登录授权(集成官方SDK)
前期准备工作:可以参考这篇博文http://www.jianshu.com/p/839dc30f2250 iOS版本只需要提供Bundle Id即可
专注APP开发
2019/11/07
2.8K0
iOS微信之登录授权(集成官方SDK)
Url Scheme实现APP间通信、分享
接下来就以我之前写的UIActivityViewController系统原生分享-仿简书分享和iOS开源小项目-WSL两个Demo为例,让我们看下怎么可以让UIActivityViewController系统原生分享-仿简书分享唤起iOS开源小项目-WSL并进行通信、分享:也就是说让 WSL 像微信、QQ、新浪一样支持第三方社交分享。
且行且珍惜_iOS
2018/05/22
1.7K0
推荐阅读
相关推荐
iOS开发之诱导用户为自己的App评论功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验