IOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдСрдЯреЛ-рд░рд┐рдиреНрдпреВрдПрдмрд▓ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╛рдЗрдб

рдЫрд╡рд┐


рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореЗрд░рд╛ рдирд╛рдо рдбреЗрдирд┐рд╕ рд╣реИ, рдореИрдВ Apphud рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ , рдЬреЛ рдХрд┐ iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдСрдЯреЛ-рд░рд┐рдиреНрдпреВрдПрдмрд▓ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рд╣реИред


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


рдРрдк рд╕реНрдЯреЛрд░ рдХрдиреЗрдХреНрдЯ рдкрд░ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд╕реЗрдЯ рдХрд░реЗрдВ


рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдмрдВрдбрд▓ рдЖрдИрдбреА рдФрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░реЗрдВ:


рдЖрдкрдХреЛ Apple рдбреЗрд╡рд▓рдкрд░ рдкреЛрд░реНрдЯрд▓ рдкрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмрдВрдбрд▓ рдЖрдИрдбреА (рдРрдк рдЖрдИрдбреА) рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рдорд╛рдг рдкрддреНрд░, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рдПрдХ рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВред рдЬреВрди 2019 рдореЗрдВ, Apple рдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ ASC (рдРрдк рд╕реНрдЯреЛрд░ рдХрдиреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреЛрд░реНрдЯрд▓ рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред


2019 рдореЗрдВ Apple рдбреЗрд╡рд▓рдкрд░ рдкреЛрд░реНрдЯрд▓ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди
2019 рдореЗрдВ Apple рдбреЗрд╡рд▓рдкрд░ рдкреЛрд░реНрдЯрд▓ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди



рд╕реНрдкрд╖реНрдЯ рдмрдВрдбрд▓ рдЖрдИрдбреА рдЖрдорддреМрд░ рдкрд░ рдбреЛрдореЗрди рд╢реИрд▓реА ( com.apphud.subscriptionstest ) рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрддреА рд╣реИред рдХреНрд╖рдорддрд╛рдУрдВ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрди-рдРрдк рдЦрд░реАрджрд╛рд░реА рдХреЗ рдЖрдЧреЗ рд╡рд╛рд▓рд╛ рдЪреЗрдХрдорд╛рд░реНрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪреЗрдХ рдХрд┐рдпрд╛ рд╣реБрдЖ рд╣реИред рдмрдВрдбрд▓ рдЖрдИрдбреА ( рдРрдк рдЖрдИрдбреА ) рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдРрдк рд╕реНрдЯреЛрд░ рдХрдиреЗрдХреНрдЯ рдкрд░ рдЬрд╛рдПрдВред


рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛)


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


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдкрддреНрд░
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдкрддреНрд░


рдкрд░реАрдХреНрд╖рдХ рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдк рдХрд┐рд╕реА рднреА рдЧреИрд░-рдореМрдЬреВрдж рдбреЗрдЯрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдлрд┐рд░ рдИрдореЗрд▓ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рди рднреВрд▓реЗрдВ!

рдореИрдВ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдЦрд░реАрджрд╛рд░реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред


рдПрдХ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрджрдо " рд╕рдордЭреМрддреЗ, рдХрд░реЛрдВ рдФрд░ рдмреИрдВрдХрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ " рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЕрдиреБрдмрдВрдз рдФрд░ рдмреИрдВрдХ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреБрдмрдВрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдСрдЯреЛ-рдЕрдХреНрд╖рдп рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ!


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


рдкреИрдХреЗрдЬ рдЖрдИрдбреА рдЖрдкрдХреА рдмрдВрдбрд▓ рдЖрдИрдбреА рд╣реИ
рдкреИрдХреЗрдЬ рдЖрдИрдбреА рдЖрдкрдХреА рдмрдВрдбрд▓ рдЖрдИрдбреА рд╣реИ


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ ред


рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдпрд╣рд╛рдВ рд╕реЗ рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрд╡рддрдГ-рдирд╡реАрдХрд░рдгреАрдп рд╕рджрд╕реНрдпрддрд╛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрдИ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ:


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


