Что может сломать приложение во время обновления через iOS App Store? - PullRequest
2 голосов
/ 28 марта 2012

Я сталкиваюсь с очень странной и чрезвычайно трудной для решения проблемы с приложением для iPad, которое есть в App Store. Сообщения о том, что приложение больше не работает после выпуска новой версии, увеличились за последние пару недель. Теперь я смог воспроизвести проблему на новом внутреннем iPad, который был восстановлен из резервной копии с более старой версией, а затем обновлен с помощью обычных процедур App Store.

Проблема: хотя приложение работает нормально, если оно было недавно установлено через App Store или запущено через XCode, оно просто не работает должным образом после обновления. Как только приложение находится в «сломанном» состоянии, я даже не могу установить новую версию через XCode, которая работает. Что в этом случае может быть полезным, поскольку поможет мне решить эту проблему.

Что имеем:

  • приложение имеет набор UIWebView с, которые загружают контент с веб-страницы.
  • веб-страница загружает инфраструктуру Javascript и создает глобальный объект h5, который можно использовать для вызова методов внутри нее.
  • отсюда в приложении связи -> UIWebView выполняется через вызовы [webView stringByEvaluatingJavaScriptFromString] для этого h5 объекта.

И тут возникает вопрос:

  • HTML установлен в UIWebView нормально, но, похоже, JavaScript не запускается при обновлении приложения.
  • Я могу запустить материал javascript через [webView stringByEvaluatingJavaScriptFromString], и я могу получить обработанный outerHTML таким образом, просто чтобы обнаружить, что мой <script> материал отсутствует и, следовательно, не выполнен.

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

Что я пробовал до сих пор:

  • мы используем библиотеку Three20 для некоторых наших функций, и она имеет кеш. Этот кэш был очищен и проверен, действительно ли он очищен.
  • Я удалил все в <Application root>/Library/caches
  • Вместо загрузки URL-адреса с помощью отдельного запроса, а затем отправки его в WebView с помощью [webView loadData] Я попытался
    • загрузить URL-адрес непосредственно с веб-сервера с помощью [webView loadRequest]
    • преобразовать NSData в NSString и протолкнуть его через [webView loadHTMLString]
    • имейте NSString, держите html и проталкивайте его через [webView loadHTMLString] без необходимости удаленной загрузки материала.

У меня немного нет идей, что может быть причиной здесь, и я хотел бы узнать ваше мнение по этому вопросу. Я что-то упустил?

Ответы [ 4 ]

2 голосов
/ 28 марта 2012

Предварительно могу сказать, что понятия не имею, почему ваша конкретная система не работает. Однако я могу дать несколько советов, которые, я надеюсь, будут полезны.

Из того, что вы сказали, я понимаю, что:

  1. Версия А приложения работает
  2. Чистая установка версии B приложения работает
  3. Установка Версии B поверх Версии A использует приложение.

Для меня это свидетельствует о том, что что-то осталось от Версии A, что мешает Версии B - например, старый файл, расположенный по пути, который имеет приоритет над более новым файлом.

Я знаю, что вы сказали, что вы очищали кеши, но есть ли в системе другие места, где вы хранили данные, которые не очищались?

Так что в целом я бы предложил провести глубокую экспертизу приложения, чтобы отследить имя и местоположение всех активов каждой версии и убедиться, что они могут быть учтены.

Хорошо, что когда вы подключаете приложение, оно постоянно. Такую ошибку легче обнаружить, чем то, что происходит «иногда».

0 голосов
/ 29 марта 2012

У меня есть обновление по этому вопросу. Мне удалось устранить проблему, но, к сожалению, я не уверен на 100%, какой из удаленных файлов был источником проблемы. Тем не менее, я хотел бы поделиться своим подходом.

Я был почти уверен, что проблема должна находиться где-то в папке приложения, так как в противном случае приложение не будет работать после чистой установки, но не при обновлении.

Я решил сравнить файловую систему внутри моего приложения при чистой установке или с этой неработающей версией после обновления. Я решил перебрать папки приложения и распечатать файлы. До и после очистки кеша. Я добавил следующий код в мой AppDelegate для сравнения:

