Я создаю приложение, в котором пользователь может инициировать фоновую загрузку файлов из приложения и расширения общего доступа. Пользователь должен иметь возможность отслеживать ход любой загрузки из основного приложения.
В случае, когда загрузка инициируется из расширения, мне нужно создать конфигурацию фонового сеанса с тем же идентификатором, который использовался в расширении, чтобы получать вызовы делегатов для отслеживания прогресса и многого другого в приложении.
В приложении я не могу этого сделать, пока расширение не выйдет. В документах Apple указано https://developer.apple.com/library/prerelease/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html
Вы должны создать ровно один сеанс для каждого идентификатора (указанного при создании объекта конфигурации). Поведение нескольких сеансов, использующих один и тот же идентификатор, не определено.
Я проверил это. Если я не отклоню расширение общего доступа, я смогу создать сеанс в основном приложении без каких-либо ошибок, но я не получаю никаких вызовов делегатов. Когда я закрываю расширение перед переключением обратно в основное приложение, я могу подключиться к тому же фоновому сеансу и получать вызовы делегатов. Все хорошо.
Когда я закрываю расширение общего доступа, используя completeRequestReturningItems:completionHandler:
в NSExtensionContext
, когда завершается процесс?
упоминает
Вызов этого метода в конечном итоге закрывает контроллер представления расширения приложения.
"В конце концов" не очень конкретно. Как я могу точно узнать из основного приложения, что расширение не запущено?
Единственный обходной путь, который я нашел, - это периодически записывать файл в общий контейнер и заставлять основной upp сначала забирать фоновый сеанс после тайм-аута, превышающего этот период. Но это уродливый хак.
Если загрузка небольшая, возможно ли, что загрузка завершается во время выполнения процесса расширения, поэтому я должен обрабатывать завершение загрузки в расширении, а не в основном приложении?
Подводя итог: как безопасно перенести загрузку из расширения приложения в приложение?