2018-01-29 16:29:24 zanjiaowei 阅读数 66999

最近有人提出问题,说IOS7怎么在APP store中下载软件,好多软件都提示需要ios8及以上才可以下载,而App Store里下载又不会提供给你旧版本,难倒ios7就必须升级才能下载吗?对此本人在网上查了好多资料也做了好多测试,大多数说的都是升级系统(这纯属废话,要是升级系统还用问你啊),终于皇天不负有心人,经过多次测试,我找到了一个解决办法,其实真的是非常简单,废话也不多说了,方法就是,把你的AppleId的用户名及密码让你的亲朋好友用他的苹果手机或者iPad登录(当然他的设备必须是高版本的)后先下载到他的设备上,这样你的AppleId就会记录下你的购买记录,接下来你就可以拿自己的低版本设备,用下载过该应用的AppleId登录,然后进入App Store 点击  最后一个栏目“更新”,在那里会显示当前AppleId下载过的应用,然后你点击你要下载的那个就可以了,当然也回提示当前应用版本需要IOS8及以上之类的,但是下面还有说   是否获取旧版本,这样就可以下载你当前设备可以下载的版本了。

结束语:看完小编的文章是不是觉的很啰嗦啊,这么简单的事非要说这么麻烦,小编在这里表示也很无奈啊,文笔不行,又怕大家不理解,所以只能多啰嗦了,另外方法是不是很简单?如果解决了您的问题,麻烦给点个赞哦,谢谢!


2017-07-12 14:46:57 lfl18326162160 阅读数 2753

//获取手机程序的版本号

    NSString *ver = [[[NSBundle mainBundle]infoDictionary] objectForKey:@"CFBundleShortVersionString"];

//获取网络该应用的版本号

    AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

    [mgr.responseSerializer setAcceptableContentTypes: [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil]];

    //POST必须上传的字段

    [mgr POST:@"https://itunes.apple.com/lookup?id=应用id" parameters:nil progress:^(NSProgress * _Nonnull uploadProgress) {

        

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {


        NSArray *array = responseObject[@"results"];

        if (array.count != 0) {// 先判断返回的数据是否为空

            NSDictionary *dict = [array lastObject];

//版本号的比较

            NSString * str1 = dict[@"version"];

            NSString * str2 = ver;

            if ([str1 compare:str2 options:NSCaseInsensitiveSearch]>0


{

               

                UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"发现新版本,立即去下载!" preferredStyle:UIAlertControllerStyleAlert];

                UIAlertAction *confirm = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

                    

                  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/us/app/v-kuai-di/id应用id?l=zh&ls=1&mt=8"]];

                }];

                [alertController addAction:confirm];

                [self.window.rootViewController presentViewController:alertController animated:YES completion:nil];

            }

        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        

    }];

2017-02-14 09:58:03 qq_31186665 阅读数 6587

需求来源:

在APP迭代更新过程中,有这样的需求,需要比较版本号的大小,然后弹出提示框提示更新.

之前版本号一直是中规中矩的按照1.1.0 --> 1.1.2这种数字变化方式.采用的方法是:将版本号字符串中的.号删除掉之后,比较两个数字的大小,后来发现在App Store中,各种APP的版本号数字变化的格式千奇百怪,1.0.11-->1.1.0,如果还采用上面的方法比较版本号,就不对了1011(本地version)肯定是大于110(线上版本),而实际上1.1.0是1.0.11的下一个版本.


解决方法:

版本号是分成三个模块来命名的,所以比较大小还是将三个部分剖开来比较大小兼容性强一些,万一遇到版本号命名没有按照规定的格式来,到时候大小就判断错了.

思路是这样的:三个部分,从第一个部分开始比较大小,优先级:第一部分>第二部分>第三部分,一旦分出大小就代表比较结束了,只要前面一部分大,无论后面一部分怎么小都没关系.

 NSString *localVerson=[GlobalFuction appVerson];//获取本地版本号

//将版本号按照.切割后存入数组中

    NSArray *localArray = [localVerson componentsSeparatedByString:@"."];

    NSArray *appArray = [versonAPP componentsSeparatedByString:@"."];

    NSInteger minArrayLength = MIN(localArray.count, appArray.count);

    BOOL needUpdate = NO;

    

    for(int i=0;i<minArrayLength;i++){//以最短的数组长度为遍历次数,防止数组越界

    

        //取出每个部分的字符串值,比较数值大小

        NSString *localElement = localArray[i];

        NSString *appElement = appArray[i];

        


   

         NSInteger  localValue =  localElement.integerValue;

         

         

         NSInteger  appValue = appElement.integerValue;


        if(localValue<appValue) {

        //从前往后比较数字大小,一旦分出大小,跳出循环

            needUpdate = YES;

            break;

        }else{

        

            needUpdate = NO;

        }

    

    }

    

    

    if (needUpdate) {

        

        

       //弹出提示更新弹框

        

        

    }



2015-12-26 11:14:05 cj772728583 阅读数 2568
刚接触ios开发的童鞋应该会对于app版本号吗有些疑问,因为target不仅仅在summary中有版本号,同样在Info.plist等地方也有版本号码的地方,一头乱码,不知吗?其实xcode在summary中已经将app最基本的设置进行了全面的封装,其余的plist,build setting等地方会跟着summary设置的改变而改变。


Bundle display name     app名字   在plist 中加一个  字符串



一个version,一个build,都是设置版本的地方,有什么区别呢? 

在ios中(Android等工程中也一样),有两种version,一种是 CFBundleVersion ("Bundle Version"),也就是我们看到的version,另一种是CFBundleShortVersionString ("Bundle version string, short"),也就是我们看到的Build。

普通情况下,我们只使用version即可,设置为"1.0", "1.1", "2.0" , etc,但如果你要使用两个版本号时候,需要将build设置为1,2,3...等递增的整数,有什么用呢? 

version我们可以通过App Store、itunes或其它软件看到,是给用户看的,而build是我们在团队开发中内部只用的,只有我们自己可以看到。比如团队打算发布1.0版本的时候,会发布很多build版本供测试或QA团队进行测试,你发布了很多build,因为一直在修改着代码,因此当你收到一条bug信息时候,你怎么知道是那个build引起的问题呢,这时候build版本号的有点就可以体现出来了,不是吗。 

我这里有一段代码,可以在xcode编译时候自动增加build号码。 

先把 Info.plist 里的版本号改成某个数字,然后 Targets → your target → Build Phases → Run Script 的地方加上: 

[cpp]  view plain copy print ?
  1. version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PRODUCT_SETTINGS_PATH`  
  2. version=`expr $version + 1`  
  3. /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $version" $PRODUCT_SETTINGS_PATH  
  4. #/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $version" $PRODUCT_SETTINGS_PATH 这行代码会让version也自增,一般不需要  

 

2016-09-26 15:50:55 vbirdbest 阅读数 2270

版本更新的方式:

  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 Store中的应用信息接口
方式一:通过APPId查询: https://itunes.apple.com/lookup?id=xxx
方式二:通过bundleId查询: http://itunes.apple.com/lookup?bundleId=xxx

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作为参数提取出来,提供更简洁的方法来使用。

https://github.com/emotality/ATAppUpdate 只需要一行代码就能集成版本更新

实现逻辑是根据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;
}

友盟第三方实现:https://github.com/kkme/CheckUpdateiOS

iOS 设置App的名称

阅读数 12270