NSArray *paths = [NSArray arrayWithObjects:
                        [NSNumber numberWithUnsignedInt:NSApplicationDirectory], 
                        [NSNumber numberWithUnsignedInt:NSAutosavedInformationDirectory], 
                        [NSNumber numberWithUnsignedInt:NSDesktopDirectory], 
                        [NSNumber numberWithUnsignedInt:NSCachesDirectory], 
                        [NSNumber numberWithUnsignedInt:NSApplicationSupportDirectory], 
                        [NSNumber numberWithUnsignedInt:NSDownloadsDirectory], 
                        [NSNumber numberWithUnsignedInt:NSInputMethodsDirectory], 
                        [NSNumber numberWithUnsignedInt:NSMoviesDirectory], 
                        [NSNumber numberWithUnsignedInt:NSMusicDirectory], 
                        [NSNumber numberWithUnsignedInt:NSPicturesDirectory], 
                        [NSNumber numberWithUnsignedInt:NSPrinterDescriptionDirectory], 
                        [NSNumber numberWithUnsignedInt:NSSharedPublicDirectory], 
                        [NSNumber numberWithUnsignedInt:NSPreferencePanesDirectory], 
                        [NSNumber numberWithUnsignedInt:NSItemReplacementDirectory], 
                        [NSNumber numberWithUnsignedInt:NSAllApplicationsDirectory], 
                        [NSNumber numberWithUnsignedInt:NSAllLibrariesDirectory], 
                        nil];

NSFileManager *manager = [NSFileManager defaultManager];
for ( NSNumber *directory in paths ) {
    NSArray *tp = NSSearchPathForDirectoriesInDomains([directory unsignedIntegerValue] , NSUserDomainMask, YES);
    if ( [tp count] == 0 )
        continue;

    NSString *path = [tp objectAtIndex:0];

    NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:path];
    NSString *filename;

    NSLog(@"-------------------------------------------------------");
    NSLog(@"== path: %@", path);
    NSLog(@"-------------------------------------------------------");

    while ( filename = [direnum nextObject] ) {
        NSString *thefile = [NSString stringWithFormat:@"%@/%@", path, filename];
        NSLog( @"\t%@, deletable? %d", filename, [manager isDeletableFileAtPath:thefile] );
    }

}

Затем я сравнил вывод и обнаружил, что единственные оставшиеся файлы находятся в NSAllLibrariesDirectory. А именно они были

Cookies/Cookies.binarycookies
Preferences/.GlobalPreferences.plist
Preferences/com.apple.PeoplePicker.plist
Preferences/com.medienhaus.VOL.plist

Здесь я эпически потерпел неудачу и реализовал метод очистки для удаления файлов вместо того, чтобы переходить один за другим, чтобы выяснить, какой файл вызвал проблему.

Так что теперь у меня есть рабочая версия, но я точно не знаю, какой из этих четырех файлов сломал ее. Наиболее вероятным является Cookies.binarycookies.

0 голосов
/ 29 марта 2012

Я столкнулся с той же самой проблемой в прошлом году сразу после того, как они добавили новые инструменты импорта / экспорта данных в XCode!Лучший способ воспроизвести и отладить проблему - это установить более старую версию и экспортировать данные с помощью инструмента экспорта данных в органайзере XCode, а затем собрать и использовать XCode для установки более новой версии.Затем остановите приложение, импортируйте данные, которые вы экспортировали ранее, затем соберите / перейдите из XCode, чтобы попытаться воссоздать сбой.Если вам повезет, как и мне, gdb / lldb остановится на ошибке, раскрывающей источник проблемы.Вы также можете попробовать метод грубой силы выпустить новую версию, которая удалит все данные из предыдущей версии, но это потенциально оставит много недовольных пользователей.

0 голосов
/ 29 марта 2012

Еще несколько ресурсов для проверки:

Проверьте прописные буквы всех имен ваших файлов (изображений, HTML, CSS и т. Д.), Элементов списка параметров и настроек.

Проверьте все сохраненные / загруженные NSDefaults и проверьте допустимые значения для всех версий приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...