1. 程式人生 > >iOS App版本更新

iOS App版本更新

版本更新的方式:

  1. 可選更新:彈框時有取消和更新兩個按鈕,使用者可以選擇取消按鈕(增加新的功能,改善使用者的體驗等,這種更新不會影響軟體的正常的使用)
  2. 強制更新:彈框時只有一個更新按鈕,使用者沒得選擇,必須更新(系統重大漏洞,嚴重影響使用者正常使用等必須強制使用者更新,不更新就不能使用該軟體)

解決方案:

方案一:

呼叫伺服器介面獲取App的版本號,如果伺服器的版本號大於當前App的版本號,那麼則彈框提示更新,否則就不提示

方案二:

獲取App Store 上的應用的版本號,如果App Store 上的版本號大於當前App的版本號,那麼則彈框提示更新,否則就不提示

兩種方案比較:

方式二是呼叫App Store對應的介面,由於App Store伺服器在外國,可能請求比較慢或者連線失敗,網路不穩定;再者這種方式不能確定該版本是否是強制更新型別的;還有該方式只能用於iOS, 這讓Android怎麼辦?這種方式唯一的優點就是可以App稽核通過後,使用者能在第一時間進行更新

方式一是呼叫自己應用的伺服器,網速穩定,比較靈活,可以在介面中任意定義欄位如最新版本號、是否強制更新isForceUpdate 等引數;因App Store 稽核需要2-3天時間,不能及時知道什麼時候稽核通過,可能會出現稽核通過了,開發人員還不知道,這段時間獲取應用的版本資訊介面可能版本號還是老的,這段時間還不能更新,沒有達到第一時間就能更新的效果

方法一:獲取自己伺服器版本號檢查
1. 通過網路請求獲取伺服器上的版本號;
2. 獲取當前應用版本號;
3. 將版本號轉換為整形進行比較;
4. 如果有版本更新則跳轉到app store上下載。

方法二:獲取app store上架版本號檢查
1. 通過網路同步請求獲取app store上對應APP ID的應用資訊;
2. 提取資訊上的最新版本號和下載地址;
3. 獲取當前應用版本號;
4. 將版本號轉換成雙精度型進行比較;
5. 對於有兩個點的版本號的最後一個點不處理。

iTunes Search API 查詢應用程式資訊,包括作者,版本,app 介紹頁面地址等資訊
iTunes Search API

App有兩個版本號,一個是Version,另一個是Build,對應於Info.plist的欄位名分別為CFBundleShortVersionString,CFBundleVersion。 AppSotre預設取的是Version即CFBundleShortVersionString

方式二程式碼示例:

#import "AppDelegate.h"
#import <AFNetworking.h>
@interface AppDelegate () <UIAlertViewDelegate>

@property (strong, nonatomic) NSString *trackViewUrl;
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    NSString *APPID = @"123456789";
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:@"https://itunes.apple.com/lookup" parameters:@{@"id": APPID} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary *  _Nullable responseObject) {
/*
results:[
          {
                trackViewUrl = "https://itunes.apple.com/us/app/xxx/id123456789?mt=8&uo=4";
                version = "1.7.4"
          }
]*/
        NSLog(@"%@", responseObject);
        NSArray *results = responseObject[@"results"];
        NSString *version = [[results objectAtIndex:0] objectForKey:@"version"];
        self.trackViewUrl = [[results objectAtIndex:0] objectForKey:@"trackViewUrl"];

        NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
        float shortVersion = [infoDict[@"CFBundleShortVersionString"] floatValue];

        if ([version floatValue] > shortVersion) {
            NSString * title = [NSString stringWithFormat:@"檢查更新:  %@", @"應用名稱"];
            NSString * message = [NSString stringWithFormat:@"發現新版本(%@), 是否升級 ?", version];

            UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"升級", nil];
            [alertView show];
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

    }];


    self.window.rootViewController = [[UIViewController alloc] init];
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        NSURL *trackViewUrl = [NSURL URLWithString:self.trackViewUrl];
        UIApplication *application = [UIApplication sharedApplication];
        if ([application canOpenURL:trackViewUrl]) {
            [application openURL:trackViewUrl];
        }
    }
}

方式一的程式碼和方式二差不多,只不過是請求自己應用的伺服器介面,然後解析

第三方實現

第三方實現的思路一般都是上面的思路,只不過對上述程式碼進行封裝了,比如如果將appId作為引數或者直接獲取應用的bundleId,對於UIAlertView的title,message,buttonTitle作為引數提取出來,提供更簡潔的方法來使用。

實現邏輯是根據Bundle Identifier 去查詢應用資訊的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   ATAppUpdater *updater = [ATAppUpdater sharedUpdater];
   updater.alertTitle = @"版本升級";
   updater.alertMessage = @"最新版本位為:%@  ";
   updater.alertCancelButtonTitle = @"暫不更新";
   updater.alertUpdateButtonTitle = @"馬上更新";
   [updater showUpdateWithConfirmation];

   return YES;
}