2. рд╕рджрд╕реНрдпрддрд╛ рдбреЗрдЯрд╛ рдореЗрдВ рднрд░рдирд╛: рдЕрд╡рдзрд┐, рдРрдк рд╕реНрдЯреЛрд░ рдореЗрдВ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ (рдХреЗрд╡рд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рди рд╣реЛрдВ) рдФрд░ рд╡рд┐рд╡рд░рдгред рдпрджрд┐ рдЖрдк рд╕рдореВрд╣ рдореЗрдВ рдкрд╣рд▓реА рд╕рджрд╕реНрдпрддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдореВрд╣ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдирд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╕рд╣реЗрдЬрдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ, ASC рдХрд┐рд╕реА рднреА рдХреНрд╖рдг рдлреНрд░реАрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рдмрдВрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рд╕рджрд╕реНрдпрддрд╛ рдкреГрд╖реНрда
рд╕рджрд╕реНрдпрддрд╛ рд╕реНрдХреНрд░реАрди


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


рд╕рд╛рдЭрд╛ рдХреБрдВрдЬреА рд╕рд╛рдЭрд╛рдХрд░рдг


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


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


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рддреАрди рд╕рджрд╕реНрдпрддрд╛ рд╕рдореВрд╣ рдФрд░ 3 рд╡рд╛рд░реНрд╖рд┐рдХ рд╕рджрд╕реНрдпрддрд╛рдПрдБ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рддреАрди рд╕рджрд╕реНрдпрддрд╛ рд╕рдореВрд╣ рдФрд░ 3 рд╡рд╛рд░реНрд╖рд┐рдХ рд╕рджрд╕реНрдпрддрд╛рдПрдБ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред


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


рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ


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


  1. рдЦрд░реАрджрд╛рд░реА рдХрд░рддреЗ рд╕рдордп


  2. рд╕рджрд╕реНрдпрддрд╛ рд╕реНрдерд┐рддрд┐ рдЬрд╛рдВрдЪреЗрдВ


  3. рдЕрджреНрдпрддрди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ


  4. рд▓реЗрди-рджреЗрди рдХреА рд╡рд╕реВрд▓реА (рдЪреЗрдХ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдХреА рдирд╣реАрдВ!)



рдЦрд░реАрджрд╛рд░реА рдХрд░рддреЗ рд╕рдордп


рд╕рдВрдкреВрд░реНрдг рдЦрд░реАрдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ 2 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ ( SKProduct рд╡рд░реНрдЧ) рдФрд░ рдЦрд░реАрдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛ ( SKPayment class)ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ SKPaymentTransactionObserver рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


 // Starts products loading and sets transaction observer delegate @objc func startWith(arrayOfIds : Set<String>!, sharedSecret : String){ SKPaymentQueue.default().add(self) self.sharedSecret = sharedSecret self.productIds = arrayOfIds loadProducts() } private func loadProducts(){ let request = SKProductsRequest.init(productIdentifiers: productIds) request.delegate = self request.start() } public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { products = response.products DispatchQueue.main.async { NotificationCenter.default.post(name: IAP_PRODUCTS_DID_LOAD_NOTIFICATION, object: nil) } } func request(_ request: SKRequest, didFailWithError error: Error){ print("error: \(error.localizedDescription)") } 

IAP_PRODUCTS_DID_LOAD_NOTIFICATION рд╕реВрдЪрдирд╛ IAP_PRODUCTS_DID_LOAD_NOTIFICATION рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ UI рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдЧрд▓рд╛, рд╣рдо рдЦрд░реАрдж рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:


 func purchaseProduct(product : SKProduct, success: @escaping SuccessBlock, failure: @escaping FailureBlock){ guard SKPaymentQueue.canMakePayments() else { return } guard SKPaymentQueue.default().transactions.last?.transactionState != .purchasing else { return } self.successBlock = success self.failureBlock = failure let payment = SKPayment(product: product) SKPaymentQueue.default().add(payment) } 

