Waitforit делает реализацию общих сценариев приложения для iOS на бриз:
Работа с такого рода логикой обычно включает в себя вручную сохранение данных UserDefaults и необходимо переделать с нуля для каждого сценария.
Waitforit предоставляет простой декларативный API, позволяющий обрабатывать большинство возможных сценариев, не беспокоясь о поддержании реализации.
ScenarioProtocol обладает следующими свойствами, которые можно использовать для определения, когда должен быть выполнен сценарий:
protocol ScenarioProtocol {
// minimum number of scenario events needed to be trigerred before scenario can be executed
static var minEventsRequired : Int ? { get set }
// maximum number of scenario events which can be trigerred before scenario stops executing
static var maxEventsPermitted : Int ? { get set }
// maximum number of times that scenario can be executed
static var maxExecutionsPermitted : Int ? { get set }
// minimum time interval, after the first scenario event was trigerred, before the scenario can be executed
static var minSecondsSinceFirstEvent : TimeInterval ? { get set }
// minimum time interval, after the last scenario event was trigerred, before the scenario can be executed
static var minSecondsSinceLastEvent : TimeInterval ? { get set }
// minimum time interval before scenario can be executed again after previous execution
static var minSecondsBetweenExecutions : TimeInterval ? { get set }
// custom conditions closure
static var customConditions : ( ( ) -> Bool ) ? { get set }
} Сценарий - это простая структура, которая реализует одну функцию config . Вы используете его для настройки значений, определяющих при выполнении данного сценария.
Вы можете работать на структуре сценария, используя статические методы:
// increment scenario specific event counter
static func triggerEvent ( )
// try to execute a scenario (it counts as executed only if bool param passed into a block was `true`)
static func tryToExecute ( completion : @escaping ( Bool ) -> Void )
// reset scenario event and execution counters
static func reset ( )Допустим, вы хотите отобразить экран обучения только один раз:
import WaitForIt
struct ShowTutorial : ScenarioProtocol {
static func config ( ) {
maxExecutionsPermitted = 1
}
}
// In ViewController.swift
func viewDidLoad ( ) {
super . viewDidLoad ( )
ShowTutorial . tryToExecute { didExecute in
if didExecute {
self . showTutorial ( )
}
}
} Вот и все! Вам больше не нужно иметь дело с UserDefaults самостоятельно. Просто настройте структуру с правильными условиями выполнения, а LIB позаботится об остальном. Когда все условия для вашего сценария будут выполнены, значение Bool, передаваемое внутри блока tryToExecute , будет true .
Давайте попробуем немного более сложный сценарий. Вы хотите попросить пользователя купить подписку, если он установил приложение не менее 1 недели назад и включил его не менее 5 раз. Вы хотите спросить его раз в 2 дня, но не более 4 раза:
import WaitForIt
struct AskToSubscribe : ScenarioProtocol {
static func config ( ) {
minEventsRequired = 5
minSecondsSinceFirstEvent = 604 800 // seconds in one week
maxExecutionsPermitted = 4
minSecondsBetweenExecutions = 172 800 // seconds in two days
}
}
// In AppDelegate.swift
func application ( _ application : UIApplication ,
didFinishLaunchingWithOptions launchOptions : [ UIApplicationLaunchOptionsKey : Any ] ? ) -> Bool {
AskToSubscribe . triggerEvent ( )
AskToSubscribe . tryToExecute { didExecute in
if didExecute {
self . askToSubscribe ( )
}
}
return true
}Если для вашего сценария не хватает условий на основе времени и количества событий, вы также можете определить настраиваемое закрытие условий. Он будет оцениваться каждый раз, когда вы пытаетесь выполнить сценарий:
struct ShowLowBrightnessAlertOnce : ScenarioProtocol {
static func config ( ) {
customConditions = {
return UIScreen . main . brightness < 0.3
}
maxExecutionsPermitted = 1
}
}Еще более сложные истории могут быть реализованы, если вы решили смешать условия из более одного сценария. Конечно, вы также можете разбросить триггеры событий и выполнения сценариев по всему приложению, они не должны находиться в одном файле.
Реализация основана на стандартных UserDefaults поэтому данные не будут сохраняться, если приложение будет переустановлено. Имена ключей UserDefaults генерируются с именами структур, поэтому переименование структуры сбросит все свои данные. Вы также можете сбросить сохраняемые данные с помощью метода reset() .
В вашем Cartfile :
github "pawurb/WaitForIt" ~> 2.0.0
В вашем Podfile :
platform :ios , '10.0'
use_frameworks!
target 'TargetName' do
pod 'WaitForIt'
end LIB используется в производстве, но он все еще находится на ранней стадии развития. Приветствуются предложения о том, как это можно улучшить.