4.4.6 рд╣реИ
0.61.5
рдЖрдИрдУрдПрд╕
purchaseUpdatedListener
requestSubscription
рдХреЙрд▓ рдХреЗ рдмрд╛рдж, purchaseUpdatedListener
рдХреЛ рд╣рд░ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдЦрд░реАрдж рд╢реБрд░реВ рдХреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛, рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж рдХрднреА рднреА рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛
рдЕрд╕рд▓реА рдбрд┐рд╡рд╛рдЗрд╕
рдмрд╕ рд░реАрдбрдореА рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
рдХреНрдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХреЛ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ? @Strate рдиреЗ рдЖрдкрдХреЛ finishTransaction
?
@hyochan рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХреЙрд▓ рдРрдк рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИ
@hyochan рдореИрдВрдиреЗ рдПрдХреНрд╕рдкреЛ-рдЗрди-рдРрдк-рдЦрд░реАрдж рдкреИрдХреЗрдЬ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ - рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ
@State рдореИрдВ рдЖрдкрдХрд╛ рдХреЛрдб рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕реНрд╡рдпрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддрд╛ :(
рдпрд╣ рдореБрджреНрджрд╛ рдмрд┐рд▓рдХреБрд▓ рд╣реА рдирд┐рд░рд╛рдкрдж рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдкреВрд░реНрд╡ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ?
рдХреНрдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХреЛ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ? @Strate рдиреЗ рдЖрдкрдХреЛ
finishTransaction
?
рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЦрд░реАрдж рдлрд┐рдирд┐рд╢рдЯреНрд░рд╛рдВрд╕ рдореЗрдВ рдПрдХ рддрд░реНрдХ рд╣реИ? рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рдЗрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдХреЛ рдлрд┐рдирд┐рд╢рдЯреНрд░рд╛рдВрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
@Sophrinix рдлрд┐рдирд┐рд╢рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди рдХреЛ purchaseUpdatedListener
рдЕрдВрджрд░ рдХрд╣рд╛ рдЬрд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ
@hyochan рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ expo-in-app-purchase
рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рд╣реИред @Sophrinix рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддрд╛ рд╣реИред
Btw, рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рдерд╛: рдРрдк рдХреЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реА рд╢реНрд░реЛрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ, рдФрд░ рд╕рд┐рд░реНрдл рд░реАрдбрдореА рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рддрд┐рдЧрдорди рд╣реИред
рдпрджрд┐ рдЖрдк рдирд┐рдореНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
"react": "16.8.1",
"react-native": "^0.59.10",
"react-native-iap": "4.3.0",
рд╕рдорд╕реНрдпрд╛ рддрдм рдЖрддреА рд╣реИ рдЬрдм рдЖрдк react-native-iap
4.4.4
рдФрд░ react-native
рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг 0.60
@Sophrinix рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрдХреНрд╖ рдореЗрдВ requestPurchase
рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЕрдкрдирд╛ рдХреБрдЫ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреГрдкрдпрд╛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдиреЗ initConnection
рдмреБрд▓рд╛рдпрд╛ рд╣реИред рд╣рд╛рд▓рд┐рдпрд╛ рдЕрдкрдбреЗрдЯ рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реИ рдХрд┐ рдЕрдм iOS
рдореЗрдВ android
iOS
рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ 4.3.0 рдХреЗ рдХрд╛рдо рдкрд░ рд▓реМрдЯ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдкрд╛рдЧрд▓ рд╣реЛ рд░рд╣рд╛ рдерд╛, рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ 1h рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдЕрдЧрд░ рдореИрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдБ, 4.3.4
4.4.3
рдХрд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдареАрдХ рд╣реИ, рд╕рдорд╕реНрдпрд╛ 4.4.4
рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ
рдЕрдЧрд░ рдореИрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдБ,
4.3.4
4.4.3
рдХрд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдареАрдХ рд╣реИ, рд╕рдорд╕реНрдпрд╛4.4.4
рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ
рдпрд╣рд╛рдБ рднреА, 4.4.8 рд╕реЗ 4.4.3 рддрдХ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдм рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ!
рдХреНрдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХреЛ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ? @Strate рдиреЗ рдЖрдкрдХреЛ
finishTransaction
?
рдореИрдВ 4.4.0
рдкрд░ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рдЦ рд░рд╣рд╛ рд╣реВрдВ - рдХрд┐рд╕реА рднреА рд╢реНрд░реЛрддрд╛ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ purchaseErrorSubscription
ред
рдбрд╛рдЙрдирдЧреНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рдкрдврд╝реЗрдВ, рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ рдХрд┐ ...
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рдореБрджреНрджрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐:
рдореИрдВ рдпрд╣ рднреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ 4.3.0
рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЖрд░рдПрди 0.62.2 рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рджреЗрд╢реА-рдЖрдИрдПрдкреА 4.4.8 рдХреЗ рд╕рд╛рде рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣реА рдореБрджреНрджрд╛ рдерд╛
рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ initConnection()
рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдЪреВрдХ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ README рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЧрд╛рдпрдм рд╣реИ
4.4.8 рдкрд░ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддреЗ рд╕рдордп iOS рдкрд░ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдерд╛ рдЬрд┐рд╕рдиреЗ рдХреБрдЫ рд╕рджрд╕реНрдпрддрд╛рдПрдБ рдкреВрд░реА рдирд╣реАрдВ рдХреАрдВред 4.4.3 рдкрд░ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рдЕрдм рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред InitConnection () рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ? рдбреЙрдХреНрдЯрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рдирд╣реАрдВ рд╣реИ
рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ initConnection()
рдХреЙрд▓ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдерд╛ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдерд╛ред
рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ README рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдмреЛрд▓реНрдб рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
IOS рдкрд░
initConnection()
, рдпрд╣ рдмрд╕ canMakePayments рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдЯрд░реНрди __which рдЖрд╡рд╢реНрдпрдХ рд╣реИ ред__
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ "рдЖрдИрдУрдПрд╕ рдкрд░, рдпрд╣ рдмрд╕ рдХреИрдирдХреЗрдкрдкреЗрдореЗрдВрдЯреНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛" рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ initConnection()
рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рдерд╛ рдХрд┐ рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд╣реАрдВ рдерд╛
рдЦрд░реАрдж рд╢реНрд░реЛрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ initConnection()
рдЬреЛрдбрд╝рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡рддрдГ # 1002 рдФрд░ # 756 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ
рдореИрдВ 4.4.9 рдкрд░ рд╣реВрдВ рдФрд░ рдЗрд╕ рдЯрд┐рдХрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдореБрджреНрджрд╛ рдореЗрд░реЗ рд╕рд╛рде рднреА рд╣реЛ рд░рд╣рд╛ рд╣реИред
рд╢реНрд░реЛрддрд╛ рдХреЗрд╡рд▓ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдЦрд░реАрдж рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЗрд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВрдиреЗ react-native-iap/index.ts
рдФрд░ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд╕реАрдзреЗ рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреЗрдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ред
рдпрд╣ рдХрд┐рд╕реА рднреА рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ред (рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)
import { NativeModules, NativeEventEmitter } from 'react-native';
import { Observable } from 'rxjs/Observable';
const purchaseEvent = Observable.fromEvent(
new NativeEventEmitter(NativeModules.RNIapIos),
'purchase-updated'
);
const purchaseSubscription = purchaseEvent.subscribe((transactionData) => {
// Trigger server receipt validation here...
});
const errorEvent = Observable.fromEvent(
new NativeEventEmitter(NativeModules.RNIapIos),
'purchase-error'
);
const errorSubscription = errorEvent.subscribe((errorData) => {
// Handle errors here...
});
рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рднрд╛рдЧ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ initConnection()
README рдХреЗ тАЛтАЛрдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдЬреЛрдбрд╝рд╛ рд╣реИ: # 1088, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рднреА рдореЗрд░реЗ рдХреЛрдб рдХреА рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред (рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдореЗрд░рд╛ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ ...)
рдореИрдВ рднреА v5.1.1 рдкрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред initConnection
рдиреЗ рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЦрд░реАрджрджрд╛рд░ рдкрд░ рд╢реНрд░реЛрддрд╛ рдХреЙрд▓рдмреИрдХ рдХрднреА рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ Android рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рдХрд╛рдо рдпрд╣ рдерд╛ рдХрд┐ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред
import React, { useContext, useEffect, useState } from 'react';
import { Alert, EmitterSubscription, Platform, NativeEventEmitter,
NativeModules } from 'react-native';
import { connect } from 'react-redux';
import RNIap, {
InAppPurchase,
PurchaseError,
SubscriptionPurchase,
purchaseErrorListener,
purchaseUpdatedListener,
} from 'react-native-iap';
import { Observable, Subscription } from 'rxjs';
const RNIAPEvent = new NativeEventEmitter(NativeModules.RNIapIos);
const purchaseObservable = new Observable((subscriber) => {
RNIAPEvent.addListener('purchase-updated', (event) => {
subscriber.next(event);
})
})
const RNIAPErrorEvent = new NativeEventEmitter(NativeModules.RNIapIos);
const purchaseErrorObservable = new Observable((subscriber) => {
RNIAPErrorEvent.addListener('purchase-error', (event) => {
subscriber.next(event);
})
})
const Wrapper = ({ ...props }) => {
let purchaseUpdateSubscription: EmitterSubscription | Subscription | null = null;
let purchaseErrorSubscription: EmitterSubscription | Subscription | null = null;
const validateTransaction = async (purchase: SubscriptionPurchase) => {
return new Promise(async (resolve) => {
//resolve(validationResponseFromYourBackend)
}
}
const handleSubEvent = async (purchase: InAppPurchase | SubscriptionPurchase) => {
const receipt = purchase.transactionReceipt;
const purchaseToken = purchase.purchaseToken
if (receipt) {
try {
const result = await validateTransaction(purchase);
if (result.status === 200) {
RNIap.acknowledgePurchaseAndroid(purchaseToken).then(() => {
RNIap.finishTransaction(purchase, false)
.then(() => giveYourUserValue())
.catch((e) => {
//
})
})
}
} catch (err) {
//
}
}
}
useEffect(() => {
RNIap.initConnection()
.then(() => {
RNIap.flushFailedPurchasesCachedAsPendingAndroid().catch(() => {
// exception
})
.then(() => {
if (Platform.OS === 'ios') {
//Documented implementation has issues purchaseUpdatedListener callback
purchaseUpdateSubscription = purchaseObservable.subscribe((purchase) => {
console.log('purchase observable', purchase)
handleSubEvent(purchase);
});
purchaseErrorSubscription = purchaseErrorObservable.subscribe((error) => {
console.log('purchaseErrorListener', error);
})
} else {
//for android use the documented method. Callbacks work.
purchaseUpdateSubscription = purchaseUpdatedListener(
(purchase: InAppPurchase | SubscriptionPurchase) => {
handleSubEvent(purchase);
}
);
purchaseErrorSubscription = purchaseErrorListener(
(error: PurchaseError) => {
console.log('purchaseErrorListener', error);
},
);
}
})
})
return () => {
// clear your listeners
//eg if Subscription purchaseErrorSubscription.unsubscribe()
//eg if EmitterSubscription purchaseErrorSubscription.remove()
}
}, []);
return (
<InAppSubContext.Provider
value={{
someValueYouWantPassedDown: 'theValue'
}}
>
{props.children}
</InAppSubContext.Provider>
)
}
const mapState = (state) => ({ someProps: 'yeah' });
const InAppSubscriptionManager = connect(mapState)(Wrapper);
export default InAppSubscriptionManager;
рдЕрдм рдЖрдк рдЕрдкрдиреЗ App.tsx
рдореЗрдВ рдЕрдкрдиреЗ рдРрдк рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
import InAppSubscriptionManager from './path/to/inAppSubscriptionManager';
const App = () => {
return (
<Provider store={store}>
<InAppSubscriptionManager>
<AppNavigator />
</InAppSubscriptionManager>
</Provider>
);
}
export default App;
рдЦреБрд╢реА рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХреАред рд╣рдо рдЬреВрди рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╣реИред
рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕рдХрд╛ рдЕрд╡рд▓реЛрдХрди рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдЖ (рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)
const purchaseEvent = new NativeEventEmitter(NativeModules.RNIapIos);
const subscription = purchaseEvent.addListener(
'purchase-updated',
transactionData => {
console.log('IAP-LOG purchase-updated');
dispatch(validateRecepit(transactionData));
}
);
const errorSubscription = purchaseEvent.addListener(
'purchase-error',
data => {
crashlytics().log(`Purchase error ${JSON.stringify(data)}`);
console.log('IAP-LOG purchase-error', data);
}
);
};
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ
initConnection()
рдХреЙрд▓ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдерд╛ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдерд╛редрд▓рдЧрддрд╛ рд╣реИ рдХрд┐ README рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдмреЛрд▓реНрдб рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ "рдЖрдИрдУрдПрд╕ рдкрд░, рдпрд╣ рдмрд╕ рдХреИрдирдХреЗрдкрдкреЗрдореЗрдВрдЯреНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛" рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ
initConnection()
рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПрдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рдерд╛ рдХрд┐ рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд╣реАрдВ рдерд╛
рдЦрд░реАрдж рд╢реНрд░реЛрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
initConnection()
рдЬреЛрдбрд╝рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡рддрдГ # 1002 рдФрд░ # 756 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