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は残りを処理します。シナリオのすべての条件が満たされると、 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
}
}1つ以上のシナリオ構造体の条件を混合することを決定した場合、さらに複雑なストーリーを実装できます。もちろん、アプリ全体でイベントトリガーやシナリオ実行を散布することもできます。同じファイルにある必要はありません。
実装は標準のUserDefaultsに基づいているため、アプリが再インストールされた場合、データは持続しません。 UserDefaultsキー名はstruct名で生成されるため、structの名前を変更すると、すべてのデータがリセットされます。 reset()メソッドを使用して、永続的なデータをリセットすることもできます。
あなたのCartfileで:
github "pawurb/WaitForIt" ~> 2.0.0
あなたのPodfileで:
platform :ios , '10.0'
use_frameworks!
target 'TargetName' do
pod 'WaitForIt'
end LIBは生産に使用されていますが、開発の初期段階にあります。どのように改善できるかについての提案は歓迎されます。