SKPaymentTransactionObserver рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 extension IAPManager: SKPaymentTransactionObserver { public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction in transactions { switch (transaction.transactionState) { case .purchased: SKPaymentQueue.default().finishTransaction(transaction) notifyIsPurchased(transaction: transaction) break case .failed: SKPaymentQueue.default().finishTransaction(transaction) print("purchase error : \(transaction.error?.localizedDescription ?? "")") self.failureBlock?(transaction.error) cleanUp() break case .restored: SKPaymentQueue.default().finishTransaction(transaction) notifyIsPurchased(transaction: transaction) break case .deferred, .purchasing: break default: break } } } private func notifyIsPurchased(transaction: SKPaymentTransaction) { refreshSubscriptionsStatus(callback: { self.successBlock?() self.cleanUp() }) { (error) in // couldn't verify receipt self.failureBlock?(error) self.cleanUp() } } func cleanUp(){ self.successBlock = nil self.failureBlock = nil } } 

рд╕рдлрд▓ рд╕рджрд╕реНрдпрддрд╛ рдкрд░, рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрджреНрдзрддрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдирджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ purchased ред


рд▓реЗрдХрд┐рди рд╕рджрд╕реНрдпрддрд╛ рдХреА рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Apple рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред


рд╕рджрд╕реНрдпрддрд╛ рд╕реНрдерд┐рддрд┐ рдЬрд╛рдВрдЪреЗрдВ


рдЪреЗрдХ Apple рдХреЛ verifyReceipt POST рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдЪреЗрдХ рдХреЛ рдПрдХ рдЖрдзрд╛рд░ 64-рдПрдиреНрдХреЛрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣рдореЗрдВ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдЪреЗрдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╕рд░рдгреА рдореЗрдВ, рдореБрдЦреНрдп latest_receipt_info рдЯреНрд░рд╛рдпрд▓ рдЕрд╡рдзрд┐ рд╕рд╣рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдпрддрд╛ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдЕрд╡рдзрд┐ рд╕реЗ рд╕рднреА рд▓реЗрдирджреЗрди рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдЧрд╛ред рд╣рдо рдХреЗрд╡рд▓ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


WWDC 2017 рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ verifyReceipt рдЕрдиреБрд░реЛрдз рдореЗрдВ exclude-old-transactions рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдЪреЗрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ред

 func refreshSubscriptionsStatus(callback : @escaping SuccessBlock, failure : @escaping FailureBlock){ // save blocks for further use self.refreshSubscriptionSuccessBlock = callback self.refreshSubscriptionFailureBlock = failure guard let receiptUrl = Bundle.main.appStoreReceiptURL else { refreshReceipt() // do not call block yet return } #if DEBUG let urlString = "https://sandbox.itunes.apple.com/verifyReceipt" #else let urlString = "https://buy.itunes.apple.com/verifyReceipt" #endif let receiptData = try? Data(contentsOf: receiptUrl).base64EncodedString() let requestData = ["receipt-data" : receiptData ?? "", "password" : self.sharedSecret, "exclude-old-transactions" : true] as [String : Any] var request = URLRequest(url: URL(string: urlString)!) request.httpMethod = "POST" request.setValue("Application/json", forHTTPHeaderField: "Content-Type") let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: []) request.httpBody = httpBody URLSession.shared.dataTask(with: request) { (data, response, error) in DispatchQueue.main.async { if data != nil { if let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments){ self.parseReceipt(json as! Dictionary<String, Any>) return } } else { print("error validating receipt: \(error?.localizedDescription ?? "")") } self.refreshSubscriptionFailureBlock?(error) self.cleanUpRefeshReceiptBlocks() } }.resume() } 

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


 private func refreshReceipt(){ let request = SKReceiptRefreshRequest(receiptProperties: nil) request.delegate = self request.start() } func requestDidFinish(_ request: SKRequest) { // call refresh subscriptions method again with same blocks if request is SKReceiptRefreshRequest { refreshSubscriptionsStatus(callback: self.successBlock ?? {}, failure: self.failureBlock ?? {_ in}) } } func request(_ request: SKRequest, didFailWithError error: Error){ if request is SKReceiptRefreshRequest { self.refreshSubscriptionFailureBlock?(error) self.cleanUpRefeshReceiptBlocks() } print("error: \(error.localizedDescription)") } 

refreshReceipt() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЪреЗрдХ рдЕрдкрдбреЗрдЯ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЪреЗрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ requestDidFinish(_ request : SKRequest) рдХрд╣рд▓рд╛рддреА рд╣реИ, рдЬреЛ refreshSubscriptionsStatus рд╡рд┐рдзрд┐ рдХреЛ refreshSubscriptionsStatus рдХреЙрд▓ рдХрд░рддреА рд╣реИред


рдЦрд░реАрдж рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рд╣рдореЗрдВ рдПрдХ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдирджреЗрди рдХрд╛ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд╕рд░рдгреА рд╣реЛрддрд╛ рд╣реИ ( latest_receipt_info рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛)ред рд╣рдо рдПрд░реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, expires_date рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рддрд╛рд░реАрдЦ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЖрдИ рд╣реИред


 private func parseReceipt(_ json : Dictionary<String, Any>) { // It's the most simple way to get latest expiration date. Consider this code as for learning purposes. Do not use current code in production apps. guard let receipts_array = json["latest_receipt_info"] as? [Dictionary<String, Any>] else { self.refreshSubscriptionFailureBlock?(nil) self.cleanUpRefeshReceiptBlocks() return } for receipt in receipts_array { let productID = receipt["product_id"] as! String let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV" if let date = formatter.date(from: receipt["expires_date"] as! String) { if date > Date() { // do not save expired date to user defaults to avoid overwriting with expired date UserDefaults.standard.set(date, forKey: productID) } } } self.refreshSubscriptionSuccessBlock?() self.cleanUpRefeshReceiptBlocks() } 

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


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


 func expirationDateFor(_ identifier : String) -> Date?{ return UserDefaults.standard.object(forKey: identifier) as? Date } let subscriptionDate = IAPManager.shared.expirationDateFor("YOUR_PRODUCT_ID") ?? Date() let isActive = subscriptionDate > Date() 

рд▓реЗрди-рджреЗрди рдХреА рд╡рд╕реВрд▓реА рдПрдХрд▓ рдкрдВрдХреНрддрд┐ SKPaymentQueue.default().restoreCompletedTransactions() ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрджреНрдзрддрд┐ func paymentQueue(**_** queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рднреА рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рд▓реЗрдирджреЗрди рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ func paymentQueue(**_** queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) ред


рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди рд░рд┐рдХрд╡рд░реА рд╕реЗ рдЪреЗрдХ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?


рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрдкрдХреЗ рдЦрд░реАрдж рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИрдВ? Wwdc рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрджреНрднреБрдд рддрд╛рд▓рд┐рдХрд╛ рд╣реИ:


WWDC рд╕реЗ рдЦрд░реАрдж рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЛрдВ рдХреА рдЕрдВрддрд░ рддрд╛рд▓рд┐рдХрд╛
WWDC рд╕реЗ рдЦрд░реАрдж рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЛрдВ рдХреА рдЕрдВрддрд░ рддрд╛рд▓рд┐рдХрд╛


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


рд╕реНрд╡рддрдГ-рдирд╡реАрдХрд░рдгреАрдп рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓реЗрди-рджреЗрди рд╕реНрд╡рдпрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдЪреЗрдХ рдЕрдкрдбреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рд▓реЗрдирджреЗрди рд╡рд╕реВрд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦрд░реАрдж рдкрд░ рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ (Apple рд╣реЛрд╕реНрдЯ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА) рдпрд╛ рдпрджрд┐ рдЖрдк рдЕрднреА рднреА iOS 7 рд╕реЗ рдиреАрдЪреЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред


рдЦрд░реАрджрд╛рд░реА рдкрд░реАрдХреНрд╖рдг (рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдкрд░реАрдХреНрд╖рдг)


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



рдРрдк рд╕реНрдЯреЛрд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЦрд░реАрдж рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЦрд░реАрдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реИрдВ:


  • рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдВрдбреЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдореЗрд╢рд╛ рд▓реЙрдЧрд┐рди рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЯрдЪ рдЖрдИрдбреА / рдлреЗрд╕ рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЦрд░реАрдж рдЕрднреА рднреА рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред


  • рдпрджрд┐, рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд░реНрдЬ рдХрд░рдиреЗ рдкрд░, рд╕рд┐рд╕реНрдЯрдо рдмрд╛рд░-рдмрд╛рд░ рд▓реЙрдЧрд┐рди рдкрд╛рд╕рд╡рд░реНрдб рдкреВрдЫрддрд╛ рд╣реИ, рддреЛ "рд░рджреНрдж рдХрд░реЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ , рдЖрд╡реЗрджрди рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХрд░реЗрдВ, рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рдмрдХрд╡рд╛рд╕ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рджреВрд╕рд░реЗ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдмрд╛рдж рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред


  • рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред


  • рд╕рджрд╕реНрдпрддрд╛ рдЕрд╡рдзрд┐ рдХреА рдЕрд╡рдзрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╣реИред рдФрд░ рдЙрдиреНрд╣реЗрдВ рджрд┐рди рдореЗрдВ 6 рдмрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд╡рдзрд┐рдкрд░реАрдХреНрд╖рдг рдХреА рдЕрд╡рдзрд┐
1 рд╕рдкреНрддрд╛рд╣3 рдорд┐рдирдЯ
1 рдорд╣реАрдирд╛5 рдорд┐рдирдЯ
2 рдорд╣реАрдиреЗ10 рдорд┐рдирдЯ
3 рдорд╣реАрдиреЗ15 рдорд┐рдирдЯ
6 рдорд╣реАрдиреЗ30 рдорд┐рдирдЯ
1 рд╕рд╛рд▓1 рдШрдВрдЯрд╛

IOS 13 рдореЗрдВ StoreKit рдореЗрдВ рдирдпрд╛ рдХреНрдпрд╛ рд╣реИ?


рдирдП рдореЗрдВ рд╕реЗ - рдХреЗрд╡рд▓ SKStorefront рд╡рд░реНрдЧ, рдЬреЛ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕ рджреЗрд╢ рдореЗрдВ рдРрдк рд╕реНрдЯреЛрд░ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИред рдпрд╣ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ, рд╣рд░ рдХреЛрдИ рдЬрд┐рдпреЛрд▓реЛрдХреЗрд╢рди рдпрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рдерд╛ред рдЕрдм рдРрдк рд╕реНрдЯреЛрд░ рдореЗрдВ рджреЗрд╢ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ: SKPaymentQueue.default().storefront?.countryCode рдЕрдЧрд░ рдЦрд░реАрдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдРрдк рд╕реНрдЯреЛрд░ рдореЗрдВ рджреЗрд╢ рдмрджрд▓ рдЧрдпрд╛ рддреЛ рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рднреА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЦрд░реАрдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд░рджреНрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдиреБрдХрд╕рд╛рди


  • рдРрдкреНрдкрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рд╕реАрдзреЗ рдЪреЗрдХ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ WWDC (5:50 рд╕реЗ) рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдФрд░ рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рдордзреНрдп-рдордзреНрдп рд╣рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЪреЗрдХ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╕реНрдерд╛рдиреАрдп рдорд╛рдиреНрдпрддрд╛ рд╣реИ рдпрд╛ рддреЛ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
  • рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕рдордп рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ - рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд╕рдХреНрд░рд┐рдп рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдХрд┐рд╕реА рднреА рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдЯреАрдХ рд╡рд┐рд╢реНрд╡ рд╕рдордп рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред
  • рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдирд┐: рд╢реБрд▓реНрдХ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╣ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЪреЗрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛, рдЙрд╕реЗ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдФрд░ JSON рдореЗрдВ рдЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╕рд╣реА рд╣реЛрдЧрд╛ред рдХрдИ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
  • рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдзрдирд╡рд╛рдкрд╕реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╕рджрд╕реНрдпрддрд╛ JSON рдХреЛ cancellation_date рдХрд░ cancellation_date рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди expires_date рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, cancellation_date expires_date рдлрд╝реАрд▓реНрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬреЛ рдХрд┐ expires_date рд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЪреЗрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╡реНрдпрд░реНрде рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдРрдкреНрдкрд▓ рдЖрдИрдбреА рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреЗрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрд╡рдпрдВ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЦрд░реАрджрд╛рд░реА рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИред
  • рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреИрд╕реЗ рдХрд░реЗрдВ рдХрд┐ рд╕рджрд╕реНрдпрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдмрд┐рдВрджреБ рд╣реИрдВ? рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╛ рдХреЗрд╡рд▓ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЪреЗрдХ рдХреЛ рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЪреЗрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬрд┐рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдзрдирд╡рд╛рдкрд╕реА рдЬрд╛рд░реА рдХреА рд╣реИ, рд╡рд╣ рдЕрд╡рдзрд┐ рдХреЗ рдЕрдВрдд рддрдХ рдореБрдлреНрдд рдореЗрдВ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


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


10 рдорд┐рдирдЯ рдореЗрдВ рдЕрдкрдиреЗ iOS рдРрдк рдореЗрдВ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? Apphud рдФрд░ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ:
  • рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦрд░реАрджрд╛рд░реА рдХрд░реЗрдВ;
  • рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ;
  • рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд╛рдиреАрдп рдореБрджреНрд░рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдПрдореНрдкреНрд▓рд┐рдЯреНрдпреВрдб, рдорд┐рдХреНрд╕рдкреИрдирд▓, рд╕реНрд▓реИрдХ рдФрд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреЛ рд╕рджрд╕реНрдпрддрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рднреЗрдЬреЗрдВ;
  • рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдордВрдерди рджрд░ рдШрдЯрд╛рдПрдВ рдФрд░ рдмрд┐рдирд╛ рд╕рджрд╕реНрдпрддрд╛ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реМрдЯрд╛рдПрдВред

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


All Articles