• 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

  • 相关阅读:
    图形用户界面
    集合
    201671010136 泛型类总结
    异常、断言与日志
    [置顶]201671010131《面向对象程序设计课程学习进度条》
    [置顶]201671010131《面向对象程序设计课程学习进度条》
    201671010131《面向对象程序设计课程学习进度条》
    201671010131《面向对象程序设计课程学习进度条》
    201671010131《面向对象程序设计课程学习进度条》
    201671010131《面向对象程序设计课程学习进度条》
  • 原文地址:https://www.cnblogs.com/lisa090818/p/3964633.html
Copyright © 2020-2023  润新知