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

Показывать оповещение, когда приложение iOS находится в фоновом режиме

Я хочу, чтобы отображал вид предупреждения, когда мое приложение iOS находится в фоновом режиме (и оно использует местоположение).

Например, приложение Uber Partner (Driver) отображает предупреждение и воспроизводит звук, даже если:

  • Я отключил уведомления!
  • Мой iPhone находится в тихом режиме!

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

введите описание изображения здесь
Действия, выполненные для достижения вышеуказанного состояния:

  • Зайдите в онлайн-приложение Uber Partner (вы - водитель!)
  • Отключить уведомления для приложения в настройках
  • Переместите приложение в фоновый режим и дождитесь запроса на поездку
  • По прошествии некоторого времени запрос прокрутки появляется в виде предупреждения, а звук воспроизводится в фоновом режиме.

Конечно, удаленные уведомления silent могут быть использованы приложением с помощью API didReceiveRemoteNotification: fetchCompletionHandler:, даже если пользователь отключает уведомления в настройках. Но, как появляется предупреждение, это то, что я пытаюсь выяснить.

4b9b3361

Ответ 1

Я бы предположил, что Uber имеет некоторые специальные разрешения или использует частный API, который позволяет им достичь такого поведения, не используя локальные уведомления. Хотя я не знаю, как Uber реализовал это в своем партнерском приложении, я могу немного рассказать о том, как предупреждения работают на главном экране.

SpringBoard - это singleton-класс, который управляет приложением SpringBoard (SpringBoard.app), программой запуска приложений для iPhone. SpringBoard не использует стандартные классы UIAlertView/UIAlertController, так как они не участвуют в системе оповещения SpringBoard. В iOS 5 была введена SBAlertItem, которая используется для отображения UIAlertViews на SpringBoard (уведомления о оповещении о батарее, оповещения о разблокировке SIM-карты и т.д.). Apple использует SBAlertItem для своих предупреждений о блокировке и домашнем экране, я буду работать над предположением, что Uber использует SBAlertItem для этого ответа.

SBAlertItem имеет защищенный ivar UIAlertView *_alertSheet. Предполагая, что это действует как нормальный UIAlertView, вы должны иметь возможность изменять свойства этого предупреждения в соответствии с вашими потребностями. Я также прочитал бы проект saurik Cydia Substrate, а именно MobileSafety.mm, чтобы увидеть некоторые варианты использования. Я также нашел noweibogoodsleep, в котором приведен пример использования SBAlertItem на SpringBoard.

Я также нашел SBUserNotificationAlert, подкласс SBAlertItem. У этого, как представляется, есть больше способов облегчить настройку оповещения, которая может соответствовать вашим потребностям лучше, чем стандартный SBAlertItem.

Я понимаю, что подключение к частным API-интерфейсам - это, вероятно, не то, что вы ожидали при задании этого вопроса. Поскольку я не знаю, как работает Uber, я могу только дать ответ из моего личного опыта, работающего с устройствами времени исполнения и взломанными устройствами.

Ответ 2

После некоторого статического анализа двоичного кода стало ясно, что они не используют PKPushRegistry (VOIP), недокументированные вызовы NSNotificationCenter или SBAlertItem.

Понадобилось немного времени, чтобы найти его, но на самом деле они используют CFUserNotification для предупреждений. Класс документирован для Mac, но закрытый для iOS.

Я нашел использование, выполнив следующее:

nm -u ~/Downloads/Payload/UberDriver.app/UberDriver | grep CFUserNotification

Вывод:

_CFUserNotificationCancel
_CFUserNotificationCreate
_CFUserNotificationCreateRunLoopSource
_kCFUserNotificationAlertHeaderKey
_kCFUserNotificationAlertMessageKey
_kCFUserNotificationAlertTopMostKey
_kCFUserNotificationAlternateButtonTitleKey
_kCFUserNotificationDefaultButtonTitleKey
_kCFUserNotificationSoundURLKey

Если я grep для PKPushRegistry или для SBAlertItem, оба не возвращают никаких результатов.

Можно использовать класс, импортировав этот файл в ваш проект.

UPDATE

У меня есть "рабочий" код, однако он сразу вызывает функцию обратного вызова (responseFlags установлен на kCFUserNotificationCancelResponse) без предупреждения.

Я использую те же клавиши и звонки, что и приложение Uber (см. ниже приведенный ниже код), поэтому должно быть что-то дополнительное. Будут продолжать искать.

#import "CFUserNotification.h"

@interface AppDelegate ()
@property (nonatomic) CFRunLoopSourceRef runLoopSource;
@property (nonatomic) CFUserNotificationRef notification;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    SInt32 error;
    NSDictionary *keys = @{(__bridge NSString*)kCFUserNotificationAlertHeaderKey: @"Hello",
                           (__bridge NSString*)kCFUserNotificationAlertMessageKey: @"World",
                           (__bridge NSString*)kCFUserNotificationAlertTopMostKey: @YES,
                           (__bridge NSString*)kCFUserNotificationDefaultButtonTitleKey: @"asdf",
                           (__bridge NSString*)kCFUserNotificationAlternateButtonTitleKey: @"asdf",
                           };

    self.notification = CFUserNotificationCreate(NULL, 10, kCFUserNotificationPlainAlertLevel, &error, (__bridge CFDictionaryRef)keys);
    self.runLoopSource = CFUserNotificationCreateRunLoopSource(NULL, self.notification, NotificationCallback, 0);
    CFRunLoopAddSource(CFRunLoopGetMain(), self.runLoopSource, kCFRunLoopCommonModes);

    return YES;
}

void NotificationCallback(CFUserNotificationRef userNotification, CFOptionFlags responseFlags) {
    NSLog(@"got response: %lu", responseFlags);
}

Ответ 3

Ваш вопрос пропустил самую важную роль в отношении приложения "Uber Partner", которое сделало бы вещи намного яснее. Приложение "Uber Partner" является приложением Предприятие и не ограничивается только строками руководства Appstore.

у него не было специальных разрешений, как и другие ответы.

Можно отображать представление предупреждения с помощью SBAlertItem независимо от настроек Sound\Notification, но если ваша конечная цель заключается в том, чтобы попасть в AppStore, к сожалению, ваше приложение будет отклонено для использования частного API.