`
jiangmq100083
  • 浏览: 11486 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

IOS app进行自动更新(不用App Store)

    博客分类:
  • IOS
 
阅读更多

在APP没有登录到app store的前提下,如果app需要更新,如何通知用户呢?

 

实现思想:

app运行时,如果发现最新的版本号和现在app内的版本号不同时,在桌面的图标的右上角显示一个红色的圆圈1,蹦出一个提示框提示升级或者取消,点击提示升级时,应启动默认的浏览器跳转到能下载到最新版本app的页面。

 

实现流程:

1.在每一次程序开始运行的时候,都要进行一次版本对比。

2.对比的双方是,从app内部取得的版本号和从服务器端取得的需要安装的最新的版本号

3.客户端要有能取到最新版本号的接口(这里采用的方案是,在服务器端放一个.json的文件,里面只存最新的版本号)

 

实现代码:

//在appdelegate.m中的applicationDidBecomeActive方法里,填入以下代码

//appdelegate.m中的applicationDidBecomeActive方法会在每次程序激活时运行

- (void)applicationDidBecomeActive:(UIApplication *)application

 

{

    //UpdateManager是github上的一个开源插件,专门用来进行这种版本更新的操作

       //https://github.com/slmcmahon/UpdateManager

    UpdateManager *manager = [UpdateManagersharedManager];

    //设定服务器端用来取得最新app版本号的json文件(xxxx代表根据各个具体项目自己设置的文件夹名)

    [manager setVersionUrl:@"/xxxx/appVersion.json"];

    //提示用户有新版本后,跳转到下载页面的URL

    [manager setPListUrl:@"/xxx/xxxxxxx.html"];

    //进行版本号检测并更新

    [manager checkForUpdates];

}

 

//UpdateManager.h

//

//  UpdateManager.h

//  ReactiveLearning

//

//  Created by Stephen L. McMahon on 8/4/13.

//

//  implmementation: https://gist.github.com/slmcmahon/6152160

 

#import <Foundation/Foundation.h>

 

@interface UpdateManager : NSObject

@property (nonatomic, copy) NSString *pListUrl;

@property (nonatomic, copy) NSString *versionUrl;

@property (nonatomic, copy) NSString *currentServerVersion;

 

+ (UpdateManager *)sharedManager;

- (void)checkForUpdates;

- (void)performUpdate:(NSString *)pageUrl;

 

@end

 

//UpdateManager.m

//具体连接的地方,需要自己完善了

//

//  UpdateManager.m

//  ReactiveLearning

//

//  Created by Stephen L. McMahon on 8/4/13.

//

//  interface: https://gist.github.com/slmcmahon/6152156

 

static NSString *const kPreferenceAskUpdate = @"pref_ask_update";

 

#import "UpdateManager.h"

#import "AFNetworking.h"

#import "UIAlertView+Blocks.h"

#import "RIButtonItem.h"

#import "OMPromise.h"

#import "OMDeferred.h"

 

@implementation UpdateManager

 

+ (UpdateManager *)sharedManager {

    static UpdateManager *sharedManager = nil;

    if (!sharedManager)

    {

        sharedManager = [[super allocWithZone:nil] init];

    }

    return sharedManager;

}

 

+ (id)allocWithZone:(NSZone *)zone {

    return [selfsharedManager];

}

 

// This will return the version by combining both the version and build fields in

// the iOS Application Target found in the summary section of the current build target

- (NSString *)appVersion {

    NSDictionary *info = [[NSBundlemainBundle] infoDictionary];

    NSString *version = [info objectForKey:@"CFBundleShortVersionString"];

    NSString *build = [info objectForKey:@"CFBundleVersion"];

    if ([build isEqualToString:@""]) {

        return [NSString stringWithFormat:@"%@", version];

    } else {

        return [NSString stringWithFormat:@"%@.%@", version, build];

    }

}

 

- (BOOL)shouldAskForUpdate {

    NSUserDefaults *prefs = [NSUserDefaultsstandardUserDefaults];

    if ([prefs valueForKey:kPreferenceAskUpdate] == nil) {

        return YES;

    }

    return [prefs boolForKey:kPreferenceAskUpdate];

}

 

// this is exposed as a public method in case you would like to create another view, an App Update

// view perhaps, that explains that there is an update for the application and allow the user to

// manually update in case they opted NOT to when initially prompted.

- (void)disableAskUpdate {

    NSUserDefaults *prefs = [NSUserDefaultsstandardUserDefaults];

    [prefs setBool:NOforKey:kPreferenceAskUpdate];

    [prefs synchronize];

}

 

- (void)performUpdate:(NSString *)pageUrl {

    // in case there's a network issue or some other type of failure, we go

    // ahead and reset the preference so that the user will be prompted again

    // to update on future sessions.

    NSUserDefaults *prefs = [NSUserDefaultsstandardUserDefaults];

    [prefs setBool:YESforKey:kPreferenceAskUpdate];

    NSLog(@"%@", pageUrl);

    NSURL *url = [NSURL URLWithString:pageUrl];

    UIApplication *thisApp = [UIApplicationsharedApplication];

    // turn off the badge

    [thisApp setApplicationIconBadgeNumber:0];

    // launch Mobile Safari, which will immediately attempt to install the application

    // from the URL that was specified.

    [thisApp openURL:url];

}

 

- (void)checkForUpdates {

    NSURL *defaultSettingsFile = [[NSBundle mainBundle] URLForResource:@"DefaultSettings" withExtension:@"plist"];

    NSDictionary *defaultSettings = [NSDictionary dictionaryWithContentsOfURL:defaultSettingsFile];

    NSString *baseUrlString = [defaultSettings objectForKey:@"login_host_pref"];

    

    NSString *currentVersion = [self appVersion];

    

    OMPromise *chain = [self GET:_versionUrl parameters:nil baseUrl:baseUrlString];

    [chain fulfilled:^(id result) {

        NSLog(@"%@", result);

        UIApplication *thisApp = [UIApplicationsharedApplication];

        // assumes that the server will be responding with a JSON object containing at least:

        // { CurrentVersion: "1.2.3.4" }

        NSString *serverVersion = [result valueForKeyPath:@"CurrentVersion"];

        if ([self compareVersion:serverVersion toVersion:currentVersion] <= 0) {

            // make sure that we don't have a badge showing since there are no updates.

            [thisApp setApplicationIconBadgeNumber:0];

            _currentServerVersion = currentVersion;

            NSLog(@"The application is up to date.");

            return;

        }

        // we have determined that there is an update.  We are going to ask the user if they would like to

        // update immediately, but they may choose not to, so we will set a badge here to remind them later

        // that there are pending updates.

        [thisApp setApplicationIconBadgeNumber:1];

        _currentServerVersion = serverVersion;

        

        // if we have previously asked the user if they wanted to update and they refused, then we don't

        // want to continue to bother them about it.

        //if (![self shouldAskForUpdate]) {

        //NSLog(@"There is a new version, but the user has opted to update manually later.");

        //return;

        //}

        

        // this action will be performed if the user selects "OK" in the upcoming alert view.  If the

        // user selects "OK" then we will attempt to perform the update.

        RIButtonItem *okButton = [RIButtonItem itemWithLabel:@"アップデート" action:^{

            NSString *updatePageUrl = [baseUrlString stringByAppendingString:_pListUrl];

            [self performUpdate:updatePageUrl];

        }];

        

        // if the user cancels the update, then we will set a persistent preference value so that it

        // will not ask them on subsequent runs of the application.

        RIButtonItem *cancelButton = [RIButtonItem itemWithLabel:@"キャンセル" action:^{

            //[self disableAskUpdate];

        }];

        

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"XXXX からの通知(アップデート)"

                                                        message:@"新しいバージョンがあります。アップデートしますか?"

                                               cancelButtonItem:cancelButton

                                               otherButtonItems:okButton, nil];

        [alert show];

    }];

    [chain failed:^(NSError *error) {

        if (error) {

            NSLog(@"Update error: %@", [error localizedDescription]);

        }

        [self setCurrentServerVersion:currentVersion];

    }];

}

 

- (OMPromise*)GET:(NSString*)path parameters:(id)parameters baseUrl:(NSString*)baseUrl{

    OMDeferred *deferred = [OMDeferred deferred];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];

    manager.requestSerializer = [AFHTTPRequestSerializerserializer];

    manager.responseSerializer = [AFJSONResponseSerializerserializer];

    

    NSString *urlString = [baseUrl stringByAppendingString:path];

    DDLogVerbose(@"Connecting to %@", urlString);

    

    [manager GET:urlString  parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {

        [deferred fulfil:responseObject];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        [deferred fail:error];

    }];

    return deferred.promise;

}

 

// compares all of the bits in the version identifier starting from the left and

// returns as soon as it finds a difference.  same = 0, l > r = 1, r > l = -1

- (int)compareVersion:(NSString *)firstVersion toVersion:(NSString *)secondVersion {

    NSMutableArray *fvArray = [self splitVersionString:firstVersion];

    NSMutableArray *svArray = [self splitVersionString:secondVersion];

    

    while ([fvArray count] < [svArray count]) {

        [fvArray addObject:[NSNumber numberWithInt:0]];

    }

    while ([svArray count] < [fvArray count]) {

        [svArray addObject:[NSNumber numberWithInt:0]];

    }

    

    for (int i = 0; i < [fvArray count]; i++) {

        int a = [[fvArray objectAtIndex:i] intValue];

        int b = [[svArray objectAtIndex:i] intValue];

        

        if (a > b) {

            return 1;

        }

        

        if (b > a) {

            return -1;

        }

    }

    return 0;

}

 

- (NSMutableArray *)splitVersionString:(NSString *)version {

    return [NSMutableArrayarrayWithArray:[version componentsSeparatedByString:@"."]];

}

 

@end

 

//xxxx.json文件的内容

{
	"CurrentVersion": "3.0.1.0"
}
分享到:
评论

相关推荐

    苹果iOS app开发之更新升级app的办法.zip

    开发者应遵循App Store的规定,通过App Store本身的通知机制告知用户有可用的更新。 4. **APP版本更新的解决方法**: - **使用App Store Connect**:苹果推荐开发者通过App Store Connect管理应用的版本发布。当有...

    ios应用内跳转到AppStore或者iTunes

    在iOS开发中,有时我们需要引导用户在应用内部直接跳转到AppStore或iTunes来查看应用详情、进行评分和评论,或者购买相关的媒体内容。这个功能对于提高应用的可见度和用户参与度至关重要。以下是对这个主题的详细...

    unity与iOS交互进行App Store内购(IAP)

    本教程将详细介绍如何使用Unity与iOS系统进行交互,实现App Store内购功能。 一、Unity与iOS交互基础 在Unity中实现IAP,我们需要使用Unity的插件系统来引入Apple的StoreKit框架。StoreKit是iOS SDK的一部分,专门...

    iOS AppStore上架流程图文详解2021版 (下)

    iOS App Store 上架流程详解 iOS App Store 上架流程是 iOS 开发者发布应用程序到 App Store 的必要步骤。下面将详细介绍 iOS App Store 上架流程图文详解 2021 版。 一、填写 App Store 发布信息 在 Apple ...

    高仿iOS11 App Store列表效果

    在iOS应用开发中,创建与iOS 11 App Store类似的列表效果是一项常见的需求,它可以提升用户的体验感,使应用更具吸引力。本项目标题为“高仿iOS11 App Store列表效果”,其主要目的是通过编程技术实现类似App Store...

    iOSApp版本更新Demo

    首先,我们需要知道iOS中的版本更新通常有两种方式:通过App Store自动更新和在应用内部提示用户手动更新。自动更新是系统级别的设置,用户可以在设备的设置中开启或关闭。而应用内更新则需要开发者在代码中实现,...

    ios应用发布到appstore全部流程

    在App Store Connect上可以创建新版本,重复上述步骤进行更新提交。 这个过程可能看似复杂,但通过仔细阅读文档,理解每个步骤,你一定能够成功将你的iOS应用发布到App Store。记住,耐心和细心是关键,而不断的...

    iOS AppStore上架流程图文详解2021版 (上).doc

    iOS AppStore 上架流程图文详解 2021 版 本文档将详细介绍 iOS AppStore 上架流程的步骤和注意事项,以帮助开发者顺利地将 App 发布到 AppStore 上。 一、注册 Apple Developer 账号 要将 App 发布到 AppStore 上...

    iOS App Signer Mac

    总之,“iOS App Signer Mac”是一个针对Mac用户的工具,简化了iOS应用的签名流程,使得非开发者也能轻松地在自己的设备上安装和运行未经App Store审核的应用。这个工具涵盖了iOS开发中的关键概念,如代码签名、配置...

    IOS APP 自动提示更新

    利用苹果的appstore 提供的相关api进行查询更新,已经整合成一个类,导入工程即可以使用: //检测版本是否有更新 CheckVersionUpdate *checkversionupdate=[CheckVersionUpdate alloc]; [checkversionupdate ...

    iOS开发之一句代码检测App版本的更新

    `SKStoreReviewController`是苹果提供的一套接口,用于请求用户对App进行评价或查看App在App Store的详细信息,其中包括版本更新。不过,`SKStoreReviewController`并不直接提供检测版本更新的服务,所以我们需要...

    IOS APP发布流程

    至此,应用程序的基础信息已全部填写完毕,接下来需要通过Xcode进行构建,并使用TestFlight进行内部测试或公开Beta测试,最后将构建好的IPA文件上传至App Store Connect,完成最终的应用发布流程。 #### 四、总结 ...

    iOS App Signer.zip

    本文将深入探讨“iOS App Signer”这一工具,以及如何利用它来对IPA文件进行签名。 首先,我们需要理解什么是IPA文件。IPA是iOS应用程序的包格式,包含所有必要的文件,如二进制代码、资源、元数据等,用于在Apple...

    ios-无需添加信息,自动获取AppStore更新提示.zip

    无需设置appid,bundleid等信息,可自定义按钮标题,自动从appStore获取更新信息提示用户更新。考虑的比较全面了,如果有什么问题,欢迎在我博客下留言。 苹果方便其实是不会让你进行更新提示的,一方面这样会对...

    AppStore上传流程

    - 在上传过程中保持网络连接稳定,上传完成后,应用程序会自动提交到App Store进行审核。 二、上传过程中可能遇到的问题和解决方案: 1. 如何获取Certificates证书? - 需要前往苹果开发者网站的“Certificates,...

    ios APP電子書

    10. **App Store提交流程**:如何准备应用发布,遵循Apple的审查指南,以及App Store Connect的使用。 通过阅读并实践这本书中的示例,开发者不仅可以提升自己的iOS开发技能,还能了解到最佳实践和技巧,从而在实际...

    iOS 6 SDK在应用内展示App Store

    在iOS开发中,展示App Store是一项常见的功能,特别是在iOS 6时代,苹果引入了新的SDK,使得开发者可以更方便地在自己的应用内嵌入App Store的内容。本文将深入探讨如何利用iOS 6 SDK来实现在应用内展示App Store的...

    ios跳转appstore评论,判断是否评论

    "ios跳转appstore评论,判断是否评论"这个主题涉及到的是如何在iOS应用内部实现一个功能,该功能不仅能够直接链接到App Store以便用户撰写评论,而且还能智能地检测用户上次提交评论的时间,确保不会过于频繁地打扰...

    检测iOSApp版本更新

    在iOS应用开发中,定期检测并提示用户进行App版本更新是一项重要的功能,它能确保用户始终使用最新、最稳定、最安全的软件版本。本文将详细介绍如何在iOS中实现App版本检测以及设置强制更新策略。 首先,我们需要...

    ios-iOS解决隐私政策AppStore上架.zip

    iOS 隐私政策 SafariViewContoller 弹出隐私URL作为提醒,6月份App Store审核指南已更新,要求在应用审核流程中为所有新应用和应用更新制定隐私政策。从2018年10月3日开始,App Store Connect将要求所有新应用和应用...

Global site tag (gtag.js) - Google Analytics