0

アップデートが拒否された後、Appleからクラッシュログを受け取りました。

クラッシュログを確認した後、日付の解析に関連する問題のあるコードを見つけました。

デバイスでこのアプリを実行しても、このエラーは発生しません。Appleがテストしているデバイスのローカルに問題があると感じています。

私の実行中に、original以下の文字列はに解決されました2012-12-04T11:02:29.5600000+0000。別のロケールにある場合、他にどのような方法で表示されるのか疑問に思っています。

さらに重要なことに、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];
4

2 に答える 2

1

+3と言うと、範囲外の例外が発生する可能性があります。[NSDate date]を使用すると、他のタイムゾーンでも同じ形式が返されることをテストしましたか?

いずれにせよ、少なくとも2つのことをチェックする必要があります。次に、メソッドの複数の日付タイプを解析して、アプリが引き続き機能することを確認します。

  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
       }
    }
    

上記は、誤った日付/タイムスタンプを表示する可能性のある問題を実際には解決しませんが、アプリケーションが文字列の長さの範囲外の範囲またはインデックスを検索しようとするのを防ぐ必要があります

お役に立てれば、

于 2012-12-04T11:46:28.830 に答える
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];
于 2012-12-04T11:49:43.390 に答える