Мое приложение для iOS хорошо работает в симуляторе, но не работает на реальном устройстве?

Итак, мое первое приложение, которое я делаю, предназначено для устройств с джейлбрейком.

Я должен сказать, что это еще не закончено, но я считаю хорошей привычкой время от времени тестировать незавершенные приложения на реальном устройстве во время разработки приложения. Поскольку мое приложение предназначено для устройств с джейлбрейком, мне приходится фальшиво подписывать приложение и все такое.

Дело в том, что в моем приложении есть plist с двумя записями: bool для «hasBeenLaunchedBefore» и строка для «Password». Мое приложение изменяет TRUE на hasBeenLaunchedBefore, когда приложение завершает настройку, поэтому, когда приложение загружается, оно получает другое представление. Пароль прост: он хранит пароль для пользователя.

Я думаю, что мой файл plist не изменяется, когда я запускаю свое приложение на своем устройстве, потому что когда приложение никогда раньше не запускалось, вы получаете мастер настройки. Каждый раз, когда я закрываю приложение, я продолжаю получать мастер настройки, что означает, что hasBeenLaunchedBefore не изменяется на TRUE, как это должно быть. Кроме того, мои пароли НИКОГДА не совпадают, поэтому это означает, что пароль также не изменяется.

Все отлично работает в iOS Simulator, но не в моем iDevice. Может ли кто-нибудь помочь мне немного с этим? Может ли быть проблема с разрешениями? Это действительно, действительно оставило меня без слов или идей, чтобы это исправить. Я предполагаю, что могу поместить plist в /Documents, но я понятия не имею, как это сделать. Поэтому, если у кого-то есть предложения для меня, чтобы исправить это, я буду очень признателен.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

// Override point for customization after application launch.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if(![defaults objectForKey:@"first_launch"]){ //Load first_launch from NSUserDefaults. It should be either true or false, but never (null).
    [self.window addSubview:configWizard.view];
    UIAlertView *lol = [[UIAlertView alloc] initWithTitle:@"Never started before." message:@"The app was never started before." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [lol show];
    [lol release];
}else{
    [self.window addSubview:tabBarController.view];
    UIAlertView *lol = [[UIAlertView alloc] initWithTitle:@"Started before." message:@"The app was started before." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [lol show];
    [lol release];
}

[defaults synchronize];

// Add the tab bar controller's view to the window and display.
[self.window makeKeyAndVisible];

return YES;

}

Это старый код, который я использовал, когда пытался загрузить из NSUserDefaults, но first_launch продолжал возвращаться (null).


person Andy Ibanez    schedule 12.04.2011    source источник
comment
Пакет приложений обычно не доступен для записи. См. NSDocumentsDirectory или NSLibraryDirectory.   -  person tc.    schedule 12.04.2011


Ответы (1)


Хм. Поведение приложения на устройстве и в симуляторе отличается. Так что ваши представления о тестировании вполне верны. Я сейчас не совсем (плохо, но честно))), но я вполне согласен с вашим предположением, что проблема в правах доступа к файлам.

В качестве решения могу предложить использовать NSUserDefaults. Кроме того, работать с ними в этой ситуации должно быть проще.

ОБНОВИТЬ

Попробуй это:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults boolForKey:@"first_launch"]) {       // use boolForKey instead objectForKey here
     [defaults setBool:YES forKey:@"first_launch"];     // change the value (next time launch is not the first one)
     [defaults synchronize];    // you should synchronize only if values were changed

     UIAlertView *lol = [[UIAlertView alloc] initWithTitle:@"Never started before."
            message:@"The app was never started before." delegate:nil
            cancelButtonTitle:@"OK" otherButtonTitles:nil];
     [lol show];
     [lol release];
} else {
     UIAlertView *lol = [[UIAlertView alloc] initWithTitle:@"Started before."
            message:@"The app was started before." delegate:nil
            cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [lol show];
    [lol release];
}
person kpower    schedule 12.04.2011
comment
Сначала я пытался сохранить оба значения в NSUserDefaults. Но всякий раз, когда я пытался получить пароль (который НЕ редактировался из самого пакета настроек), он продолжал возвращаться (ноль). - person Andy Ibanez; 12.04.2011
comment
Вот значения, которые были внутри plist: - Item 2 -- Key | Строка | first_laungh -- Значение | логический | (правда) Вот код, который у меня был: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if(![defaults boolForKey:@"first_launch"]){ //Never launched before. }else{ //Launched before. } [defaults synchronize]; return YES; } Это довольно старый код. Я предположил, что это не сработало, потому что значения в NSSettingsBundle не были доступны пользователю напрямую. - person Andy Ibanez; 12.04.2011
comment
Будет лучше отредактировать свой первоначальный пост и добавить туда код — тогда можно использовать блоки форматирования. - person kpower; 12.04.2011
comment
Также покажите код для загрузки пароля + сохранения данных (флаг и пароль) в NSUserDefaults. А как же Стринг?! Вы имеете в виду NSString? - person kpower; 12.04.2011
comment
Попался, я отредактировал первый пост со своим старым кодом. Да, я имел в виду NSString. А еще я сделал небольшую ошибку: first_launch продолжал возвращать (null), а не поле пароля. Я вспомнил, что к тому времени я еще не работал с полем пароля. - person Andy Ibanez; 12.04.2011
comment
Ага. Просто мои ключи не совпадают с Facepalm, ха-ха. Большое спасибо за вашу помощь. Я очень ценю это. - person Andy Ibanez; 13.04.2011
comment
О, чтобы избежать этого, я всегда использую const или #define (в зависимости от языка, на котором я пишу)... - person kpower; 14.04.2011