Когда вы создаете фоновый сеанс, вы делаете две вещи:
- Указание nsurlsessiond (фоновому демону) создать сеанс.
- Создание локального сеанса в вашем приложении, который подключен к этому сеансу.
Назначение идентификатора — позволить вашему приложению повторно подключиться к внешнему сеансу (управляемому nsurlsessiond), если ваше приложение будет завершено операционной системой.
Насколько мне известно, обычно ваше приложение не может добровольно отделить свой сеанс от фонового сеанса. Поэтому, когда ваше приложение пытается создать сеанс с одним и тем же идентификатором, внезапно появляются два сеанса, которые пытаются общаться с одним и тем же внешним сеансом в nsurlsessiond, и все идет очень неправильно. Это не поддерживаемый способ использования API.
Объект фонового сеанса должен оставаться активным на протяжении всего времени работы вашего приложения. Не пытайтесь избавиться от него и воссоздать его за один запуск. Вы никогда не должны создавать сеанс с тем же идентификатором, если только ваше приложение не будет перезапущено.
Обратите внимание, однако, что если ваше приложение перезапускается для обработки фоновых событий (только для iOS), когда вы вызываете обработчик завершения, предоставленный событием, локальный сеанс вашего приложения становится недействительным, и вам нужно создать его, если ваше приложение делает что-либо после тот. Это единственная известная мне ситуация, когда фоновый сеанс перестает быть связанным с фоновым сеансом в nsurlsessiond, и, таким образом, это единственная ситуация, когда вы должны когда-либо создавать сеанс с одним и тем же идентификатором дважды за один запуск (один раз, когда вы вас попросят обработать фоновые события, а затем, возможно, снова, когда вы получите вызов didFinishLaunching
, указывающий, что пользователь активизировал ваше приложение).
person
dgatwood
schedule
03.08.2016