рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рд┐рдлреНрдЯ рдкрд░ рдХреИрд╕реЗ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдФрд░ рдкреИрд╕реЗ рдХрдорд╛рдПрдВ


рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореЗрд░рд╛ рдирд╛рдо рд╕рд╛рд╢рд╛ рдЬрд╝рд┐рдорд┐рди рд╣реИ, рдореИрдВ рд▓рдиреНрджрди рдХреЗ рдСрдлрд╝рд┐рд╕ рдСрдлрд╝ рдж рдмреБрд╢ рдореЗрдВ рдПрдХ iOS рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реВрдБ ред рдЙрддреНрдкрд╛рдж рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд╢ рдХрд╛ рдмрд╣реБрдд рдХрд░реАрдмреА рд░рд┐рд╢реНрддрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдЙрди рд╕рднреА рдкрд░рд┐рдХрд▓реНрдкрдирд╛рдУрдВ рдХреЛ рдкрд░рдЦрдиреЗ рдХреА рдЖрджрдд рдбрд╛рд▓ рд▓реА рд╣реИ рдЬреЛ рдЙрддреНрдкрд╛рдж рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЬрд┐рд╕ рд░реВрдкрд░реЗрдЦрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА, рд╡рд╣ рджреЛ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреА рдЧрдИ рдереАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрднрд╡ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЧрд▓рдд рдбреЗрдЯрд╛ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдбреЗрдЯрд╛ рдЬреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдФрд░ рдЬрд▓рд╛рдК рд▓рдХрдбрд╝реА рдореЗрдВ рддреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рджреВрд╕рд░реЗ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдЖрдЗрдП рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ рдХрд┐ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХреНрдпрд╛ рд╣реИрдВред

рдЖрдЬрдХрд▓, рд▓рд╛рдЦреЛрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рд░ рджрд┐рди рдирдП рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдиреЗ рдХрдИ рдХрдВрдкрдирд┐рдпреЛрдВ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкреНрд╕ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрд╕рдВрдзрд╛рди рдФрд░ рдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдХреМрди рд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЙрдирдХреЗ рдЙрддреНрдкрд╛рдж рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рддреА рд╣реИрдВ рдФрд░ рдХрд┐рди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг (рдпрд╛ рдП / рдмреА рдкрд░реАрдХреНрд╖рдг) рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯ рдкрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдбреЗрдореЛ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред рдпрджрд┐ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдП / рдмреА рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕реАрдзреЗ рдХреЛрдб рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрдкреНрд▓рд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп


рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг, рдпрд╛ рдП / рдмреА рдкрд░реАрдХреНрд╖рдг (рдпрд╣ рд╢рдмреНрдж рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЗ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдореВрд╣ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ), рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рдмреЗрд╣рддрд░ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣реЛрдВ рдкрд░ рдХрд┐рд╕реА рдЙрддреНрдкрд╛рдж рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдореЗрдВ рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдмреБрд╢ рдореЗрдВ, рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреГрд╖реНрда рдкреБрд░рд╛рдирд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдмреИрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЛ рднреА рд╕реБрдзрд╛рд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рддреАрди рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд┐рдпрд╛:

  1. рдкреБрд░рд╛рдиреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓
  2. рдирдпрд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд╕рдВрд╕реНрдХрд░рдг 1
  3. рдирдпрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕реНрдХрд░рдг 2

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рд╡рд┐рдХрд▓реНрдк рдереЗ, рдЬреИрд╕реЗ рдХрд┐ рдП / рдмреА / рд╕реА рдкрд░реАрдХреНрд╖рдг (рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо "рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ)ред

рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓ рджреЗрдЦреЗ:



рдЙрддреНрдкрд╛рдж рдкреНрд░рдмрдВрдзрдХ рдХрдВрд╕реЛрд▓ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдмрдиреЗ рд╣реИрдВ рдФрд░ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╣реИрдВ:



рд╢рд╛рдпрдж рдЖрдк рдкреВрдЫреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ control_check рдХреНрдпреЛрдВ рд╣реИ (рдпрджрд┐ control_check рдирд┐рдпрдВрддреНрд░рдг рд╕рдореВрд╣ рдХреЗ рддрд░реНрдХ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИ)? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрдИ рд╕рдВрдХреЗрддрдХреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХрднреА рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рди рдХрд┐ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ред

рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рд╕рдВрдХреЗрддрдХ рдмрджрд▓ рдЧрдП рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдирд┐рдпрдВрддреНрд░рдг_ рд╕рдореВрд╣ рдХреЗ рдЕрдВрджрд░ рд╕рдорд╛рди рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд░рд╛рдп рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрднрд╡рдЬрдиреНрдп рд╕рд╛рдХреНрд╖реНрдп рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдорд╛рдг рд╣реИрдВред рдЙрддреНрдкрд╛рдж рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреА рдЯреАрдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреА рд╣реИ рдФрд░ рд╕рдордЭрддреА рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдХрд▓реНрдк рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИред

рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ


рдЙрджреНрджреЗрд╢реНрдп:

  1. рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб (рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛) рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдПрдВред
  2. рдЧрд▓рддреА рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдореЗрдВ рдЪрдпрдирд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рд╣реЗрдЬреЗрдВред
  3. рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЪрдпрдирд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рднреЗрдЬреЗрдВред
  4. рд╕реНрд╡рд┐рдлреНрдЯ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЕрдзрд┐рдХрддрдо рд▓рд╛рдн рдЙрдард╛рдПрдВред

PS рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдХреЗ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдЕрд╡рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдкреНрд░рдпреЛрдЧ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдРрдк рд╕реНрдЯреЛрд░ рдореЗрдВ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реМрдЯ рд╕рдХрддреЗред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж:

  1. рдкреНрд░рдпреЛрдЧ рдХреЗ рджреМрд░рд╛рди, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, UserDefaults, Realm, SQLite рдпрд╛ Core Data) рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реМрдВрдкреЗ рдЧрдП рдореВрд▓реНрдп (рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдореВрд▓реНрдп) рдХреЛ рдЗрд╕рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВред
  • рдХреЛрдИ рднреА рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рд╕реЗрд╡рд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдореНрдкреНрд▓реАрдЯреНрдпреВрдб рдпрд╛ рдлреЗрд╕рдмреБрдХ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕) рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдЙрд╕ рд╕рдордп рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рднреЗрдЬрддреА рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╡рд┐рднрд╛рдЬрд┐рдд рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рднрд╡рд┐рд╖реНрдп рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рдЪрд┐рддреНрд░ рд╣реИ:



рд╕реНрдкреНрд▓рд┐рдЯрдЯреЗрд╕реНрдЯрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдХрдИ рд╡рд┐рдХрд▓реНрдк (рд╕рдореВрд╣) рд╣реЛрдВрдЧреЗ рдЬреЛ рд╕реНрдкреНрд▓рд┐рдЯрдЯреЗрд╕реНрдЯрдЧреНрд░реБрдкрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ ред

рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ AnalyticsProtocol рд╣реЛрдЧрд╛ред

рд╕рд░реНрд╡рд┐рд╕ рд╕реНрдкреНрд▓рд┐рдЯреНрд╕рдЯрд╛рдЗрдВрдЧ рд╕рд░реНрд╡рд┐рд╕ рд╕реЗрд╡ рдХрд░реЗрдЧреА, рдСрдкреНрд╢рдВрд╕ рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдЧреА рдФрд░ рд╕рднреА рд╕реНрдкреНрд▓рд┐рдЯ рдЯреЗрд╕реНрдЯ рдХреЛ рдореИрдиреЗрдЬ рдХрд░реЗрдЧреАред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯреЛрд░реЗрдЬрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдФрд░ рд╕рд╛рде рд╣реА рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕реНрдкреНрд▓рд┐рдЯрдЯреЗрд╕реНрдЯреНрд░реЛрдХреЙрд▓реЛрдХ рддрдХ рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИ ред


рдЖрдЗрдП AnalyticsProtocol рдФрд░ StorageProtocol рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ:

protocol AnalyticsServiceProtocol {    func setOnce(value: String, for key: String) } protocol StorageServiceProtocol {    func save(string: String?, for key: String)    func getString(for key: String) -> String? } 

рдПрдХ рдШрдЯрдирд╛ рдХреЛ рдПрдХ рдмрд╛рд░ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХреА рднреВрдорд┐рдХрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдЯрди A_color рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ A рдиреАрд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рд╣реИ, рдЬрдм рд╡рд╣ рдЗрд╕ рдмрдЯрди рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реАрди рджреЗрдЦрддрд╛ рд╣реИред

рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рднреВрдорд┐рдХрд╛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ ( рд╕реНрдкреНрд▓рд┐рдЯрд┐рдВрдЧрд╕реНрдЯреНрд░реАрдо рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рдж рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ) рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╣рд░ рдмрд╛рд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред

рддреЛ, рдЖрдЗрдП рд╕реНрдкреНрд▓рд┐рдЯрдЯреЗрд╕реНрдЯрдЧреНрд░реБрдкрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ , рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ:

 protocol SplitTestGroupProtocol: RawRepresentable where RawValue == String {   static var testGroups: [Self] { get } } 

рдЪреВрдВрдХрд┐ RawRepresentable рдЬрд╣рд╛рдВ RawValue рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдПрдХ рд╡реЗрд░рд┐рдПрдВрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдФрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕реНрдкреНрд▓рд┐рдЯрдЯреЗрд╕реНрдЯрдЧреНрд░реБрдкрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдЯреЗрд╕реНрдЯрдЧреНрд░реБрдк рдХреА рдПрдХ рд╕рд░рдгреА рднреА рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреА рд╣реИ (рдпрд╣ рд╕рд░рдгреА рдЙрдкрд▓рдмреНрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдЧреА)ред

рдпрд╣ рд╕реНрдкреНрд▓рд┐рдЯрдЯреЗрд╕реНрдЯрдкреНрд░реЛрдЯреЛрдХреЛрд▓ рд╕реНрдкреНрд▓рд┐рдЯ рдЯреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ :

 protocol SplitTestProtocol {   associatedtype GroupType: SplitTestGroupProtocol   static var identifier: String { get }   var currentGroup: GroupType { get }   var analytics: AnalyticsServiceProtocol { get }   init(currentGroup: GroupType, analytics: AnalyticsServiceProtocol) } extension SplitTestProtocol {   func hitSplitTest() {       self.analytics.setOnce(value: self.currentGroup.rawValue, for: Self.analyticsKey)   }   static var analyticsKey: String {       return "split_test-\(self.identifier)"   }   static var dataBaseKey: String {       return "split_test_database-\(self.identifier)"   } } 

рд╕реНрдкреНрд▓рд┐рдЯрд╕реНрдЯрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  1. рдПрдХ GroupType рдкреНрд░рдХрд╛рд░ рдЬреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SplitTestGroupProtocol рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
  2. рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдХреА рдФрд░ рднрдВрдбрд╛рд░рдг рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ ред
  3. рд╕реНрдкреНрд▓рд┐рдЯрдЯреЗрд╕реНрдЯрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рд╕рдореВрд╣ рдЪрд░ред
  4. HitSplitTest рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдХреА рдирд┐рд░реНрднрд░рддрд╛ред
  5. рдФрд░ рд╣рд┐рдЯрд╕реНрдкреНрд▓рд┐рдЯрдЯреЗрд╕реНрдЯ рд╡рд┐рдзрд┐, рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрд╛ рдерд╛ред

HitSplitTest рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рди рдХреЗрд╡рд▓ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рднреА рджреЗрдЦрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдРрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЦрд░реАрджрд╛рд░реА рдЕрдиреБрднрд╛рдЧ "saw_red_button_on_purcahse_screen" рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░реЗрдЧрд╛ред

рдЕрдм рд╣рдо SplitTestingService рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ:

 protocol SplitTestingServiceProtocol {   func fetchSplitTest<Value: SplitTestProtocol>(_ splitTestType: Value.Type) -> Value } class SplitTestingService: SplitTestingServiceProtocol {   private let analyticsService: AnalyticsServiceProtocol   private let storage: StorageServiceProtocol   init(analyticsService: AnalyticsServiceProtocol, storage: StorageServiceProtocol) {       self.analyticsService = analyticsService       self.storage = storage   }   func fetchSplitTest<Value: SplitTestProtocol>(_ splitTestType: Value.Type) -> Value {       if let value = self.getGroup(splitTestType) {           return Value(currentGroup: value, analytics: self.analyticsService)       }       let randomGroup = self.randomGroup(Value.self)       self.saveGroup(splitTestType, group: randomGroup)       return Value(currentGroup: randomGroup, analytics: self.analyticsService)   }   private func saveGroup<Value: SplitTestProtocol>(_ splitTestType: Value.Type, group: Value.GroupType) {       self.storage.save(string: group.rawValue, for: Value.dataBaseKey)   }   private func getGroup<Value: SplitTestProtocol>(_ splitTestType: Value.Type) -> Value.GroupType? {       guard let stringValue = self.storage.getString(for: Value.dataBaseKey) else {           return nil       }       return Value.GroupType(rawValue: stringValue)   }   private func randomGroup<Value: SplitTestProtocol>(_ splitTestType: Value.Type) -> Value.GroupType {       let count = Value.GroupType.testGroups.count       let random = Int.random(lower: 0, count - 1)       return Value.GroupType.testGroups[random]   } } 

