利用pre平台实现iOS应用程序自动更新

  1 //
  2 //  AppDelegate.m
  3 //  PreAutoUpdateDemo
  4 //
  5 //  Created by mac on 15/12/18.
  6 //  Copyright © 2015年 mac. All rights reserved.
  7 //
  8
  9 #import "AppDelegate.h"
 10
 11 #define USER_KEY @"1234321344SDFDFBVVFGDSVF" // 根据实际情况替换为自己的user_key
 12
 13 @interface AppDelegate () <UIAlertViewDelegate>
 14
 15 /** pre app_key */
 16 @property(nonatomic,copy)NSString *app_key;
 17 /** package_key */
 18 @property(nonatomic,copy)NSString *package_key;
 19 /** last_version */
 20 @property(nonatomic,copy)NSString *last_version;
 21 /** isNewVirson 是否有新版本需要更新 */
 22 @property(nonatomic,assign)BOOL isNewVersion;
 23 @end
 24
 25 @implementation AppDelegate
 26 /*
 27  实现程序启动就能动态检测是否有更新需要在application:(UIApplication *)application didFinishLaunchingWithOptions:方法里
 28  1.首先调用viewUploadApps方法获取app_key
 29  2.然后调用getAllVersions方法获取package_key
 30  3.再调用getAppDetailInfo获取last_version
 31  4.最后调用compareVersions方法比较版本号
 32  5.如果版本号不同那么就调用updateApp方法更新喽
 33
 34 备注:不懂加QQ:1838886973
 35  */
 36
 37 # pragma mark - pre自动更新
 38 // 获取app_key
 39 - (void)viewUploadApps
 40 {
 41     // POST-http://pre.im/api/v1/app/myapps
 42     NSURLSession *session = [NSURLSession sharedSession];
 43     NSURL *url = [NSURL URLWithString:@"http://pre.im/api/v1/app/myapps"];
 44     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 45     request.HTTPMethod = @"POST";
 46     request.HTTPBody = [@"user_key=cedf0edc71e463628af1ee9c4b3bb84b" dataUsingEncoding:NSUTF8StringEncoding];
 47
 48     NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
 49         if (!data) {
 50             return;
 51         }
 52         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
 53         self.app_key = [dict[@"data"][@"list"] firstObject][@"app_key"];
 54
 55         dispatch_async(dispatch_get_main_queue(), ^{
 56
 57             [self getAllVersions];
 58
 59         });
 60     }];
 61
 62     [task resume];
 63 }
 64 // 获取package_key
 65 - (void)getAllVersions
 66 {
 67     // POST-http://pre.im/api/v1/app/builds
 68     NSURLSession *session = [NSURLSession sharedSession];
 69     NSURL *url = [NSURL URLWithString:@"http://pre.im/api/v1/app/builds"];
 70     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 71     request.HTTPMethod = @"POST";
 72     NSString *parms = [NSString stringWithFormat:@"user_key=%@&app_key=%@&page=%d",USER_KEY,self.app_key,1];
 73     request.HTTPBody = [parms dataUsingEncoding:NSUTF8StringEncoding];
 74
 75     NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
 76         if (!data) {
 77             return;
 78         }
 79
 80         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
 81         self.package_key = [dict[@"data"][@"list"] firstObject][@"package_key"];
 82
 83         dispatch_async(dispatch_get_main_queue(), ^{
 84
 85             [self getAppDetailInfo];
 86
 87         });
 88
 89     }];
 90
 91     [task resume];
 92 }
 93 // 获取last_version
 94 - (void)getAppDetailInfo
 95 {
 96     // POST-http://pre.im/api/v1/app/view
 97     NSURLSession *session = [NSURLSession sharedSession];
 98     NSURL *url = [NSURL URLWithString:@"http://pre.im/api/v1/app/view"];
 99
100
101     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
102     request.HTTPMethod = @"POST";
103
104     NSString *parms = [NSString stringWithFormat:@"user_key=%@&app_key=%@&package_key=%@",USER_KEY,self.app_key,self.package_key];
105
106     request.HTTPBody = [parms dataUsingEncoding:NSUTF8StringEncoding];
107
108     NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
109         if (!data) {
110             return;
111         }
112
113         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
114         self.last_version = dict[@"data"][@"last_version"];
115
116         dispatch_async(dispatch_get_main_queue(), ^{
117
118             [self compareVersions];
119
120         });
121     }];
122     [task resume];
123
124 }
125 // 比较版本号
126 - (void)compareVersions
127 {
128     NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
129     // app当前版本
130     NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
131
132     if (app_Version.floatValue < self.last_version.floatValue) { // 注意了,这里只能比较2.1、2.2这种版本号,不能比较2.1.1这种三段式版本。如果想比较三段式版本,可以把if的判断条件改为比较字符串是否相同
133         self.isNewVersion = YES;
134         // 更新
135         dispatch_async(dispatch_get_main_queue(), ^{
136             UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"App更新" message:@"有最新版本更新哦~" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"更新", nil];
137             [alertView show];
138         });
139     } else {
140         self.isNewVersion = NO;
141     }
142 }
143 //更新APP
144 - (void)updateApp
145 {
146     // GET-http://pre.im/api/v1/app/install
147     NSURLSession *session = [NSURLSession sharedSession];
148     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://pre.im/api/v1/app/install?app_key=%@",self.app_key]];
149
150     NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
151         if (!data) {
152             return;
153         }
154         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
155         NSString *urlStr = dict[@"data"];
156         NSURL *url = [NSURL URLWithString:urlStr];
157
158         BOOL isOpen = [[UIApplication sharedApplication] openURL:url];
159         NSLog(@"isOpen = %d url = %@",isOpen,dict[@"data"]);
160
161     }];
162     [task resume];
163 }
164
165
166 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
167
168     //pre更新
169     [self viewUploadApps];
170     return YES;
171 }
172
173 #pragma mark - UIAlertViewDelegate
174 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
175 {
176     if (buttonIndex == 1 && self.isNewVersion) { // 点击了确定就更新
177         [self updateApp];
178     }
179 }
180 @end
时间: 2024-10-13 18:19:05

