- Уведомления на устройствах iPhone, iPad и iPod touch
- Открытие на экране блокировки
- Открытие в Центре уведомлений
- Управление уведомлениями
- Планирование сводки уведомлений
- Изменение стилей оповещений
- Изменение настроек для групп уведомлений
- Настройка оповещений на основе местонахождения
- iOS 5: избавляемся от «баннеров» уведомлений
- Лонгриды для вас
- Как включать, отключать и настраивать уведомления на iPhone и iPad
- Как настраивать уведомления в iOS?
- Как временно отключить все уведомления?
- Баннерная реклама в iOS-приложении
- MoPub и компания
- Сила в правде
- Контент
- Автоклики
- Краши
- Производительность
- Решения
- Система логирования
- IFAdView
- IFURLProtocol
- IFAdsExceptionManager
- Локальный стенд
Уведомления на устройствах iPhone, iPad и iPod touch
Узнайте, как просматривать уведомления и управлять ими, чтобы меньше отвлекаться в течение дня.
Открытие на экране блокировки
Чтобы просмотреть недавние уведомления на экране блокировки, возьмите в руки iPhone или выведите iPad из режима сна. На экране блокировки можно также выполнять следующие действия.
- Выбрать отдельное уведомление, чтобы открыть приложение, из которого оно отправлено.
- Выбрать несколько уведомлений, чтобы просмотреть все недавние уведомления, отправленные из определенного приложения.
- Смахнуть уведомление влево, чтобы управлять оповещениями для определенного приложения, или удалить его.
- Нажать и удерживать уведомление*, чтобы просмотреть его и выполнить быстрые действия при их наличии.
Чтобы предварительно просматривать уведомления на экране блокировки, перейдите в меню «Настройки» > «Уведомления» > «Показать миниатюры» и выберите вариант «Всегда».
* На iPhone SE (2-го поколения) смахните уведомление влево, нажмите «Просмотреть», чтобы просмотреть уведомление и выполнить поддерживаемые быстрые действия.
Открытие в Центре уведомлений
В Центре уведомлений отображается история уведомлений, которую можно прокрутить назад, чтобы просмотреть пропущенные уведомления. Существует два способа просмотреть оповещения в Центре уведомлений.
- На экране блокировки смахните вверх от средней части экрана.
- На любом другом экране смахните вниз от центра верхней части экрана.
Чтобы очистить историю уведомлений, нажмите кнопку «Закрыть» , а затем — «Очистить».
Управление уведомлениями
Чтобы управлять уведомлениями с экрана блокировки или из Центра уведомлений, выполните следующие действия.
- Смахните влево оповещение или группу оповещений.
- Нажмите «Параметры» и выберите один из следующих вариантов.
- Выключить на 1 час
- Выключить на сегодня
- Настройки вида
- Выключить
Можно также нажать «Настройки вида», чтобы изменить стили или параметры оповещений для определенного приложения.
Планирование сводки уведомлений
В iOS 15 и iPadOS 15 можно запланировать время получения сводки уведомлений на каждый день, чтобы наверстать упущенное в удобный для вас момент. В персонализированной сводке оповещения сортируются по приоритету в зависимости от характера использования приложений, а наиболее актуальные уведомления отображаются в верхней части.
Чтобы запланировать сводку уведомлений, выполните следующие действия.
- Перейдите в меню «Настройки» > «Уведомления» > «Доставка по расписанию», а затем включите функцию «Доставка по расписанию».
- В разделе «Приложения в Сводке» выберите приложения, которые хотите включить в сводку уведомлений.
- В разделе «Расписание» нажмите кнопку «Добавить» , чтобы добавить расписание, или кнопку «Удалить» , чтобы удалить расписание. Затем установите время для каждой настроенной сводки по расписанию.
Чтобы добавить в сводку новые приложения, вернитесь в меню «Настройки» > «Уведомления» > «Доставка по расписанию» и выберите приложения в разделе «Приложения в Сводке». Каждое приложение отображается со средним количеством уведомлений, которые вы получаете каждый день из этого приложения.
Изменение стилей оповещений
- Перейдите в меню «Настройки» и нажмите «Уведомления».
- Выберите приложение в разделе «Стиль уведомлений».
- В разделе Alerts (Предупреждения) выберите нужный стиль оповещений. Если включен параметр Allow Notifications (Допуск уведомлений), выберите время доставки уведомлений: сразу или в запланированной сводке уведомлений.
В iOS 15 и iPadOS 15 можно включить функцию «Важные предупреждения», чтобы получать уведомления даже при выключенном звуке или использовании режима «Фокусирование» на устройстве iPhone.
Изменение настроек для групп уведомлений
- Перейдите в меню «Настройки» и нажмите «Уведомления».
- Выберите приложение и нажмите Notification Grouping (Группировка).
- Выберите один из следующих вариантов.
- «Автоматически»: уведомления из приложения будут объединены в группы согласно критериям приложения, например по темам или цепочкам.
- «По приложению»: все уведомления из приложения будут объединены в одну группу.
- «Выключено»: уведомления не будут объединены в группы.
Чтобы выборочно отключить уведомления для приложений, перейдите в меню «Настройки» > «Уведомления» > «Предложения Siri», а затем выключите любое приложение.
Чтобы изменить отображение уведомлений на экране блокировки, выполните следующие действия.
- Откройте меню «Настройки» > «Уведомления».
- Выберите приложение, нажмите «Показать миниатюры» и выберите нужный вариант.
Настройка оповещений на основе местонахождения
Некоторые приложения используют данные о местонахождении для отправки соответствующих оповещений. Например, уведомление о необходимости позвонить кому-либо может появиться, когда вы прибываете в определенное место или покидаете его.
Если такой тип предупреждений не нужен, его можно отключить. Перейдите в меню «Настройки» > «Конфиденциальность» > «Службы геолокации» и выберите приложение, чтобы включить или отключить его оповещения на основе вашего местонахождения. Более подробную информацию о службах геолокации см. в этой статье.
Информация о продуктах, произведенных не компанией Apple, или о независимых веб-сайтах, неподконтрольных и не тестируемых компанией Apple, не носит рекомендательного или одобрительного характера. Компания Apple не несет никакой ответственности за выбор, функциональность и использование веб-сайтов или продукции сторонних производителей. Компания Apple также не несет ответственности за точность или достоверность данных, размещенных на веб-сайтах сторонних производителей. Обратитесь к поставщику за дополнительной информацией.
Источник
iOS 5: избавляемся от «баннеров» уведомлений
Не для кого не секрет, что новая iOS 5 привнесла в нашу жизнь много приятного и нового, например центр уведомлений. Но вместе с центром уведомлений, изменились и представления уведомлений: появились «баннеры». Конечно, эти «баннеры» намного удобней в повседневной жизни, чем старые уведомления, которые перекрывали середину экрана и постоянно замораживали игру или приложение, при появлении.
Вот и все. Можно смело продолжать заниматься своим делом в активном приложении не отвлекаясь на уведомление.
Видео прилагается:
Новости, статьи и анонсы публикаций
Свободное общение и обсуждение материалов
Лонгриды для вас
Дизайн новых MacBook Pro удивил всех. Да, мы предугадывали отсутствие Touch Bar, темную клавиатуру и многое другое, но о том, что появится челка не догадывался никто. Тем не менее, в Купертино отказались внедрять в нее датчик Face ID. В статье расскажем о причинах такого решения.
Два порта Thunderbolt/USB-C вместо четырех положенных, полностью новая архитектура,высокая цена и еще несколько причин, по которым я отказался от идеи брать новый Macbook на чипе M1.
🎧AirPods Max за полгода присутствия на российском рынке подешевели более чем на 40%. Видимо, Apple поняла, что наушники совсем не покупают и начала делать на них скидки через ритейлеров
Источник
Как включать, отключать и настраивать уведомления на iPhone и iPad
Если вы по своей неопытности при запуске каждого нового приложения всегда разрешали программам и играм присылать уведомления, то уже через несколько дней или недель наверняка возникало желание, как минимум наполовину поубавить поток назойливых сообщений. Они не только отвлекают, но и приводят к более быстрому разряду батареи. В этом материале мы расскажем, как отключать уведомления того или иного приложения на iPhone и iPad.
Вообще, мы настоятельно рекомендуем оставлять включённой функцию отправки пуш-уведомлений только для самых важных и востребованных приложений. Возьмите за правило — при запуске новой игры или программы всегда блокировать исходящие сообщения, ну только если это не исключения вроде мессенджеров или почтовых клиентов. В любом случае, активировать эту опцию можно и позже в параметрах самого приложения или настройках iOS.
Как настраивать уведомления в iOS?
Для того чтобы управлять (включать или отключать) всеми уведомлениями необходимо пройти по пути Настройки → Уведомления.
Перед вами откроется весь список установленных на iPhone, iPod touch или iPad приложений, которые имеют доступ к системным уведомлениям. Под названием приложения указывается тип уведомления или надпись «Выключено», свидетельствующая о том, что приложение не отправляет ни один из типов уведомлений пользователю.
Открыв настройки любого приложения из списка, вы получите доступ ко всему спектру визуализации и аудиосоставляющей уведомлений.
Пункт «Допуск уведомлений» является главным. Он либо разрешает любой из видов предупреждений, либо полностью запрещает приложениям подавать хоть какие-то сигналы во время своей неактивности.
Далее вы решаете — хотите слышать какие-либо звуки или нет, а также видеть красный бейджик с числовой информацией в правом верхнем углу иконки (на папках отображается суммарное количество уведомлений от всех приложений в ней).
В секции «Предупреждения» можно отключить показ уведомлений на заблокированном экране, Центре уведомлений или отображение баннеров.
Сами баннеры бывают временными (сами исчезают через несколько секунд) или постоянными (требуют действия от пользователя перед тем как скроются).
В разделе «Параметры» размещена опция «Показ миниатюр». Она определяет, будет ли приложение показывать текст уведомления на заблокированном экране или будет просто отображаться информация о том, что получено уведомление в такую-то программу, но суть сообщения сохранит статус конфиденциальности (подробно).
Аналогичная функция есть и в главном окне раздела «Уведомления». Она распространяется абсолютно на все приложения.
Как временно отключить все уведомления?
В iOS есть очень полезная функция «Не беспокоить».
Она позволяет на постоянной или временной основе блокировать все или часть уведомлений. Приятно то, что она может работать по расписанию, автоматически активируя ограничения. К примеру, вас не потревожит какая-нибудь незначительная напоминалка в игре после 23:00, босс или родные всегда дозвонятся, а вот прочие абоненты смогут достучаться только если настойчиво позвонят второй раз в течение трёх минут. Функция «Не беспокоить» очень простая, понятная, гибкая и важная.
С выпуском iOS 11 здесь же обосновалась опция «Не беспокоить водителя», не позволяющая отвлекаться за рулём.
Источник
Баннерная реклама в iOS-приложении
Сегодня мы открываем цикл статей о том, о чём обычно не говорят на технических конференциях и митапах. Этот и последующие посты расскажут, как устроен механизм монетизации в популярном в США развлекательном iOS-приложении iFunny, разработкой которого мы занимаемся.
Реклама — один из основных способов монетизации бесплатных приложений. Но это сейчас, а какие варианты были в 2011 году, когда появился iFunny? Сервис изначально строился как крепкий, устойчивый бизнес, поэтому с самого первого дня компания решила не заигрывать с пользователями и не заниматься играми с условной капитализацией.
На тот момент основным вариантом монетизации было создать бесплатную урезанную версию сервиса, а затем пытаться продать основной функционал. Потребитель был молод, неопытен и не был готов расставаться с суммами больше одного доллара.
Несложная математика показывала, что при конверсии 10% получить ARPU больше 10 центов — задача практически невыполнимая.
Тогда пришлось задуматься, как ещё можно монетизировать продукт. Рекламная модель уже очень хорошо работала в вебе, и можно было предположить, что скоро она расцветёт и на телефонах.
Вообще началом мобильной рекламной модели монетизации можно считать появление AdWhirl — сервиса, который позволял интегрировать SDK рекламных сетей и ротировать их. Его появление позволило поднять FillRate в среднем до 50% по рынку и сделать доход от рекламной модели хотя бы сопоставимым с однодолларовой продажей. Сам принцип имплементации всех возможных источников спроса и организации конкуренции между ними стал основным драйвером роста рекламной индустрии и продолжает эксплуатироваться по сей день.
Но чем сложнее система, тем менее стабильной она становится, что абсолютно неприемлемо для крупных сервисов уровня iFunny. Начав двигаться в этом направлении в 2011 году, компания создала один из самых эффективных механизмов работы с мобильной баннерной и нативной рекламой и увеличила показатель выручки на одного пользователя в 40 раз, что позволило развивать не только внутренние проекты, но и заняться инвестициями в другие компании.
MoPub и компания
С 2012 года мы перешли с AdWhirl на MoPub.
MoPub — это мобильная рекламная платформа с возможностью надстройки своих собственных модулей, которая включает в себя несколько больших инструментов:
- MoPub marketplace — собственная рекламная биржа;
- медиатор рекламных сетей для работы с внешними сетями;
- механизм заказов, позволяющий самостоятельно размещать баннеры в собственном приложении и настраивать их показы.
Основные достоинства MoPub:
- умеет работать с большинством рекламных сетей;
- понятный механизм подключения новых сторонних сетей;
- открытый исходный код;
- огромное количество базовых настроек и таргетингов;
- большое комьюнити вокруг сети, есть даже своя конференция.
Есть у MoPub и недостатки:
- не принимаются пул-реквесты на GitHub и вообще отсутствует реакция на них;
- панель управления очень сложная, и для разработчика при отладке требуется некоторое время, чтобы вникнуть в её структуру.
Сила в правде
Как говорил герой одного русского фильма: «Сила в правде». В этой части я расскажу о трудностях, с которыми нам, как разработчикам приложения, пришлось столкнуться после первых миллионов скачиваний iFunny, роста аудитории и рекламного трафика от более, чем 100 партнёров.
Контент
Рекламный рынок — очень закрытая «каста» технологических компаний, но при этом агрегаторы имеют большую сеть партнёров: от крупных компаний, которые работают с миллионными бюджетам, до мелких фирм, заточенных под конкретные целевые аудитории.
Эта закрытость и разрозненность партнёров, несмотря на премодерацию баннеров и достаточно жёсткие правила по рекламному контенту, позволяет не самым честным продавцам рекламы публиковать креативы, которые являются запрещённым или портят пользовательский опыт в приложении.
Можно выделить несколько основных категорий «непотребного» контента в рекламных баннерах:
- порно-контент. В последнее время его появляется всё меньше, но тем не менее он имеет место быть. Мы не можем публиковать данный контент в статье, поэтому картинки тут не будет
- системные алерты в баннерах, пример можно посмотреть у одного из пользователей twitter.com/IfunnyStates/status/1029393804749668352
- контент со звуком. Звуки не запрещены рекламными сетями, как и анимации, но если звук играет без взаимодействия с интерфейсом — это воспринимается пользователями как баг приложения и негативно влияет на пользовательский опыт
- привлечение внимания. Хороший баннер должен привлекать внимание пользователя, но не всегда это происходит честным образом: иногда в баннеры попадают мерцающие видео. Ещё один нечестный способ заставить пользователя тапнуть на баннер — имитировать интерфейс приложения, например так:
Кстати, в России обычный тап по этому баннеру может оформить платную подписку у некоторых операторов сотовой связи, и вы даже не узнаете об этом, пока не увидите детализацию. Это также нечестный способ работы с рекламой, но у операторов в США нет такой возможности.
Автоклики
Как показывает мой опыт, это крайне негативный для пользователей кейс. Используя возможности JavaScript, WKWebView или UIWebView, а также дыры внутри реализации рекламных библиотек, можно сделать рекламу, которая будет сама открывать контент баннера и уводить пользователя из приложения.
Для того чтобы повторить такую проблему на примере с MoPub, достаточно добавить в баннер javascript-код следующего содержания:
Это работало долго во многих версиях MoPub, вплоть до версии 4.13.
Исследуя реализацию MoPub, можно было генерировать более сложные ссылки, которые позволяли не только открывать рекламу на полный экран, но и отправлять пользователя в AppStore на определённое приложение и даже не учитывать показ баннера.
Кстати, в примечаниях к релизу версии 4.13.0 MoPub SDK для iOS нет информации об этом фиксе, так как это была достаточно серьёзная дыра в SDK, и нечестные партнёры MoPub эксплуатировали её достаточно активно. Как показывают логи, о которых расскажу дальше, ежедневно приходилось блокировать до 2 миллионов попыток открытия баннера без пользовательского взаимодействия с ним.
В случае с MoPub получилось найти и повторить проблему достаточно легко, но другие сети, с которыми работает iFunny, имеют закрытый код, и бороться с возникающими автокликами приходится посредствам блокировки баннеров или даже отключения сетей на некоторое время.
iFunny плотно работает со всеми рекламными партнёрами и сообщает им о таких баннерах. Так как молодая аудитория iFunny интересна рекламодателям, то партнёры охотно идут навстречу и убирают из ротации подобную рекламу.
Краши
Краши — это всегда плохо. Ещё хуже, когда они случаются из-за зависимости с закрытым кодом, и повлиять на них можно только косвенно. За годы работы с рекламой в iFunnу выделили для себя несколько типов крашей, которые можно разделить на несколько групп.
- Системные
Сюда относятся исключения в сетевой библиотеке, WKWebView(UIWebView), OpenGL.
Прямо повлиять на этот тип крашей очень сложно, но на некоторые повлиять всё же удалось, предварительно изучив работу WebView-компонента с WebGL.
Так выглядит стектрейс таких крашей:
1 libGPUSupportMercury.dylib gpus_ReturnNotPermittedKillClient + 12
2 AGXGLDriver gldUpdateDispatch + 7132
3 libGPUSupportMercury.dylib gpusSubmitDataBuffers + 172
4 AGXGLDriver gldUpdateDispatch + 12700
5 WebCore WebCore::GraphicsContext3D::reshape(int, int) + 524
6 WebCore WebCore::WebGLRenderingContextBase::initializeNewContext() + 712
7 WebCore WebCore::WebGLRenderingContextBase::WebGLRenderingContextBase(WebCore::HTMLCanvasElement*, WTF::RefPtr &&, WebCore::GraphicsContext3D::Attributes) + 512
8 WebCore WebCore::WebGLRenderingContext::WebGLRenderingContext(WebCore::HTMLCanvasElement*, WTF::PassRefPtr , WebCore::GraphicsContext3D::Attributes) + 36
9 WebCore WebCore::WebGLRenderingContextBase::create(WebCore::HTMLCanvasElement*, WebCore::WebGLContextAttributes*, WTF::String const&) + 1272
10 WebCore WebCore::HTMLCanvasElement::getContext(WTF::String const&, WebCore::CanvasContextAttributes*) + 520
11 WebCore WebCore::JSHTMLCanvasElement::getContext(JSC::ExecState&) + 212
12 JavaScriptCore llint_entry + 27340
13 JavaScriptCore llint_entry + 24756
14 JavaScriptCore llint_entry + 24756
15 JavaScriptCore llint_entry + 24756
16 JavaScriptCore llint_entry + 25676
17 JavaScriptCore llint_entry + 24756
18 JavaScriptCore llint_entry + 24656
19 JavaScriptCore vmEntryToJavaScript + 260
20 JavaScriptCore JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 164
21 JavaScriptCore JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 348
22 JavaScriptCore JSC::profiledCall(JSC::ExecState*, JSC::ProfilingReason, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&, WTF::NakedPtr &) + 160
23 WebCore WebCore::JSEventListener::handleEvent(WebCore::ScriptExecutionContext*, WebCore::Event*) + 980
24 WebCore WebCore::EventTarget::fireEventListeners(WebCore::Event&, WebCore::EventTargetData*, WTF::Vector &) + 616
25 WebCore WebCore::EventTarget::fireEventListeners(WebCore::Event&) + 324
26 WebCore WebCore::EventContext::handleLocalEvents(WebCore::Event&) const + 108
27 WebCore WebCore::EventDispatcher::dispatchEvent(WebCore::Node*, WebCore::Event&) + 876
28 WebCore non-virtual thunk to WebCore::HTMLScriptElement::dispatchLoadEvent() + 80
29 WebCore WebCore::ScriptElement::execute(WebCore::CachedScript*) + 360
30 WebCore WebCore::ScriptRunner::timerFired() + 456
31 WebCore WebCore::ThreadTimers::sharedTimerFiredInternal() + 144
32 WebCore WebCore::timerFired(__CFRunLoopTimer*, void*) + 24
33 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 24
34 CoreFoundation __CFRunLoopDoTimer + 868
35 CoreFoundation __CFRunLoopDoTimers + 240
36 CoreFoundation __CFRunLoopRun + 1568
37 CoreFoundation CFRunLoopRunSpecific + 440
38 WebCore RunWebThread(void*) + 452
39 libsystem_pthread.dylib _pthread_body + 236
40 libsystem_pthread.dylib _pthread_start + 280
41 libsystem_pthread.dylib thread_start + 0
Причём происходят они исключительно при уходе в фон. Это связно с тем, что движок OpenGL не должен работать, когда приложение находится в фоновом режиме.
Фикс здесь оказался достаточно простым:
При уходе в фон нужно забрать скриншот баннера.
Удалить рекламную View с экрана, чтобы WebView-компонент перестал использовать OpenGL.
При выходе из фона вернуть всё как было.
В коде на Objective-C это выглядит так:
- Интеграционные
Это проблемы, которые происходят на стыке iFunny, Mopub и провайдера рекламы.
Как правило, они возникают после обновления библиотеки провайдеров и из-за новых способов взаимодействия с ними.
Последний такой случай был в июне этого года, после очередного обновления одной из используемых библиотек. Новый способ инициализации библиотеки предлагал использовать синглтон для конфигурации настроек сети.
Обращение к нему дважды, как происходило в реализации, периодически вызывало фриз главного потока, поэтому пришлось обернуть инициализацию в dispatch_once.
QA-отдел iFunny умеет хорошо тестировать рекламные библиотеки, поэтому эта проблема была найдена в ходе тестирования обновления.
- Неожиданные
Этот тип крашей вообще не поддаётся контролю, так как происходит без каких-либо изменений в клиенте.
Связаны они с обновлением бэкенда у партнёров и отсутствием обратной совместимости. Такие краши часто происходят у крупных провайдеров рекламы, но быстро исправляются, так как действуют на большое количество приложений одновременно.
Были случаи, когда crash free iFunny за сутки опускалось со стандартных 99,8% до 80%, а количество гневных комментариев в сторе исчислялось десятками.
Производительность
Баннерная реклама, как правило, использует WebView-компоненты для отображения рекламы, поэтому каждый показанный баннер — это инициализация нового WebView со всеми его зависимостями.
Кроме того, часть партнёров использует WebView и для общения с собственными бэкендом, так как баннерная реклама на мобильных устройствах — это потомок рекламы в вебе.
Бывает, что после обновления находятся утечки памяти внутри новой библиотеки. После появления в Xcode инструмента Memory Graph находить утечки в сторонних библиотеках стало гораздо легче, поэтому сейчас удаётся оперативно сообщать о них партнёрам.
Ниже — гифка работы iFunny в простое, когда реклама для пользователя отсутствует:
Решения
Но несмотря на все проблемы, описанные выше, iFunny работает стабильно и каждый день вызывает улыбки у миллионов своих пользователей.
За годы активной работы с рекламой у команды разработки появилось несколько инструментов, которые позволяют успешно мониторить рекламные проблемы и вовремя реагировать на них.
Система логирования
Сейчас система логирования исключений в iFunny распространилась на всё приложение: для этого используется собственный бэкенд с базой на ClickHouse и отображением в Grafana.
Но первой задачей для работы с логами в приложении стало именно логирование исключительных ситуаций в рекламе.
Для определения факта переадресации в iFunny есть несколько связанных компонент. Расскажу подробнее о каждой из них.
IFAdView
Это наследник от класса MPAdView (он отвечает за показ рекламы в MoPub).
В этом классе переопределён метод hitTest:withEvent:
Таким образом, мы устанавливаем триггер на то, что пользователь взаимодействовал с рекламой.
IFURLProtocol
Наследуемся от NSURLProtocol и описываем метод:
Это триггер на открытие AppStore из приложения, мы перечисляем все доступные URL для этого.
IFAdsExceptionManager
Класс, который собирает в себя триггеры и генерирует запись исключения в лог.
Чтобы было понятно, какие есть триггеры, опишу каждый метод интерфейса этого класса.
Триггер, который определяет, что происходит редирект в iTunes.
Триггер для определения потери активности приложением. В нём происходит сравнение двух предыдущих триггеров.
Сброс триггеров. Вызываем при уходе в фон или когда открываем AppStore сами, например, когда отправляем пользователя поставить оценку в старых версиях iOS.
Свойства для записи последней успешно или неуспешно запрошенной и загруженной рекламы. Нужны для формирования сообщения в лог.
Видно, что алгоритм получился достаточно простым, но эффективным. Он позволяет отслеживать нам не только автооткрытия из MoPub, но и из других сетей.
В последнее время реклама с автооткрытием часто открывает SKStoreProductViewController, поэтому сейчас мы работаем над определением автооткрытия этого контроллера. Алгоритм определения этого исключения будет несколько сложнее, но здесь нам поможет Objective-C Runtime.
Локальный стенд
На основе системы логирования в iFunny также начали разрабатывать локальный стенд, чтобы в реальном времени получать и отлаживать рекламу, которую видят пользователи.
Стенд состоит из:
- билд-агента
- устройства
- набора тестов для каждого провайдера
Одно из интересных решений, которое используется на стенде, — IDFA из жалоб пользователей для получения реальной рекламы.
Примерно с 2016 года мы перестали получать реальную рекламу, таргетированную на США, используя только VPN, поэтому приходится подменять IDFA устройства на IDFA реальных пользователей.
Делается это достаточно легко с использованием Objective-C Runtime и свизлинга.
Нужно подменить метод advertisingIdentifier у класса ASIdentifierManager.
Здесь мы делаем это через категорию:
Для передачи с билд-агента пользовательского IDFA в билд используется метод, описанный в статье.
В заключении хочется сказать, что баннерная реклама отлично работает в США, и за семь лет её активного использования как основного способа монетизации в iFunny научились с ней хорошо работать.
Но несмотря на то, что баннеры приносят 75% доходов компании, постоянно ведётся работа над альтернативными способами монетизации и уже накоплен некоторый опыт в нативной рекламе и использовании рекламных аукционов на рынке США.
Источник