//
// AppDelegate.m
// PreAutoUpdateDemo
//
// Created by mac on 15/12/18.
// Copyright © 2015年 mac. All rights reserved.
// #import "AppDelegate.h" #define USER_KEY @"1234321344SDFDFBVVFGDSVF" // 根据实际情况替换为自己的user_key @interface AppDelegate () <UIAlertViewDelegate> /** pre app_key */
@property(nonatomic,copy)NSString *app_key;
/** package_key */
@property(nonatomic,copy)NSString *package_key;
/** last_version */
@property(nonatomic,copy)NSString *last_version;
/** isNewVirson 是否有新版本需要更新 */
@property(nonatomic,assign)BOOL isNewVersion;
@end @implementation AppDelegate
/*
实现程序启动就能动态检测是否有更新需要在application:(UIApplication *)application didFinishLaunchingWithOptions:方法里
1.首先调用viewUploadApps方法获取app_key
2.然后调用getAllVersions方法获取package_key
3.再调用getAppDetailInfo获取last_version
4.最后调用compareVersions方法比较版本号
5.如果版本号不同那么就调用updateApp方法更新喽 备注:不懂加QQ:1838886973
*/ # pragma mark - pre自动更新
// 获取app_key
- (void)viewUploadApps
{
// POST-http://pre.im/api/v1/app/myapps
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://pre.im/api/v1/app/myapps"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = [@"user_key=cedf0edc71e463628af1ee9c4b3bb84b" dataUsingEncoding:NSUTF8StringEncoding]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!data) {
return;
}
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
self.app_key = [dict[@"data"][@"list"] firstObject][@"app_key"]; dispatch_async(dispatch_get_main_queue(), ^{ [self getAllVersions]; });
}]; [task resume];
}
// 获取package_key
- (void)getAllVersions
{
// POST-http://pre.im/api/v1/app/builds
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://pre.im/api/v1/app/builds"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
NSString *parms = [NSString stringWithFormat:@"user_key=%@&app_key=%@&page=%d",USER_KEY,self.app_key,];
request.HTTPBody = [parms dataUsingEncoding:NSUTF8StringEncoding]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!data) {
return;
} NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
self.package_key = [dict[@"data"][@"list"] firstObject][@"package_key"]; dispatch_async(dispatch_get_main_queue(), ^{ [self getAppDetailInfo]; }); }]; [task resume];
}
// 获取last_version
- (void)getAppDetailInfo
{
// POST-http://pre.im/api/v1/app/view
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://pre.im/api/v1/app/view"]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
request.HTTPMethod = @"POST"; NSString *parms = [NSString stringWithFormat:@"user_key=%@&app_key=%@&package_key=%@",USER_KEY,self.app_key,self.package_key]; request.HTTPBody = [parms dataUsingEncoding:NSUTF8StringEncoding]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!data) {
return;
} NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
self.last_version = dict[@"data"][@"last_version"]; dispatch_async(dispatch_get_main_queue(), ^{ [self compareVersions]; });
}];
[task resume]; }
// 比较版本号
- (void)compareVersions
{
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
// app当前版本
NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; if (app_Version.floatValue < self.last_version.floatValue) { // 注意了,这里只能比较2.1、2.2这种版本号,不能比较2.1.1这种三段式版本。如果想比较三段式版本,可以把if的判断条件改为比较字符串是否相同
self.isNewVersion = YES;
// 更新
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"App更新" message:@"有最新版本更新哦~" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"更新", nil];
[alertView show];
});
} else {
self.isNewVersion = NO;
}
}
//更新APP
- (void)updateApp
{
// GET-http://pre.im/api/v1/app/install
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://pre.im/api/v1/app/install?app_key=%@",self.app_key]]; NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!data) {
return;
}
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSString *urlStr = dict[@"data"];
NSURL *url = [NSURL URLWithString:urlStr]; BOOL isOpen = [[UIApplication sharedApplication] openURL:url];
NSLog(@"isOpen = %d url = %@",isOpen,dict[@"data"]); }];
[task resume];
} - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //pre更新
[self viewUploadApps];
return YES;
} #pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == && self.isNewVersion) { // 点击了确定就更新
[self updateApp];
}
}
@end

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

  1. 从C#到Objective-C,循序渐进学习苹果开发(5)--利用XCode来进行IOS的程序开发

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.前面几篇随笔主要介绍C#和O ...

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

    大众创新万众创业,在移动互联网的风口,移动APP开发与测试发展方兴未艾,受到了越来越多的重视.相较 iOS,Android 的开发环境更加开放.Android 开发者要测试应用时,只需发个 APK 安 ...

  3. 利用XCode来进行IOS的程序开发

    利用XCode来进行IOS的程序开发 本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换 ...

  4. nw.js桌面程序自动更新(node.js表白记)

    Hello Google Node.js 一个基于Google V8 的JavaScript引擎. 一个伟大的端至端语言,或许我对你的热爱源自于web这门极富情感的技术吧! 注: 光阴似水,人生若梦, ...

  5. Windows 程序自动更新方案: Squirrel.Windows

    Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...

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

    承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与 ...

  7. .Net桌面程序自动更新NAppUpdate

    自动更新介绍 我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能.应用程序自动更新是由客户端应用程序自身负责从一个已知服务器下载并安装更新,用户唯一需要进行干预的是决定是否愿意现在或以后 ...

  8. CS程序自动更新实现原理及代码(支持多版本多文件更新)

    公司主要项目为CS端,经常遇到客户需求变更及bug处理,在没有引用自动更新之前每次更新程序,必须手动对每个客户端进行更新,这样导致技术支持工作量特别大,也给客户不好的印象,因此我需要一个自动更新程序! ...

  9. Silverlight OOB 程序自动更新

    Silverlight OOB 程序 提供了非常方便的自动更新功能! 要让 Silverlight OOB 安装到客户端电脑后实现自动更新,必须实现以下两个条件: 一.为 程序的 xap  文件进行签 ...