利用pre平台实现iOS应用程序自动更新的相关文章

如何利用Pre.im分发iOS测试包

大众创新万众创业,在移动互联网的风口,移动APP开发与测试发展方兴未艾,受到了越来越多的重视.相较 iOS,Android 的开发环境更加开放.Android 开发者要测试应用时,只需发个 APK 安装包即可,但对于 iOS 来说,想要参与 App 测试却是件很复杂的事情. Apple在收购TestFlight后将其整合进iTunes Connect中,虽然能帮助iOS开发者邀请用户协助对 App 进行测试,但过程依旧复杂. 在这样的背景下,国内权威测试平台Testin推出了免费的APP内测分发

EF-使用迁移技术让程序自动更新数据库表结构

承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与之对应的表结构. 无论承不承认,都要使用到visual studio的"程序包管理器控制台"执行相关的命令. 1.使用"程序包管理器控制台" 工具>NuGet程序包管理器>程序包管理器控制台 这货的界面是这样子的: 选中默认项目为DAL,因为我们在DAL项目

如何让程序自动更新

如何让程序自动更新 自动更新的软件的目的在于让客户不在为了寻找最新软件花费时间.也不用去到开发商的网站上查找.客户端的软件自动会在程序启动前查找服务器上最新的版本.和自己当前软件的版本比较,如果服务器的是最新版本.客户端则进行自动下载.解压.安装.当然了下载是要有网络的,并且用户可以根据提示去完成操作.再也不用为找不到最新版本的软件而头疼.下面是我的大体思路,已经得到了实现: 1.  写一个webservice,提供一个获取服务器xml中版本的数据的方法.(也可用其他文件格式, 此处举例XML)

【Android】Android程序自动更新

App自动更新的步骤可分为三步: 检查更新(如果有更新进行第2步,否则返回) 下载新版的APK安装包 安装APK 下面对这三步进行解释,其中会穿插相应代码,App自动更新的这三步全部被封装到了一个单独的Updater类中,可以直接拿来使用,我会在文章最后贴出源码github地址. Updater 使用示例 通过单一的类Updater可以方便的实现自动检查更新.下载安装包和自动安装,可以监听下载进度,可以自定义更新提示等.保存路径可以自由书写,如果路径中某个目录不存在会自动创建,流式API接口易于

通用程序自动更新升级

1)服务端IIS网站上创建新的虚拟路径,给新创建的虚拟路径增加MIME类型:.bpl..ini等. 2)设置update.ini文件版本号配置文件 [ver]config.ini=1bplCommon.bpl=1bplGoods.bpl=1bplPower.bpl=1bplPurchasing.bpl=1prjMain.exe=2 3)客户端 untAutoUpdate.dfm文件: object frmAutoUpdate: TfrmAutoUpdate Left = 0 Top = 0 Ca

C#程序自动更新软件版本号

最近因为服务器程序管理多,所以在查看服务器程序的时候,只能通过EXE的编译时间来判断服务器程序版本时间,费神伤身啊 现在想了一个方式,在目录下新增一个version文件,里面写上年月日,并且只是在程序调试编译时才会更新version文件,以达到记录程序版本号的目的 1 if (Debugger.IsAttached)//判断是否调试编译,是的话则将当前年月日写入文件 2 { 3 using (FileStream file = new FileStream(Application.Startup

小程序自动更新版本

小程序迭代的比较快,每次发布了新的代码,都更新不及时,着急的时候,得删除了重新搜索才可以.觉得很麻烦,就查了一些方法. 代码如下: // 获取小程序更新机制兼容 if (wx.canIUse('getUpdateManager')) { const updateManager = wx.getUpdateManager() updateManager.onCheckForUpdate(function (res) { // 请求完新版本信息的回调 if (res.hasUpdate) { upd

PHP自动更新网站

目前软件开发主流越来越倾向于B/S模式,不同于C/S模式的软件,B/S模式下的WEB程序自动更新是个麻烦问题. 本人利用PHP下载远程文件和ZIP类,写了一个简单的自动更新DEMO,供大家参考. 服务端 目录结构 |data |--20140918.zip |--index.php 其中 data 文件夹用来存放补丁包,index.php 文件用来响应版本数据给客户端. index.php <?php sleep(3); header('Content-Type:application/json

转C#实现之(自动更新)http://www.cnblogs.com/yelanggu/p/9288149.html

做开发的人,尤其是做客户端(C/S)系统开发的人都会遇到一个头疼的问题,就是软件的自动更新:系统发布后怎样自动的更新程序,在下有幸开发过一个自动更新程序,更新程序与任何宿主程序是完全独立的:只要在主程序里面启动更新程序就行了:更新程序也是一个可执行文件,在启动的时候可以设置是否是自动更新和是否是手动更新,自动更新的意思就是说不需要人工的干预实现从远程服务器下载更新包,而如果是手动更新就会涉及到用户点击程序中的按钮实现更新:在自动更新与手动更新中可以根据项目的需要进行选择,有的程序必须要求用户进行