ТестированиеМобильное тестированиеИнженер по мобильному тестированию

Файл, переданный из другого приложения, на iOS и Android иногда открывается пустым после сворачивания прини...

Файл, переданный из другого приложения, на iOS и Android иногда открывается пустым после сворачивания принимающего приложения. Как проверить, что причина — временное право доступа к внешнему файлу?

Проходите собеседования с ИИ помощником Hintsage

Краткий ответ

Нужно проверить жизненный цикл внешней ссылки на файл и момент фактического чтения данных. Если приложение сохраняет только ссылку, а читает файл после сворачивания или повторного открытия, временное право доступа могло исчезнуть; надёжный вариант — сразу прочитать файл и скопировать его содержимое во внутреннее хранилище приложения.

Исторический контекст

Мобильные ОС изначально изолируют приложения друг от друга через sandbox. Передача файла между приложениями поэтому обычно даёт не постоянный путь к общему файлу, а контролируемую ссылку или временное разрешение на чтение.

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

Постановка проблемы

Сценарий нужно проверять не только при немедленном открытии файла. Риск возникает, если приложение принимает ссылку, сохраняет её для последующей обработки, уходит в фон, выгружается ОС или пытается прочитать ресурс после возврата.

На iOS доступ к переданному ресурсу может быть связан с временным разрешением и областью действия ссылки. На Android приложение может получить content URI, доступ к которому предоставлен на ограниченный срок или только для конкретного запуска.

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

Подробное решение

Для проверки нужно сравнить несколько моментов чтения:

  1. Прочитать файл сразу после передачи и зафиксировать результат.
  2. Сохранить только внешнюю ссылку, свернуть приложение, дождаться возврата или принудительной выгрузки, затем повторить чтение.
  3. В отдельном сценарии сразу скопировать содержимое во внутреннее хранилище приложения и обработать уже локальную копию.
  4. Сравнить размер, контрольную сумму или другой устойчивый признак данных до и после перехода в фон.

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

На iOS следует корректно использовать предоставленный системой ресурс в разрешённой области доступа и не рассчитывать, что ссылка станет бессрочным путём. На Android нельзя безоговорочно трактовать content URI как обычный путь к файлу; нужно читать его через предоставленный механизм доступа и учитывать срок действия разрешения.

Компромисс очевиден: немедленное копирование повышает надёжность и позволяет обрабатывать файл после перезапуска, но требует дополнительного места и операции копирования. Хранение внешней ссылки экономит ресурсы, однако подходит только для сценариев, где приложение гарантированно завершает чтение в период действия разрешения.

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

Ситуация из практики

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

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

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

Что кандидаты часто упускают

  1. Достаточно ли проверить только открытие файла сразу после выбора?

Нет. Это проверяет лишь краткоживущий сценарий, в котором разрешение ещё действительно. Нужно отдельно проверить задержку перед чтением, переход в фон, выгрузку приложения и повторный запуск. Иначе тест пропустит основной дефект, возникающий именно при отложенной обработке.

  1. Можно ли передавать внешнюю ссылку между экранами или сохранять её для следующего запуска?

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

  1. Как отличить истёкшее разрешение от повреждённого или неподдерживаемого файла?

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