无法重现App Store审核期间发生的崩溃[区域设置问题]

时间:2012-12-04 11:17:51

标签: objective-c ios local

在我的更新被拒绝后,我刚收到Apple的崩溃日志。

在查看崩溃日志后,我发现了违规代码,这与解析日期有关。

当我在我的设备上运行此应用程序时,我没有收到此错误。我感觉这是Apple正在测试的设备本地问题。

在我的投放期间,下面的original字符串已解析为2012-12-04T11:02:29.5600000+0000。我只是想知道如果在不同的Locale中它会出现的其他方式。

更重要的是,如何在与Apple相同的环境中测试我的应用,这样我就不需要等待审核流程进行测试

注意:我继承了这段代码,因此非常感谢有关改进日期解析功能的任何建议,谢谢。

崩溃来自以下函数中的[original substringToIndex:range.location+3]调用。

+(NSString*)convertDate:(NSDate*)date withFormatter:(NSDateFormatter*)dateFormatter{

    NSString *original = [dateFormatter stringFromDate:date];

    NSRange range = [original rangeOfString:@"+"];
    NSString *substring = [original substringToIndex:range.location+3];
    NSString *substring2 = [original substringFromIndex:range.location+3];

    return [NSString stringWithFormat:@"%@%@%@",substring,@":",substring2];
}

此功能的调用在以下上下文中进行

NSDate *timestamp = [NSDate date];
NSString *dateString = [DateHelper convertDate:timestamp withFormatter:UTCDateFormatter];

2 个答案:

答案 0 :(得分:1)

完全有可能说+3导致出现超出范围的异常。你测试过使用[NSDate date]会在其他时区返回相同的格式吗?

无论哪种方式,你应该至少检查两件事 - 然后解析方法多个日期类型以确认应用程序仍然可以运行:

  1. 以下行的范围包含位置:

    NSRange range = [original rangeOfString:@"+"];
    if (range.location != NSNotFound)
    {
        //do stuff here
    }
    
  2. 您放入的range.location + 3不超过总字符串长度

    NSRange range = [original rangeOfString:@"+"];
    if (range.location != NSNotFound)
    {
       if ((range.location + 3) <= original.length)
       {
           //you should also check that ((range.location + 3) + range.length) <= original.length as well
           //do stuff here
       }
    }
    
  3. 虽然上述内容并未真正解决可能显示错误日期/时间戳的问题 - 但它应该阻止应用程序尝试搜索字符串长度范围之外的范围或索引

    希望这有帮助,

答案 1 :(得分:0)

NSDateFormatter将使用您的设备日期格式和时区格式化您的日期。

// Convert the date to current time zone    
    NSDate* sourceDate = [NSDate date];

    NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
    NSTimeInterval interval = sourceGMTOffset - destinationGMTOffset;

    NSDate *destinationDateHere1 = [[NSDate alloc] initWithTimeInterval:interval sinceDate:yourDate];