IOS рдореЗрдВ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рдСрдлрд╝рд░ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХрд░реЗрдВ

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


рдЫрд╡рд┐


рд╣рд╛рдп рд╕рдм, рдореИрдВ Apphud рд╕реЗ Renat рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд╣реВрдБ - рдПрдХ рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ iOS- рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рдХрд┐рд╕реА рдПрдХрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред


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


Apple рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдПрдХ рдЖрд░реЗрдЦ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИ:



рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐:


  • рдЙрд╕рдиреЗ рдкрд╣рд▓реЗ рдПрдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛

рдФрд░


  • рд╕рджрд╕реНрдпрддрд╛ рдпрд╛ рддреЛ рдЬрд╛рд░реА рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ

рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ 3 рдЪрд░рдг рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:


1) рдРрдк рд╕реНрдЯреЛрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдФрд░ рд▓реЗрдирджреЗрди рдХреА рд╕рд░рдгреА рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВред рдпрджрд┐ рдХреЛрдИ рд▓реЗрди-рджреЗрди рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдХреБрдЫ рднреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрджрд┐ рд▓реЗрдирджреЗрди рд╣реИрдВ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдЪрд░рдг рдХрд░реЗрдВред


2) рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рдкрд╣рд▓реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛


3) рд╡рд░реНрддрдорд╛рди рд╕рджрд╕реНрдпрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ


рдЖрдЗрдП рдЗрди рдЪрд░рдгреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


1. рдРрдк рд╕реНрдЯреЛрд░ рдХреА рдЬрд╛рдБрдЪ рдХреА рд╡реИрдзрддрд╛


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


 func isEligibleForIntroductory(callback: @escaping (Bool) -> Void){ guard let receiptUrl = Bundle.main.appStoreReceiptURL else { callback(true) 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 sharedSecret = "YOUR_SHARED_SECRET" let requestData = ["receipt-data" : receiptData ?? "", "password" : sharedSecret, "exclude-old-transactions" : false] 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 // continue here }.resume() } 

рдКрдкрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #if DEBUG рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: sandbox рдпрд╛ production ред рдпрджрд┐ рдЖрдк рдЕрдиреНрдп рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдЬрдЧрд╣ рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

2. рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкрд╣рд▓реЗ рдПрдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ


Apple рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ Dictionary рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓реЗрдирджреЗрди рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:


 // paste this code after "continue here" comment guard let data = data, let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String : AnyHashable], let receipts_array = json["latest_receipt_info"] as? [[String : AnyHashable]] else { callback(true) return } // continue here 

рд╣рдо рд▓реЗрди-рджреЗрди рдХреА рд╕рд░рдгреА рд╕реЗ is_trial_period рдФрд░ is_in_intro_offer_period рдФрд░ is_in_intro_offer_period рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ is_in_intro_offer_period ред рдпрджрд┐ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ true , рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рддреИрдпрд╛рд░ рдХрд░ рдЪреБрдХрд╛ рд╣реИред рдпреЗ рдорд╛рди рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдмреВрд▓ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЛрдиреЛрдВ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред


 // paste this code after "continue here" comment var latestExpiresDate = Date(timeIntervalSince1970: 0) let formatter = DateFormatter() for receipt in receipts_array { let used_trial : Bool = receipt["is_trial_period"] as? Bool ?? false || (receipt["is_trial_period"] as? NSString)?.boolValue ?? false let used_intro : Bool = receipt["is_in_intro_offer_period"] as? Bool ?? false || (receipt["is_in_intro_offer_period"] as? NSString)?.boolValue ?? false if used_trial || used_intro { callback(false) return } // continue here 

3. рд╕рджрд╕реНрдпрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛


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


 // paste this code after "continue here" comment formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV" if let expiresDateString = receipt["expires_date"] as? String, let date = formatter.date(from: expiresDateString) { if date > latestExpiresDate { latestExpiresDate = date } } } if latestExpiresDate > Date() { callback(false) } else { callback(true) } 

рдЖрдк рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЗ рдкреВрд░реНрдг рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ "рд▓реЗрдХрд┐рди" рд╣реИрдВред


рдиреБрдХрд╕рд╛рди


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


  • рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рджрд╕реНрдпрддрд╛ рд╡рд╛рдкрд╕реА рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, cancellation_date рдлрд╝реАрд▓реНрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:


     if receipt["cancellation_date"] != nil{ // if user made a refund, no need to check for eligibility callback(false) return } 

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


  • рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред IOS рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдПрдХ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛: рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд╕рдХреНрд░рд┐рдп рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред


  • рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдПрдХ рдЪреЗрдХ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╕реНрд╡рдпрдВ рдРрдкреНрдкрд▓ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ WWDC (5:50 рд╕реЗ) рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдФрд░ рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рдордзреНрдп-рдордзреНрдп рд╣рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред Apple рдЪреЗрдХ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИред



рдкреНрд░рдЪрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛


рдкреНрд░рдЪрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рд╢рд░реНрдд рд╕рд░рд▓ рд╣реИ - рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдХреНрд░рд┐рдп рдпрд╛ рд╕рдорд╛рдкреНрдд рд╕рджрд╕реНрдпрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП pending_renewal_info рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рджреЗрдЦреЗрдВред


рдпрд╣ Apphud SDK рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ


рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЗрд╕рдореЗрдВ рдЕрдкрдиреЗ product рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛, рдЬреЛ рдЖрдкрдХреЛ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдЧрд╛:


 Apphud.checkEligibilityForIntroductoryOffer(product: myProduct) { result in if result { // User is eligible to purchase introductory offer } } 

рдФрд░ рдЗрд╕реА рддрд░рд╣ рдкреНрд░рдЪрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП:


 Apphud.checkEligibilityForPromotionalOffer(product: myProduct) { result in if result { // User is eligible to purchase promotional offer } } 

рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдХреЙрд▓ рдореЗрдВ рдХрдИ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рднреА рд╣реИрдВ:


 func checkEligibilitiesForIntroductoryOffers(products: [SKProduct], callback: ApphudEligibilityCallback) func checkEligibilitiesForPromotionalOffers(products: [SKProduct], callback: ApphudEligibilityCallback) 

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


рдкреВрд░реНрдг рд╡рд┐рдзрд┐ рдХреЛрдб рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


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

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


All Articles