Подтвердить что ты не робот

Является ли способ активировать приостановленное приложение в iOS без вмешательства пользователя или сервера

Есть ли способ запустить приложение iOS без использования службы значительного изменения местоположения?

Мне нужно разбудить мое приложение без вмешательства сервера или пользователя Что-то похожее на будильник, в котором вы получаете всплывающее окно с предупреждением о времени его пробуждения.

UILocalNotification - не будет работать, так как это потребует пользователя и прерывания вмешательства.

Уведомления о бесшумном нажатии. - Не работает, так как вы не можете отправлять локальные уведомления в виде сообщений Silent push. Они могут быть отправлены только сервером. Это означает, что потребуется вмешательство сервера

Фоновая выборка - не работает, так как не гарантируется время запуска

Я что-то пропустил?

4b9b3361

Ответ 1

Изменить: вы отредактировали свой вопрос, чтобы явно указать "без вмешательства пользователя или сервера".

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

Вот несколько советов по трем параметрам выше:

UILocalNotification

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

Уведомления о бесшумном нажатии

Другая опция, поскольку iOS 7 является уведомлением content-available или молчанием. Вы настраиваете конкретную полезную нагрузку для этого вида уведомления, и если ваше приложение имеет правильную настройку значения UIBackgroundMode, оно будет доставлено в ваше приложение тихо:

Полезная нагрузка будет выглядеть примерно так:

{
    "aps" : {
        "content-available" : 1
    },
    "content-id" : 42
}

И вы получите его в своем делете делегата с помощью специального метода делегата:

- (void)         application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo 
      fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification userInfo is %@", userInfo);

    NSNumber *contentID = userInfo[@"content-id"];
    // Do something with the content ID
    completionHandler(UIBackgroundFetchResultNewData);
}

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

Многозадачность в Objc.io также является хорошим началом для этого подхода.

Фоновая выборка

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

В документации Apple по этому поводу упоминается его использование:

Приложения, которые периодически проверяют новый контент, могут попросить систему разбудить их, чтобы они могли инициировать операцию выборки для этого контента. Чтобы поддержать этот режим, включите опцию Фоновая выборка из раздела "Фоновые режимы" на вкладке "Возможности" в вашем проекте Xcode.

Ответ 2

Вы можете отказаться от многозадачности. Таким образом, приложение никогда не вводит фон или не приостанавливается. Подождите, пока не появится соответствующее предупреждение. Однако это, вероятно, не лучшее решение, учитывающее использование энергии. Кроме того, приложение должно быть активным все время. Если пользователь нажимает кнопку "Домой", приложение прекращается. Но приложение не прекращается, когда пользователь блокирует устройство. Это лучшее, что вы можете сделать, не используя недокументированную apis.

Если вы не хотите, чтобы ваше приложение запускалось в фоновом режиме вообще, вы можете явно отказаться от фона, добавив UIApplicationExitsOnSuspend (со значением YES) для ваших приложений Файл Info.plist. Когда приложение отключается, оно циклически не работает, неактивно и активно, и никогда не входит в фона или приостановленных состояний. Когда пользователь нажимает кнопку "Домой" для выхода из приложения приложение applicationWillTerminate: метод приложения вызывается делегат, и приложение занимает около 5 секунд для очистки и выйдите до того, как он будет завершен и возвращен в нерабочее время состояние.

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

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Ответ 3

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

И вы указали все варианты, которые вам не нужны, но им приходится рассчитывать на них.

Я думаю, вам нужно подумать о том, как их сочетать и дружелюбно, заставить их работать, что вам нужно.

Это лучшая комбинация, о которой я могу думать:

  • Значительное изменение местоположения, вы запрашиваете разрешение пользователя в первый раз, а иногда и после этого.
  • Фоновая выборка, убедитесь, что ваш сервер возвращает что-то каждый раз при вызове, поэтому iOS не будет оптимизировать его до менее частых.
  • Уведомление о бесшумном нажатии, вы запрашиваете разрешение пользователя в первый раз.