1

My application is involves users saving data which I store using NSCoding/NSKeyedArchiver. I supply the user with sample data objects on the first run of the app.

The expected behavior happens during regular testing, as well as through ad hoc deployment. Unfortunately, a significant bug happens when the app is downloaded through the app store.

What other environmental considerations might there be so I can reproduce (and then fix) the issue in my regular testing?

Expected behavior:

A new user may add/edit data objects in addition to the current ones. (A classic CRUD scenario).

Actual behavior:

If the user's first action is to save a new object, all of the previously loaded sample objects disappear (the elusive bug). However, If the user's first action is to edit, then all of objects persist as expected, and the user can add additional ones without issue.

Thanks for the help.

EDIT

In my most recent testing, I switched the Build Configuration to release in the "Run " scheme.

http://i.imgur.com/XNyV6.png

App Delegate, which correctly initializes app

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    self.dataArray = nil;
    self.dataArray = [AppDelegate getArray];
    if (self.dataArray == nil) {
        self.dataArray = [[NSMutableArray alloc] init];
    }

    //First run of the app
    if (dataArray.count == 0) {
        //Add sample data to array
        //Save array
        NSString *path = [AppDelegate getDocPath];
        [NSKeyedArchiver archiveRootObject:self.dataArray toFile:path];
    }
}

+(NSString *) getDocPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0];
    NSString *tempDocPath = [documentsPath stringByAppendingPathComponent:@"FilePath.dat"];
    return tempDocPath; 
}

+(NSMutableArray *)getArray {
    return [[NSKeyedUnarchiver unarchiveObjectWithFile:[AppDelegate getDocPath]] mutableCopy];
}

Object creation, which deletes preloaded data if data hasn't been edited

-(void)viewDidLoad {
    tempArray = nil;
    tempArray = [NSKeyedUnarchiver unarchiveObjectWithFile:[AppDelegate getDocPath]];
    if (tempArray == nil) {
        tempArray = [[NSMutableArray alloc] init];  
    }   
}

-(void)saveObject {
    [tempArray addObject:createdData];
    [tempArray sortUsingSelector:@selector(compare:)];
    NSString *path = [AppDelegate getDocPath];
    [NSKeyedArchiver archiveRootObject:tempArray toFile:path];
    AppDelegate *dg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    dg.dataArray = tempArray;
}
4

2 に答える 2

2

(コードを見ずに)現在の問題を解決する方法がわかりませんが、将来それを回避する方法は次のとおりです。

アプリ ストアに提出するビルドは、QA 済みで、アプリ ストア プロビジョニング プロファイルで署名されたアドホック ビルドであることを確認してください。

2 つの利点: 1) アドホック ビルドとアプリストア ビルドで同じバグを再現できるはずです。2) 両方の dSym は同じです。そのため、AppStore のクラッシュ ログを取得するのを待つ必要はありません。

于 2012-08-30T15:47:14.710 に答える
1

新しいオブジェクトを保存している間、既存のデータに追加していないと思います。以前に作成したファイルを上書きしている可能性があります。以前のファイルにアクセスし、新しいデータを以前のファイルに追加する必要があります。コードを共有すると、どこが間違っているかを指摘するのに役立ちます。

編集:次のコードを置き換えて、同じ動作を示しているかどうかを確認します

-(void)viewDidLoad {
    tempArray = nil;
    tempArray = [NSKeyedUnarchiver unarchiveObjectWithFile:[AppDelegate getDocPath]mutableCopy];
    if (tempArray == nil) {
        NSLog(@"tempArray is nil"); //if tempArray doesn't get initialized by the file contents  
        tempArray = [[NSMutableArray alloc] init];

    }   
}
于 2012-08-30T15:46:54.363 に答える