随机推荐

  1. cookie操作(jquery的cookie插件源码)

    cookie : function (key, value, options) { var days, time, result, decode; // A key and value were gi ...

  2. mysql密码遗忘和登陆报错问题

    mysql登录密码忘记,其实解决办法很简单,只需要在mysql的主配置文件my.cnf里添加一行"跳过授权表"的参数选择即可! 在my.cnf中添加下面一行:[root@test- ...

  3. JS的递归与TCO尾调用优化

    转自:https://segmentfault.com/a/1190000004018047 这两天搜了下JS递归的相关文章, 觉得这篇文章很不错, 就顺手翻译了下,也算给自己做个笔记,题目是我自己加 ...

  4. VS2010/VS2013怎么复制项目/拷贝项目/克隆项目

    本文以vs2013为例,讲述了如何复制项目.vs2008,vs2010,vs2012等版本应操作类似 vs中的项目位于解决方案中,简单的复制粘贴是不能实现项目复制的 一.准备 原项目名称:test 目 ...

  5. Windows 8.1 新增控件之 CommandBar

    上一篇为大家介绍了AppBar 的相关内容,本篇继续介绍CommandBar 的使用方法.与AppBar 相比而言,CommandBar 在开发使用方面较为单一,在按键布局上分为主控区(Primary ...

  6. echo使用说明,参数详解

    简介 echo [OPTION]... [STRING]... 描述 -n 末尾不加换行 -e 开启输出字串中对反斜杠的转译 -E 禁用反斜杠转译 只有开启-e参数的时候,下面的命令才能起作用: \0 ...

  7. SQL基础之XML

    1.XML数据类型 在SQL Server中xml数据类型可以用来保存xml文档,这个文档即可以是完整的xml文档和xml片段,这样开发者就可以像使用int数据类型一样来使用xml数据类型.不过xml ...

  8. WebService的两种方式SOAP和REST比较 (转)

    我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...

  9. Crowdsourcing(众包)

    群众外包(英语:crowdsourcing)是互联网带来的新的生产组织形式.<连线>(Wired)杂志记者Jeff Howe于2006年发明的一个专业术语,用来描述一种新的商业模式,即企业 ...

  10. LaTeX常用数学符号表示方法

    转自:http://www.mohu.org/info/symbols/symbols.htm 常用数学符号的 LaTeX 表示方法 (以下内容主要摘自“一份不太简短的 LATEX2e 介绍”) 1. ...