iOS,反正作为我,跟后端的火药味反正不轻
就集中在强制更新问题,话语就留在"为什么安卓可以实现,而iOS不可以?"的问题
image.png
我也百度了下强制更新的问题,其实大部分的解决办法,也只是说给用户一个提醒,让它去app商城去下,然后我每次提醒,如果没有下最新的版本,则每次都提醒它去下,如果不下载,点击取消操作,则这个软件就闪退,然后推送也是同理,只能做到如此,至于要做到在软件里更新的操作,我想到的就是"热更新"这个词,至于原生到底能不能行,我说不可以,找证据也没有意义,因为表情包就在上头,我也不想多做解释
目的就是在这里做标记,标记如何强制让用去商城下载的操作,只能这样子了
版本更新
#pragma mark -- 版本更新
-(void)updateVersion{
// 发送版本更新的请求
[FCNetWorkManager getVersionInfoCompletionHandle:^(PAVersionModel *responseObj, NSError *error) {
if (error) {
[self showErrorTipWith:error.description andStyle:SVProgressHUDStyleDark];
}else{
if (responseObj.success) {
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
// 当前应用软件版本 比如:1.0.1
NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
ZRLog(@"当前应用软件版本:%@",appCurVersion);
// 我用来测试这个方法行不行得通的一个暂行参数
// static NSString *version = @"1.5";
//根据每上传成功APPStroe 版本号+1判断是否最新
if ([responseObj.data.version.version containsString:appCurVersion]) {
// 这里是获取版本成功的情况
ZRLog(@"版本已经同步");
}else{
ZRLog(@"获取版本信息错误:%@", responseObj.message);
updateTipView *tipView = [updateTipView view];
tipView.frame = self.window.frame;
[self.window addSubview:tipView];
}
}
}
}];
}
#pragma mark -- updateTipView方法
+(instancetype)view{
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];
}
- (IBAction)talkLater:(UIButton *)sender {
//[self removeFromSuperview];
exit(0);
}
- (IBAction)nowUpdate:(id)sender {
NSURL *url = [NSURL URLWithString:@"你的软件在苹果商店的地址"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication]openURL:url];
[self removeFromSuperview];
}else{
[self showErrorTipWith:@"打不开,请稍后再试!" andStyle:SVProgressHUDStyleDark];
}
}
其中有些代码例如[self showerror]什么的,这是封装了SVProgress的组件的,你用什么都可以的
然后最后一步
#pramga mark -- appdelegate里的方法
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[self updateVersion];
}
推送提示
#pragma mark -- 判断是否接受通知 & 是不是第一次启动app
/**
* 设置远程推送
*/
-(void)setupRemoteNotificationWithViewController:(UIViewController *)vc isFirstLoad:(BOOL)firstLoad{
// 第一次进app,暂时不设置
if (firstLoad == YES) {
ZRLog(@"第一次启动,不做任何处理");
return;
}else{
BOOL isEnable = [AppDelegate isUserNotificationEnable];
if (isEnable == NO) {
ZRLog(@"还是没有允许推送");
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"关注慧居宝app获得更多更新的小区动态" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *notAllow = [UIAlertAction actionWithTitle:@"不允许" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
exit(0);
}];
UIAlertAction *allow = [UIAlertAction actionWithTitle:@"允许" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
// 跳转到页面去开通
UIApplication *application = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([application canOpenURL:url]) {
if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
[application openURL:url options:@{} completionHandler:nil];
} else {
[application openURL:url];
}
}
}];
[alert addAction:notAllow];
[alert addAction:allow];
[vc presentViewController:alert animated:YES completion:nil];
}else if (isEnable == YES){
ZRLog(@"允许推送,可以进入")
}
}
}
+ (BOOL)isUserNotificationEnable { // 判断用户是否允许接收通知
BOOL isEnable = NO;
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0f) { // iOS版本 >=8.0 处理逻辑
UIUserNotificationSettings *setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
isEnable = (UIUserNotificationTypeNone == setting.types) ? NO : YES;
} else { // iOS版本 <8.0 处理逻辑
UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
isEnable = (UIRemoteNotificationTypeNone == type) ? NO : YES;
}
return isEnable;
}
#define LAST_RUN_VERSION_KEY @"last_run_version_of_application"
/**
* 判断app是否第一次启动或者更新后第一次启动
*/
+ (BOOL) isFirstLoad{
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary]
objectForKey:@"CFBundleShortVersionString"];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *lastRunVersion = [defaults objectForKey:LAST_RUN_VERSION_KEY];
if (!lastRunVersion) {
[defaults setObject:currentVersion forKey:LAST_RUN_VERSION_KEY];
return YES;
}
else if (![lastRunVersion isEqualToString:currentVersion]) {
[defaults setObject:currentVersion forKey:LAST_RUN_VERSION_KEY];
return YES;
}
return NO;
}
布局好后,在appdelegate方法里
//登录成功后会缓存密码, 根据密码是否存在判断是进入登录界面还是 首页
//或者不是第一次进app
BOOL isFirstLoad = [AppDelegate isFirstLoad];
if ([GGKeyChainManager sharedInstance].password &&
!isFirstLoad) {
//用于判断从哪个控制器进入的应用 方便以后的退出登录跳转方式
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"isFromLoginVC"];
[self setupRemoteNotificationWithViewController:self.window.rootViewController isFirstLoad:isFirstLoad];
}else{
// 设置远程推送提示
[self setupRemoteNotificationWithViewController:self.window.rootViewController isFirstLoad:isFirstLoad];
}
网友评论