iOS: запретить запуск приложения в фоновом режиме

В настоящее время я создаю музыкальное приложение, которое берет управление из центра управления iOS7. Одна из особенностей, которую я заметил, заключается в том, что если я нажму кнопку управления «воспроизведение», мое приложение запустится, даже если оно было убито. Это не то, чего я хочу, поэтому я добавил return NO в didFinishLaunchingWithOptions, если приложение запускается в фоновом режиме, чтобы предотвратить процесс инициализации.

К сожалению, это не меняет того факта, что приложение все еще запущено, и didFinishLaunchingWithOptions больше не вызывается (и ничего не инициализируется). Поскольку я не могу принудительно убить приложение, когда я не хочу, чтобы оно запускалось, есть ли способ предотвратить запуск приложения? Я думал, что возврат NO поможет, но, похоже, это не так.


person loadedion    schedule 16.12.2013    source источник
comment
Я не уверен, что вы используете для функциональности воспроизведения, но, может быть, если вы отмените подписку на уведомление о воспроизведении, когда приложение будет закрыто, это поможет?   -  person Ivan Alek    schedule 16.12.2013
comment
The return value is ignored if the app is launched as a result of a remote notification developer.apple.com/library/ios/documentation/uikit/reference/:   -  person Adam    schedule 16.12.2013
comment
Спасибо, это решает хотя бы одну загадку. @IvanAlek Проблема в том, что нет определенного места, где я мог бы добавить такой вызов до того, как приложение будет убито.   -  person loadedion    schedule 16.12.2013
comment
Выброс исключения из didFinishLaunchingWithOptions: уничтожит приложение. Шучу, не рекомендую этого делать :)   -  person TotoroTotoro    schedule 16.12.2013
comment
@loadedion — ваше приложение не уничтожается, если оно получает уведомление о воспроизведении, оно просто работает в фоновом режиме. Таким образом, вы можете отказаться от подписки на уведомление в UIApplicationDelegate с помощью applicationDidEnterBackground:. Если вы не можете сделать это из UIApplicationDelegate, вы всегда можете подписаться на уведомление UIApplicationDidEnterBackgroundNotification и удалить подписку на уведомление о воспроизведении в этом объекте.   -  person Adam    schedule 16.12.2013
comment
Если приложение все еще находится в фоновом режиме, есть ли причина, по которой вызывается didFinishLaunchingWithOptions? Насколько я понимаю, этот метод вызывается только при первом запуске приложения.   -  person loadedion    schedule 16.12.2013
comment
Теперь ожидаемое поведение в iOS 7 заключается в том, что приложения поддерживают возобновление фонового звука в ответ на элементы управления мультимедиа, даже если они не запущены. У вас могут быть свои причины, но вы не уверены, что оно пройдет проверку приложения, если вы собираетесь использовать App Store. Я ничего не нашел об этом в HIG, так что вы можете быть в порядке, но см. Примечания к выпуску iOS 7   -  person nekno    schedule 17.12.2013
comment
Мое приложение поддерживает возобновление фонового звука. Чего я не хочу, так это того, чтобы само приложение запускалось в фоновом режиме. Мне удавалось время от времени воспроизводить эту проблему, что заставляет меня думать, что это ошибка в iOS.   -  person loadedion    schedule 17.12.2013
comment
Возобновление звука bg из состояния not running — это запуск в фоновом режиме. Проверьте application.applicationState в application:didFinishLaunchingWithOptions: для UIApplicationStateInactive при запуске на переднем плане или UIApplicationStateBackground при запуске в фоновом режиме. Затем вместо applicationDidBecomeActive: вызывается applicationDidEnterBackground:.   -  person nekno    schedule 17.12.2013
comment
Спасибо, теперь это имеет больше смысла. Можно ли управлять running state с какой-либо точностью? Я запускаю свое приложение, а затем сразу же убиваю его. Предполагая, что приложение находится в состоянии not running, я пытаюсь нажать play через control center, но оно игнорируется (как я изначально и предполагал). play не принимается последовательно, что делает тестирование немного запутанным.   -  person loadedion    schedule 17.12.2013
comment
Я ожидаю, что Центр управления будет контролировать последнее приложение, воспроизводящее мультимедиа. Обычный запуск отправляет ваше приложение через состояния Not runningInactiveActive. Нажатие кнопки «Домой» отправляет приложение через InactiveBackground. Уничтожение приложения затем отправляет приложение на Not running. При нажатии кнопки воспроизведения в Центре управления будет отправлено уведомление, если ваше приложение было последним приложением, воспроизводящим мультимедиа в состоянии Active или Background. Если бы вы не были последним воспроизводящим медиафайлом, я бы не ожидал, что он будет запущен в фоновом режиме при нажатии кнопки воспроизведения в CC, хотя я не нашел точных документов по этому поводу.   -  person nekno    schedule 17.12.2013
comment
Да, я ожидал того же и решил обновить версию iOS телефона до 7.0.4. Оказывается, часть моей проблемы была ошибкой iOS. После этого я смог получать стабильные фоновые запуски с кнопки воспроизведения в центре управления. Поскольку это согласовано, я полагаю, что могу использовать флаг для задержки инициализации до тех пор, пока приложение не будет фактически открыто и applicationWillEnterForeground вызвано. Там я могу начать инициализацию и сбросить флаг   -  person loadedion    schedule 17.12.2013


Ответы (2)


Я нашел одну из основных причин этой проблемы. Это было связано с аудиосессией и различными уведомлениями/делегатами, для которых было зарегистрировано приложение. В AppDelegate's applicationWillTerminate: я должен был обязательно позвонить:

[[UIApplication sharedApplication] endReceivingRemoteControlEvents];

[[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&audioSessionError];

А также отмените регистрацию любых звуковых уведомлений (прерывания и изменения маршрута).

person loadedion    schedule 27.06.2014

Вы хотите, чтобы ваше приложение вообще работало в фоновом режиме?

Если нет, вы можете просто добавить значение info.plist, чтобы оно не входило в фон и просто закрывалось, когда пользователь нажимал кнопку «Домой».

person Fluffhead    schedule 16.12.2013
comment
Приложение создано для работы в фоновом режиме, но не для запуска в фоновом режиме, хотя оно начинает выглядеть так, как и следовало ожидать. - person loadedion; 17.12.2013