app 检查更新和更新
第一种,手动检查
//
// Harpy.h
// Harpy
//
// Created by Arthur Ariel Sabintsev on 11/14/12.
// Copyright (c) 2012 Arthur Ariel Sabintsev. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Harpy : NSObject <UIAlertViewDelegate>
/*
Checks the installed version of your application against the version currently available on the iTunes store.
If a newer version exists in the AppStore, it prompts the user to update your app.
*/
+ (void)checkVersion;
@end
//
// Harpy.m
// Harpy
//
// Created by Arthur Ariel Sabintsev on 11/14/12.
// Copyright (c) 2012 Arthur Ariel Sabintsev. All rights reserved.
//
#define kHarpyCurrentVersion [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey]
@interface Harpy ()
+ (void)showAlertWithAppStoreVersion:(NSString*)appStoreVersion;
@end
@implementation Harpy
#pragma mark - Public Methods
+ (void)checkVersion
{
// Asynchronously query iTunes AppStore for publically available version
NSString *storeString = [NSString stringWithFormat:@"http://itunes.apple.com/lookup?id=%@", kHarpyAppID];
NSURL *storeURL = [NSURL URLWithString:storeString];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:storeURL];
[request setHTTPMethod:@"GET"];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if ( [data length] > 0 && !error ) { // Success
NSDictionary *appData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
dispatch_async(dispatch_get_main_queue(), ^{
// All versions that have been uploaded to the AppStore
NSArray *versionsInAppStore = [[appData valueForKey:@"results"] valueForKey:@"version"];
if ( ![versionsInAppStore count] ) { // No versions of app in AppStore
return;
} else {
NSString *currentAppStoreVersion = [versionsInAppStore objectAtIndex:0];
if ([kHarpyCurrentVersion compare:currentAppStoreVersion options:NSNumericSearch] == NSOrderedAscending) {
//[Harpy showAlertWithAppStoreVersion:currentAppStoreVersion];
[[NSNotificationCenter defaultCenter]postNotificationName:@"checkCurrentVersion" object:currentAppStoreVersion];
}
else {
// Current installed version is the newest public version or newer
[[NSNotificationCenter defaultCenter]postNotificationName:@"checkCurrentVersion" object:@""];
}
}
});
}
}];
}
#pragma mark - Private Methods
+ (void)showAlertWithAppStoreVersion:(NSString *)currentAppStoreVersion
{
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
if ( harpyForceUpdate ) { // Force user to update app
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:kHarpyAlertViewTitle
message:[NSString stringWithFormat:@"新版本 %@ 可用. 请更新至版本 %@ .", appName, currentAppStoreVersion]
delegate:self
cancelButtonTitle:kHarpyUpdateButtonTitle
otherButtonTitles:nil, nil];
[alertView show];
} else { // Allow user option to update next time user launches your app
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:kHarpyAlertViewTitle
message:[NSString stringWithFormat:@"新版本 %@ 可用. 请更新至版本 %@ .", appName, currentAppStoreVersion]
delegate:self
cancelButtonTitle:kHarpyCancelButtonTitle
otherButtonTitles:kHarpyUpdateButtonTitle, nil];
[alertView show];
}
}
#pragma mark - UIAlertViewDelegate Methods
+ (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if ( harpyForceUpdate ) {
NSString *iTunesString = [NSString stringWithFormat:@"https://itunes.apple.com/app/id%@", kHarpyAppID];
NSURL *iTunesURL = [NSURL URLWithString:iTunesString];
[[UIApplication sharedApplication] openURL:iTunesURL];
} else {
switch ( buttonIndex ) {
case 0:{ // Cancel / Not now
// Do nothing
} break;
case 1:{ // Update
NSString *iTunesString = [NSString stringWithFormat:@"https://itunes.apple.com/app/id%@", kHarpyAppID];
NSURL *iTunesURL = [NSURL URLWithString:iTunesString];
[[UIApplication sharedApplication] openURL:iTunesURL];
} break;
default:
break;
}
}
}
@end
//
// HarpyConstants.h
//
//
// Created by Arthur Ariel Sabintsev on 1/30/13.
//
//
/*
Option 1 (DEFAULT): NO gives user option to update during next session launch
Option 2: YES forces user to update app on launch
*/
static BOOL harpyForceUpdate = NO;
// 2. Your AppID (found in iTunes Connect)
#define kHarpyAppID @"807432039" //这里是已经发布的app id在itunes connect中可以查询到
// 3. Customize the alert title and action buttons
#define kHarpyAlertViewTitle @"有可用更新"
#define kHarpyCancelButtonTitle @"取消"
#define kHarpyUpdateButtonTitle @"更新"
//得到appid如果有新的版本就真正到页面去做更新
- (void)startUpdateVersion
{
NSString *iTunesString = [NSString stringWithFormat:@"https://itunes.apple.com/app/id%@", kHarpyAppID];
NSURL *iTunesURL = [NSURL URLWithString:iTunesString];
[[UIApplication sharedApplication] openURL:iTunesURL];
}
第二种自动在屏幕顶部的通知栏中提示有更新
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[AWVersionAgent sharedAgent] setDebug:YES];
[[AWVersionAgent sharedAgent] checkNewVersionForApp:kHarpyAppID];
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
[[AWVersionAgent sharedAgent] upgradeAppWithNotification:notification];
}
//
// AWVersionAgent.h
// AWVersionAgent
//
// Created by Heyward Fann on 1/31/13.
// Copyright (c) 2013 Appwill. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface AWVersionAgent : NSObject
+ (AWVersionAgent *)sharedAgent;
@property (nonatomic) BOOL debug;
- (void)checkNewVersionForApp:(NSString *)appid;
- (void)upgradeAppWithNotification:(UILocalNotification *)notification;
@end
//
// AWVersionAgent.m
// AWVersionAgent
//
// Created by Heyward Fann on 1/31/13.
// Copyright (c) 2013 Appwill. All rights reserved.
//
#import "AWVersionAgent.h"
#define kAppleLookupURLTemplate @"http://itunes.apple.com/lookup?id=%@"
#define kAppStoreURLTemplate @"itms-apps://itunes.apple.com/app/id%@"
#define kUpgradeAlertMessage @"新版本可用, 当前版本: %@, 新版本: %@. 现在从App Store即可更新至新版本."
#define kUpgradeAlertAction @"kUpgradeAlertAction"
#define kUpgradeAlertDelay 3
#define kAWVersionAgentLastNotificationDateKey @"lastNotificationDate"
#define kAWVersionAgentLastCheckVersionDateKey @"lastCheckVersionDate"
@interface AWVersionAgent ()
@property (nonatomic, copy) NSString *appid;
@property (nonatomic) BOOL newVersionAvailable;
@end
@implementation AWVersionAgent
+ (AWVersionAgent *)sharedAgent
{
static AWVersionAgent *sharedAgent = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedAgent = [[AWVersionAgent alloc] init];
});
return sharedAgent;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
- (id)init
{
self = [super init];
if (self) {
_newVersionAvailable = NO;
_debug = NO;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(showUpgradeNotification)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
}
return self;
}
- (void)checkNewVersionForApp:(NSString *)appid
{
self.appid = appid;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *url = [NSString stringWithFormat:kAppleLookupURLTemplate, _appid];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
if (data && [data length]>0) {
id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
if (obj && [obj isKindOfClass:[NSDictionary class]]) {
NSDictionary *dict = (NSDictionary *)obj;
NSArray *array = dict[@"results"];
if (array && [array count]>0) {
NSDictionary *app = array[0];
NSString *newVersion = app[@"version"];
[[NSUserDefaults standardUserDefaults] setObject:newVersion
forKey:@"kAppNewVersion"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSString *curVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
if (newVersion && curVersion && ![newVersion isEqualToString:curVersion]) {
self.newVersionAvailable = YES;
}
}
}
}
});
}
- (BOOL)conditionHasBeenMet
{
if (_debug) {
return YES;
}
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSTimeInterval last = [defaults doubleForKey:kAWVersionAgentLastNotificationDateKey];
NSTimeInterval now = [[NSDate date] timeIntervalSince1970];
if (last <= 0) {
[defaults setDouble:now forKey:kAWVersionAgentLastNotificationDateKey];
[defaults synchronize];
return NO;
}
if (now - last < 60*60*24) {
return NO;
}
return _newVersionAvailable;
}
- (void)showUpgradeNotification
{
if ([self conditionHasBeenMet]) {
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = [[NSDate date] dateByAddingTimeInterval:kUpgradeAlertDelay];
notification.timeZone = [NSTimeZone defaultTimeZone];
NSString *curVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
NSString *newVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"kAppNewVersion"];
NSString *msg = [NSString stringWithFormat:kUpgradeAlertMessage,
curVersion, newVersion];
notification.alertBody = msg;
notification.alertAction = kUpgradeAlertAction;
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
[[NSUserDefaults standardUserDefaults] setDouble:[[NSDate date] timeIntervalSince1970]
forKey:kAWVersionAgentLastNotificationDateKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
- (void)upgradeAppWithNotification:(UILocalNotification *)notification
{
if ([notification.alertAction isEqualToString:kUpgradeAlertAction]) {
[[UIApplication sharedApplication] cancelLocalNotification:notification];
NSString *url = [NSString stringWithFormat:kAppStoreURLTemplate, _appid];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
self.newVersionAvailable = NO;
}
}
@end
app 检查更新和更新的更多相关文章
- Bugly实现app全量更新
转 http://blog.csdn.net/qq_33689414/article/details/54911895Bugly实现app全量更新 Bugly官网文档 一.参数配置 在app下的gra ...
- Android实现App版本自动更新
现在很多的App中都会有一个检查版本的功能.例如斗鱼TV App的设置界面下: 当我们点击检查更新的时候,就会向服务器发起版本检测的请求.一般的处理方式是:服务器返回的App版本与当前手机安装的版本号 ...
- Cordova app 检查更新 ----JS进行调用(二)
原文:Cordova app 检查更新 ----JS进行调用(二) 1.获取版本号 需要添加 插件 cordova plugin add https://github.com/whiteoctober ...
- cordova APP 检查更新
原文:cordova APP 检查更新 //升级程序 .factory('UpdateService', function ($rootScope, $cordovaAppVersion, $cord ...
- Cordova app 检查更新 ----创建项目、添加插件、修改插件(一)
原文:Cordova app 检查更新 ----创建项目.添加插件.修改插件(一) 使用Cordova 进行跨平台应用程序的开发 1.创建Cordova项目 $ cordova create hell ...
- 如何实现已发布app的自动更新
要实现app的自动更新,做两件事情就可以搞定 1.获取当前手机中的app版本号 我们可以通过查询mainbundle中的获取CFBundleVersion NSDictionary *infoDict ...
- 创建APP检查更新页
本文来源及参考:Create a check for updates page for your app. 这篇文章解释了如何创建一个简单的检查更新页,检查该用户已安装的应用程序的最新版本. 简介 这 ...
- 最全APP安装/卸载/更新测试点
1.安装查看在安装过程中存在的提示信息是否明确,意思是否明确在安装过程中,点击取消按钮,能否正常退出安装程序,软件是否可用.安装时是否识别有SD卡,并默认安装到sd卡中安装过程中,接听电话或者短信,安 ...
- HBuilderX开发app实现自动更新版本
需求说明:使用MUI+Vue等技术并且通过HBuilderX打包开发移动app,在有版本更新时需要自动提示用户有新版本,并且可以点击下载自动安装. 思路说明: 应用打开时(使用Vue的生命周期mo ...
随机推荐
- 计蒜客 The 2018 ACM-ICPC Chinese Collegiate Programming Contest Rolling The Polygon
include <iostream> #include <cstdio> #include <cstring> #include <string> #i ...
- PAT Basic 1081
1081 检查密码 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也有数字. 输 ...
- BZOJ 3590: [Snoi2013]Quare
首先有一个性质,一个双联通图一定可以拆成一个小的双联通子图和一条链 一个点可以视为权值为0的双联通图或者一个点的链 状压DP,枚举子集 O(3^n*n^2) #include<cstdio> ...
- luogu2762 太空飞行计划问题
最大权闭合子图 参考这,胡伯涛论文. 10,8,6,3这个简单割对应的闭合子图是A1,B1,B2 输出路径时,最后一次层次图中,与源点相连的点即选做的实验,与汇点相连的点即选用的仪器. #includ ...
- luogu2754 星际转移问题
源向地球连 月球向汇连 每一天往下一天连 飞船上一天与这一天连 枚举答案 #include <iostream> #include <cstring> #include < ...
- webpack的像素转vw单位的loader插件
安装: npm i px2vw-view-loader 配置: 按以下loader格式,添加进入webpack配置文件,实现从px转换成vw,适用于移动端项目 module: { rules: [{ ...
- iOS学习笔记41-Swift(一)基础部分
一.Swift语言介绍 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题. Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种 ...
- 刷题总结——拆网线(noip模拟 贪心)
题目: 给定一颗树··在保证有k个点与其它点连接的情况下问最少保留多少条边···· 树的节点树n和k均小于100000: 题解: 很容易看出来我们要尽量保留那种一条边连两个节点的情况···· 然后考试 ...
- [CF888G] Xor-mst (Trie 树,最小生成树)
题目链接 Solution \(Trie\) 树 + 启发式合并. 考虑到是异或,于是按位贪心.让高位的尽量相同. 然后要计算每棵子树的代价,似乎并没有很好的方法?? 于是只能启发式合并. 对于每一个 ...
- 【CCF】无线网络 搜索
[思路] 多个起点同时四周扩展广搜,注意会爆int [AC] #include<iostream> #include<cstdio> #include<cstring&g ...