PS рдЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣рдо Int.random рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдпрд╣рд╛рдВ , рд▓реЗрдХрд┐рди рд╕реНрд╡рд┐рдлреНрдЯ 4.2 рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ fetSplitTest рд╡рд┐рдзрд┐ рдФрд░ рддреАрди рдирд┐рдЬреА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ: saveGroup , getGroup , randomGroup ред

рд░реИрдВрдбрдордЧреНрд░реБрдк рд╡рд┐рдзрд┐ рдЪрдпрдирд┐рдд рд╕реНрдкреНрд▓рд┐рдЯ рдЯреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдВрдбрдо рд╡реЗрд░рд┐рдПрдВрдЯ рддреИрдпрд╛рд░ рдХрд░рддреА рд╣реИ, рдЬрдмрдХрд┐ рдЧреЗрдЯрдЧреНрд░реБрдк рдФрд░ рд╕реЗрд╡рдЧреНрд░реБрдк рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдкреНрд▓рд┐рдЯ рдЯреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдмрдЪрд╛рдиреЗ рдпрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдореБрдЦреНрдп рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд╛рд░реНрдп рд╣реИ fetchSplitTest: рдпрд╣ рдирд┐рд░рдВрддрд░ рднрдВрдбрд╛рд░рдг рд╕реЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдЕрдЧрд░ рдпрд╣ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрдЪрд╛рддрд╛ рд╣реИред



рдЕрдм рд╣рдо рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ:

 final class ButtonColorSplitTest: SplitTestProtocol {   static var identifier: String = "button_color"   var currentGroup: ButtonColorSplitTest.Group   var analytics: AnalyticsServiceProtocol   init(currentGroup: ButtonColorSplitTest.Group, analytics: AnalyticsServiceProtocol) {       self.currentGroup = currentGroup       self.analytics = analytics   }   typealias GroupType = Group   enum Group: String, SplitTestGroupProtocol {       case red = "red"       case blue = "blue"       case darkGray = "dark_gray"       static var testGroups: [ButtonColorSplitTest.Group] = [.red, .blue, .darkGray]   } } extension ButtonColorSplitTest.Group {   var color: UIColor {       switch self {       case .blue:           return .blue       case .red:           return .red       case .darkGray:           return .darkGray       }   } } 

рдпрд╣ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЪрд┐рдВрддрд╛ рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ: рдЬреИрд╕реЗ рд╣реА рдЖрдк рд╕реНрдкреНрд▓рд┐рдЯрдЯреЗрд╕реНрдЯрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧрд╛ред

рдпрд╣рд╛рдБ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдПрдирдо рд╕рдореВрд╣ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕рднреА рд╕рдореВрд╣реЛрдВ рдХреЛ рдЗрд╕рдореЗрдВ (рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓рд╛рд▓, рдиреАрд▓рд╛ рдФрд░ рдбрд╛рд░реНрдХрдЧреНрд░реЗ рдореЗрдВ) рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдореЗрдВ рд╕рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди ButtonColorSplitTest.Group рд╣реИ , рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╕реНрд╡рд┐рдлреНрдЯ рдХреА рдкреВрд░реА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм AnalyticsProtocol рдФрд░ StorageProtocol рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ :

 extension UserDefaults: StorageServiceProtocol {   func save(string: String?, for key: String) {       self.set(string, forKey: key)   }   func getString(for key: String) -> String? {       return self.object(forKey: key) as? String   } } 

