How to check iOS version?

后端 未结 30 2482
一生所求
一生所求 2020-11-21 06:37

I want to check if the iOS version of the device is greater than 3.1.3 I tried things like:

[[UIDevice currentDevice].systemVersion         


        
30条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-21 07:04

    In general it's better to ask if an object can perform a given selector, rather than checking a version number to decide if it must be present.

    When this is not an option, you do need to be a bit careful here because [@"5.0" compare:@"5" options:NSNumericSearch] returns NSOrderedDescending which might well not be intended at all; I might expect NSOrderedSame here. This is at least a theoretical concern, one that is worth defending against in my opinion.

    Also worth considering is the possibility of a bad version input which can not reasonably be compared to. Apple supplies the three predefined constants NSOrderedAscending, NSOrderedSame and NSOrderedDescending but I can think of a use for some thing called NSOrderedUnordered in the event I can't compare two things and I want to return a value indicating this.

    What's more, it's not impossible that Apple will some day expand their three predefined constants to allow a variety of return values, making a comparison != NSOrderedAscending unwise.

    With this said, consider the following code.

    typedef enum {kSKOrderedNotOrdered = -2, kSKOrderedAscending = -1, kSKOrderedSame = 0, kSKOrderedDescending = 1} SKComparisonResult;
    
    @interface SKComparator : NSObject
    + (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo;
    @end
    
    @implementation SKComparator
    + (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo {
      if (!vOne || !vTwo || [vOne length] < 1 || [vTwo length] < 1 || [vOne rangeOfString:@".."].location != NSNotFound ||
        [vTwo rangeOfString:@".."].location != NSNotFound) {
        return SKOrderedNotOrdered;
      }
      NSCharacterSet *numericalCharSet = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];
      NSString *vOneTrimmed = [vOne stringByTrimmingCharactersInSet:numericalCharSet];
      NSString *vTwoTrimmed = [vTwo stringByTrimmingCharactersInSet:numericalCharSet];
      if ([vOneTrimmed length] > 0 || [vTwoTrimmed length] > 0) {
        return SKOrderedNotOrdered;
      }
      NSArray *vOneArray = [vOne componentsSeparatedByString:@"."];
      NSArray *vTwoArray = [vTwo componentsSeparatedByString:@"."];
      for (NSUInteger i = 0; i < MIN([vOneArray count], [vTwoArray count]); i++) {
        NSInteger vOneInt = [[vOneArray objectAtIndex:i] intValue];
        NSInteger vTwoInt = [[vTwoArray objectAtIndex:i] intValue];
        if (vOneInt > vTwoInt) {
          return kSKOrderedDescending;
        } else if (vOneInt < vTwoInt) {
          return kSKOrderedAscending;
        }
      }
      if ([vOneArray count] > [vTwoArray count]) {
        for (NSUInteger i = [vTwoArray count]; i < [vOneArray count]; i++) {
          if ([[vOneArray objectAtIndex:i] intValue] > 0) {
            return kSKOrderedDescending;
          }
        }
      } else if ([vOneArray count] < [vTwoArray count]) {
        for (NSUInteger i = [vOneArray count]; i < [vTwoArray count]; i++) {
          if ([[vTwoArray objectAtIndex:i] intValue] > 0) {
            return kSKOrderedAscending;
          }
        }
      }
      return kSKOrderedSame;
    }
    @end
    

提交回复
热议问题