在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" }
相关推荐
开发者应遵循App Store的规定,通过App Store本身的通知机制告知用户有可用的更新。 4. **APP版本更新的解决方法**: - **使用App Store Connect**:苹果推荐开发者通过App Store Connect管理应用的版本发布。当有...
在iOS开发中,有时我们需要引导用户在应用内部直接跳转到AppStore或iTunes来查看应用详情、进行评分和评论,或者购买相关的媒体内容。这个功能对于提高应用的可见度和用户参与度至关重要。以下是对这个主题的详细...
本教程将详细介绍如何使用Unity与iOS系统进行交互,实现App Store内购功能。 一、Unity与iOS交互基础 在Unity中实现IAP,我们需要使用Unity的插件系统来引入Apple的StoreKit框架。StoreKit是iOS SDK的一部分,专门...
iOS App Store 上架流程详解 iOS App Store 上架流程是 iOS 开发者发布应用程序到 App Store 的必要步骤。下面将详细介绍 iOS App Store 上架流程图文详解 2021 版。 一、填写 App Store 发布信息 在 Apple ...
在iOS应用开发中,创建与iOS 11 App Store类似的列表效果是一项常见的需求,它可以提升用户的体验感,使应用更具吸引力。本项目标题为“高仿iOS11 App Store列表效果”,其主要目的是通过编程技术实现类似App Store...
首先,我们需要知道iOS中的版本更新通常有两种方式:通过App Store自动更新和在应用内部提示用户手动更新。自动更新是系统级别的设置,用户可以在设备的设置中开启或关闭。而应用内更新则需要开发者在代码中实现,...
在App Store Connect上可以创建新版本,重复上述步骤进行更新提交。 这个过程可能看似复杂,但通过仔细阅读文档,理解每个步骤,你一定能够成功将你的iOS应用发布到App Store。记住,耐心和细心是关键,而不断的...
iOS AppStore 上架流程图文详解 2021 版 本文档将详细介绍 iOS AppStore 上架流程的步骤和注意事项,以帮助开发者顺利地将 App 发布到 AppStore 上。 一、注册 Apple Developer 账号 要将 App 发布到 AppStore 上...
总之,“iOS App Signer Mac”是一个针对Mac用户的工具,简化了iOS应用的签名流程,使得非开发者也能轻松地在自己的设备上安装和运行未经App Store审核的应用。这个工具涵盖了iOS开发中的关键概念,如代码签名、配置...
利用苹果的appstore 提供的相关api进行查询更新,已经整合成一个类,导入工程即可以使用: //检测版本是否有更新 CheckVersionUpdate *checkversionupdate=[CheckVersionUpdate alloc]; [checkversionupdate ...
`SKStoreReviewController`是苹果提供的一套接口,用于请求用户对App进行评价或查看App在App Store的详细信息,其中包括版本更新。不过,`SKStoreReviewController`并不直接提供检测版本更新的服务,所以我们需要...
至此,应用程序的基础信息已全部填写完毕,接下来需要通过Xcode进行构建,并使用TestFlight进行内部测试或公开Beta测试,最后将构建好的IPA文件上传至App Store Connect,完成最终的应用发布流程。 #### 四、总结 ...
本文将深入探讨“iOS App Signer”这一工具,以及如何利用它来对IPA文件进行签名。 首先,我们需要理解什么是IPA文件。IPA是iOS应用程序的包格式,包含所有必要的文件,如二进制代码、资源、元数据等,用于在Apple...
无需设置appid,bundleid等信息,可自定义按钮标题,自动从appStore获取更新信息提示用户更新。考虑的比较全面了,如果有什么问题,欢迎在我博客下留言。 苹果方便其实是不会让你进行更新提示的,一方面这样会对...
- 在上传过程中保持网络连接稳定,上传完成后,应用程序会自动提交到App Store进行审核。 二、上传过程中可能遇到的问题和解决方案: 1. 如何获取Certificates证书? - 需要前往苹果开发者网站的“Certificates,...
10. **App Store提交流程**:如何准备应用发布,遵循Apple的审查指南,以及App Store Connect的使用。 通过阅读并实践这本书中的示例,开发者不仅可以提升自己的iOS开发技能,还能了解到最佳实践和技巧,从而在实际...
在iOS开发中,展示App Store是一项常见的功能,特别是在iOS 6时代,苹果引入了新的SDK,使得开发者可以更方便地在自己的应用内嵌入App Store的内容。本文将深入探讨如何利用iOS 6 SDK来实现在应用内展示App Store的...
"ios跳转appstore评论,判断是否评论"这个主题涉及到的是如何在iOS应用内部实现一个功能,该功能不仅能够直接链接到App Store以便用户撰写评论,而且还能智能地检测用户上次提交评论的时间,确保不会过于频繁地打扰...
在iOS应用开发中,定期检测并提示用户进行App版本更新是一项重要的功能,它能确保用户始终使用最新、最稳定、最安全的软件版本。本文将详细介绍如何在iOS中实现App版本检测以及设置强制更新策略。 首先,我们需要...
iOS 隐私政策 SafariViewContoller 弹出隐私URL作为提醒,6月份App Store审核指南已更新,要求在应用审核流程中为所有新应用和应用更新制定隐私政策。从2018年10月3日开始,App Store Connect将要求所有新应用和应用...