StorageProtocol рдХреЗ рд▓рд┐рдП рд╣рдо UserDefaults рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЖрдк рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕реНрдерд┐рд░ рднрдВрдбрд╛рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдХрд┐рдЪреЗрди рдХреЛ рдЪреБрдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА рд╕рдореВрд╣ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ)ред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдореНрдкреНрд▓рд┐рдЯреНрдпреВрдб рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 // Dummy class for example, use something real, like Amplitude class Analytics {   func logOnce(property: NSObject, for key: String) {       let storageKey = "example.\(key)"       if UserDefaults.standard.object(forKey: storageKey) == nil {           print("Log once value: \(property) for key: \(key)")           UserDefaults.standard.set("", forKey: storageKey) // String because of simulator bug       }   } } extension Analytics: AnalyticsServiceProtocol {   func setOnce(value: String, for key: String) {       self.logOnce(property: value as NSObject, for: key)   } } 

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ:

 let splitTestingService = SplitTestingService(analyticsService: Analytics(),                                                      storage: UserDefaults.standard) let buttonSplitTest = splitTestingService.fetchSplitTest(ButtonColorSplitTest.self) self.button.backgroundColor = buttonSplitTest.currentGroup.color buttonSplitTest.hitSplitTest() 

рдмрд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ, рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдирд┐рдХрд╛рд▓реЗрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЖрдкрдХреЛ buttonSplitTest.currentGroup.color. рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ buttonSplitTest.currentGroup.color.

рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рджреМрд░рд╛рди, рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ( рд▓реЙрдЧ рдПрдХ рдмрд╛рд░ рдорд╛рди рд▓реЗрдВ ) : рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрд┐рдд_ рдмрдЯрди-рдмрдЯрди_рд░рдВрдЧ: dark_gray , рдФрд░ рдпрджрд┐ рдЖрдк рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдмрдЯрди рд╣рд░ рдмрд╛рд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред



рдЗрд╕ рддрд░рд╣ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдмрди рдЬрд╛рдПрдЧрд╛ред

рдпрд╣рд╛рдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ: рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдореЗрдВ, рд╣рдордиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЦреЗрд▓ рдореБрджреНрд░рд╛ рдЦрд░реАрджрдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдЧреБрдгрд╛рдВрдХ рд╕реЗ рдЦрдВрдбрд┐рдд рдХрд┐рдпрд╛ред



рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдХрднреА рдЗрд╕ рдХрдард┐рдирд╛рдИ рдХрд╛рд░рдХ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ (рдХреЛрдИ рдирд╣реАрдВ) рд╢рд╛рдпрдж рд╕рднреА рдореЗрдВ рдирд╣реАрдВ рдЦреЗрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЦреЗрд▓ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦрд░реАрджрддреЗ рд╣реИрдВ (рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ), рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╡рд┐рднрд╛рдЬрди рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо (рдЙрддреНрдкрдиреНрди рд╕рдВрд╕реНрдХрд░рдг) рдХреЛ рдПрдХ рд╕рдордп рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдХрдард┐рдирд╛рдИ рдХрд╛рд░рдХ рдХреЗ рдмрд┐рдирд╛, рдХреЗрд╡рд▓ 2% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдЦреЗрд▓ рдореБрджреНрд░рд╛ рдЦрд░реАрджреАред рдПрдХ рдЫреЛрдЯреЗ рдЕрдиреБрдкрд╛рдд рдХреЗ рд╕рд╛рде, рдЦрд░реАрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 3% рдереАред рдФрд░ рдПрдХ рдЙрдЪреНрдЪ рдХрдард┐рдирд╛рдИ рдХрд╛рд░рдХ рдХреЗ рд╕рд╛рде, 4% рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдиреЗ рдореБрджреНрд░рд╛ рдЦрд░реАрджреАред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдЧреБрдгрд╛рдВрдХ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред :)

рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХрддрдо рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

рдЙрд╕ рдЕрджреНрднреБрдд рдЯреАрдо рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдЗрд╕ рд▓реЗрдЦ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдЗрдЧреЛрд░ , рдХреЗрд▓реА рдФрд░ рд╣рд┐рд░реЛ ) рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреАред

рд╕рдВрдкреВрд░реНрдг рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

Source: https://habr.com/ru/post/hi416841/


All Articles