У нас есть проблема, из-за которой ошибка iOS приводит к сбою нашего приложения.Это произошло только для 0,001% пользователей, но когда это происходит, приложение становится непригодным для использования (сбой при запуске).
Проблема в том, что основная ошибка в коде iOS Apple, а не то, что мы можем исправить напрямую.Мы ищем помощь в поиске обходного пути, а не в устранении основной причины.
- Сбой
EXC_BAD_ACCESS
. - Мы не создаем адрес данных для чтения.Мы получаем
NSData
от PHImageManager requestImageDataForAsset
.Когда мы пытаемся получить к нему доступ с помощью NSData.bytes
+ NSData.length
, происходит сбой с EXC_BAD_ACCESS
. - Это реальный адрес памяти (не 0x00000000), но наше приложение не имеет доступа к нему.Похоже, что NSData, который мы получаем от PHImageManager, имеет неверный указатель или неверную длину.
- Это очень необычно.Это происходит только у 0,001% пользователей, поэтому, скорее всего, это редкая проблема из-за одной плохой фотографии в их библиотеке.
- Это не преходяще.Независимо от того, что плохая фотография вызывает это, это происходит каждый раз, когда приложение запускается для этого пользователя (у нас есть доступ к последним 12 фотографиям в вашей фотопленке при запуске).
Вопрос в том, как можномы обходим это крушение .Я знаю, что всегда лучше исправить основную причину, но в этом случае основная причина не в нашем коде (NSData, возвращенный библиотекой яблока, недопустим).Мы не знаем, что он недействителен, пока не попытаемся получить к нему доступ, и тогда будет слишком поздно.
Идеи, которые мы пытались (и не удалось):
Любые идеи для обходного пути ?
Вот пример кодаэто вызовет это.Это работает для 99,9999% фотографий, но фатально, когда не получается.Как я могу поймать проблему, когда NSData недействителен?
[[PHImageManager defaultManager] requestImageDataForAsset:asset
options:opts
resultHandler:^(NSData* imageData, NSString* dataUTI, UIImageOrientation orientation, NSDictionary* info) {
if (!imageData || imageData.length == 0) {
return;
}
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
CC_MD5_Update(&md5, imageData.bytes, (CC_LONG)imageData.length);
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(digest, &md5);
}];
Журнал сбоев
0 libcorecrypto.dylib md5_compress + 60
1 libcorecrypto.dylib ccdigest_update + 264
2 libcommonCrypto.dylib CC_MD5_Update + 188
... app code above ...