ÿÿiOS应用内购买SDK:将IAP集æˆåˆ°iOS应用中

ä¸€ä¸ªå¼€æº SDK,用于在 iOS 上集æˆåº”用内购买

在30分钟内实现应用内购买。

针对iOS内购的现æˆåŽç«¯

集æˆå†…购需è¦åˆ›å»ºåŽç«¯åŸºç¡€è®¾æ–½å’ŒæœåŠ¡å™¨ç”¨äºŽè®¢é˜…äº‹ä»¶ã€‚è¿™å¯èƒ½éœ€è¦æ•°ç™¾å°æ—¶çš„工作,而且维护起æ¥ä¹Ÿå…·æœ‰æŒ‘战性。
import StoreKit
class Store: ObservableObject {
    private var productIDs = ["stone"]
    @Published var products = [Product]()
    init() {
        Task {
            await requestProducts()
        }
    }  
    @MainActor
    func requestProducts() async {
        do {
            products = try await Product.products(for: productIDs)
        } catch {
            print(error)
    }
  }
}
Section(header: Text("To buy")) {
 }
ForEach(store.products, id: \.id) {
  product in
    HStack {
      Text(product.displayName)
      Spacer()
      Button("\(product.displayPrice)") {
    }
  }
}
@Published var purchasedNonConsumables = [Product]()
@MainActor
func purchase(_ product: Product) async throws -> Transaction ? {
  let result =
    try await product.purchase()
  switch result {
    case .success(.verified(let transaction)):
      purchasedNonConsumables.append(product)
      await transaction.finish()
      return transaction
    default:
      return nil
  }
}
Button("\(product.displayPrice)") {
 Task {
  try await store.purchase(product)
  }
}
ProductView(
 icon: "â€",
 quantity: "\(store.purchasedNonConsumables.count)"
 )
 func listenForTransactions() -> Task < Void, Error > {
  return Task.detached {
    for await result in Transaction.updates {
      switch result {
        case let.verified(transaction):
          guard
          let product = self.products.first(where: {
            $0.id == transaction.productID
          })
          else {
            continue
          }
          self.purchasedNonConsumables.append(product)
          await transaction.finish()
        default:
          continue
      }
    }
  }
}
var transacitonListener: Task<Void, Error>?
init() {
   transacitonListener = listenForTransactions()
   Task {
     await requestProducts()
 }
}
@MainActor
private func handle(transactionVerification result: VerificationResult <Transaction> ) async {
  switch result {
    case let.verified(transaction):
      guard
      let product = self.products.first(where: {
        $0.id == transaction.productID
      })
      else {
        return
      }
      self.purchasedNonConsumables.insert(product)
      await transaction.finish()
    default:
      return
  }
}
Adapty SDK使您能够将内购集æˆåˆ°æ‚¨çš„iOS应用中,拥有我们的现æˆåŸºç¡€è®¾æ–½ï¼Œå®ƒå¤„ç†æ‰€æœ‰è®¢é˜…事件并æä¾›å¢žé•¿æ”¶å…¥çš„功能。
import Adapty
 
do {
  try await Adapty.activate("PUBLIC_SDK_KEY")
 
  // Make a purchase, Adapty handles the rest
  let purchaseResult = try await Adapty.makePurchase(product)
  // successful purchase
} catch {
  // handle the error
}
从集æˆåˆ°ç»´æŠ¤ – Adapty旨在使使用IAPå˜å¾—更简å•。
请求演示

为什么选择Adapty SDK?

éšæ—¶å‡†ç¡®çš„订阅状æ€

请放心,您将始终在所有平å°ä¸ŠèŽ·å¾—æ­£ç¡®çš„è®¢é˜…è€…çŠ¶æ€ã€‚

æœåŠ¡å™¨ç«¯æ”¶æ®éªŒè¯

无需担心购买验è¯çš„æ­£ç¡®æ€§å’Œå®‰å…¨æ€§ã€‚

处ç†å„ç§è®¢é˜…状æ€

å…费试用ã€å‡çº§ã€ä¿ƒé”€ä¼˜æƒ ã€å®¶åº­å…±äº«ã€ç»­è®¢ç­‰ã€‚

ä¼ä¸šçº§å¹³å°ï¼Œå‘布周期短

>99.99%æœåŠ¡æ°´å¹³åè®®å¯é æ€§å’Œå®šæœŸäº§å“更新。
é…置平å°
安装Adapty SDK
Adapty.activate(
   "PUBLIC_SDK_KEY",
   customerUserId: "YOUR_USER_ID"
)
处ç†è´­ä¹°äº‹ä»¶

快速而简便的集æˆ

åªéœ€èŠ±è´¹å‡ ä¸ªå°æ—¶å°†Â Adapty SDK集æˆåˆ°æ‚¨çš„iOS应用中,其余的我们æ¥å¤„ç†ã€‚

仅需5个SDK方法å³å¯å®žçްiOS内购

import Adapty
 
do {
    try await Adapty.activate("PUBLIC_SDK_KEY")
    
    // Make a purchase, Adapty handles the rest
    let purchaseResult = try await Adapty.makePurchase(product)
    // successful purchase
}   catch {
    // handle the error
}
// Your app's code
Adapty.getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en") { result in
    switch result {
        case let .success(paywall):
            // the requested paywall
        case let .failure(error):
            // handle the error
    }
}
 
 
// Your app's code
Adapty.makePurchase(product: product) { result in
    switch result {
    case let .success(info):
        if info.profile.accessLevels["YOUR_ACCESS_LEVEL"]?.isActive ?? false {
            // successful purchase
        }
    case let .failure(error):
        // handle the error
    }
}
// Your app's code
Adapty.getProfile { result in
    if let profile = try? result.get() {
        // check the access
    }
} 
 
 
 
 
 
// Your app's code
Adapty.restorePurchases { [weak self] result in
    switch result {
        case let .success(profile):
            if info.profile.accessLevels["YOUR_ACCESS_LEVEL"]?.isActive ?? false {
	            // successful access restore
            }
        case let .failure(error):
            // handle the error
    }
}
å…费试用

å„类应用开å‘者纷纷转用 Adapty 以æå‡æ”¶å…¥

Cem Ortabas, Co-founder and CEO of HubX
放弃 RevenueCat å¯¹æˆ‘ä»¬è€Œè¨€å¹¶éžæ˜“事。我们最终选择了 Adaptyï¼Œæ˜¯å› ä¸ºç›¸ä¿¡ä»–ä»¬æ˜¯ä¼´éšæˆ‘们æˆé•¿æ›´ç†æƒ³çš„åˆä½œä¼™ä¼´ã€‚如今回望,这个决定无疑是正确的。è¿ç§»è¿‡ç¨ÿÿ‹ä¸­è™½æœ‰æ³¢æŠ˜ï¼Œä½†Adapty团队始终倾力相助,åŽç»­æœåŠ¡äº¦æ˜¯ä¸€æµæ°´å‡†ã€‚我愿以å¯é ä¼™ä¼´ä¹‹å,诚挚推èAdapty。
Cem Ortabas
è”åˆåˆ›å§‹äººå…¼ CEO,HubX
HUBX
Arkadiy Yukhnevich
Almus 旗下è¿è¥ç€ä¼—多 iOS åº”ç”¨ï¼Œæ¯æ¬¾åº”用都有其独特的å—众群体和å˜çŽ°æŒ‘æˆ˜ã€‚æ”¯ä»˜åˆ†æžä¸­çš„任何错误都至关é‡è¦ï¼Œå› æ­¤æˆ‘ä»¬åœ¨é€‰æ‹©å¹³å°æ—¶æžä¸ºå®¡æ…Žã€‚我们从 RevenueCat è¿ç§»è‡³ Adapty。这次è¿ç§»å¹¶ä¸è½»æ¾ï¼Œä½† Adapty 团队全程与我们并肩åŒè¡Œã€‚我们说åŒä¸€ç§è¯­è¨€ï¼šä»–们的产å“路线图推动的正是我们最关注的指标——LTV å’Œ ROAS。Adapty 是我们的增长伙伴。
Arkadiy Yukhnevich
Almus的首席执行官
Almus
Roman Degtyarev
我们从 2022 年开始使用 Adaptyï¼Œå®ƒå·²ç»æˆä¸ºæˆ‘们è¿è¥åº”用业务的核心组æˆéƒ¨åˆ†ã€‚订阅管ç†ã€æ•°æ®åˆ†æžã€A/B 测试——我们都在使用。Adapty 为我们æä¾›äº†ä¸æ–­æˆé•¿å’Œè¯•验的工具,而且ä¸ä¼šæ‹–慢我们的节å¥ã€‚他们的支æŒå›¢é˜Ÿå’Œå®¢æˆ·æˆåŠŸå›¢é˜Ÿæ˜¯çœŸæ­£åœ¨å€¾å¬æˆ‘ä»¬çš„å£°éŸ³ï¼Œè¿™ä¸€ç‚¹å’Œäº§å“æœ¬èº«åŒæ ·é‡è¦ã€‚能让人感觉自己是åˆä½œä¼™ä¼´è€Œä¸ä»…仅是客户,这ç§ä½“验éžå¸¸éš¾å¾—。
Roman Degtyarev
è”åˆåˆ›å§‹äºº
Glam AI
Chris Bick, Founder and CEO of Bickster
我们自 2021 年起与 Adapty æºæ‰‹åŒè¡Œï¼Œè¿™ä»½åˆä½œå¸¦æ¥çš„æ»¡æ„åº¦æ— å¯æ¯”拟。我们曾体验过多款订阅管ç†å¹³å°ï¼Œå› è€Œæ·±è°™å…¶ä¸­å·®å¼‚。这些年Adapty䏿–­æŽ¨å‡ºåˆ›æ–°åŠŸèƒ½ï¼ŒæŒç»­åŠ©åŠ›æˆ‘ä»¬çš„ä¸šåŠ¡å¢žé•¿ã€‚å…¶å¸‚åœºåˆ†æžèƒ½åŠ›æ— å‡ºå…¶å³ï¼Œé›†æˆæ–¹æ¡ˆæ›´æ˜¯åŒ…罗万象。若您渴望æå‡åº”用收益,Adapty必是ä¸äºŒä¹‹é€‰ã€‚
Chris Bick
创始人兼 CEO,Bickster
Bickster
Kyle Smith, Head of data at Smitten Dating
Adapty å¹³å°è®©éžæŠ€æœ¯äººå‘˜ä¹Ÿèƒ½è½»æ¾åˆ›å»ºå¹¶ç®¡ç† A/B 测试ã€é…置付费墙ã€ç»„åˆäº§å“方案åŠå®šä»·æž¶æž„。其出色的外部 APIï¼Œæ›´å¯æ— ç¼å¯¹æŽ¥ Amplitudeã€Mixpanel 等分æžå·¥å…·ï¼Œå®žçŽ°ç›¸å…³äº‹ä»¶æ•°æ®äº’通。
Kyle Smith
Smitten Dating æ•°æ®è´Ÿè´£äºº
Smitten
Roi Mulia, Founder & CEO of SocialKit
在四个月的时间里,我们测试了 300 多个付费墙。Adapty 支æŒåŒæ—¶è¿è¡Œæ— é™é‡ A/B 测试,我们得以充分探索付费墙的æ¯ä¸ªç»†èŠ‚ã€‚ä»Žäº§å“组åˆã€æ ‡é¢˜æ–‡æ¡ˆã€CTA 按钮到图åƒè§†é¢‘,我们é€ä¸€éªŒè¯ã€‚借助 Adapty çš„ A/B 测试,我们的月收入实现了翻å€å¢žé•¿ã€‚è‹¥éžäº²åŽ†ï¼Œæˆ‘éš¾ä»¥ç›¸ä¿¡å•一工具能产生如此深远的影å“。
Roi Mulia
创始人 & CEO,SocialKit
SocialKit

使用Adapty您能得到什么?

Adapty SDKæä¾›äº†å·¨å¤§çš„å¯èƒ½æ€§æ¥Â å¢žé•¿Â åº”用 收入

å®žæ—¶åˆ†æžæ‚¨çš„iOS应用

凭借99.5%的准确性ä¾èµ–æ•°æ®ä¸ŽApp Store Connect。
开始å§
App Icon Gravity
Gravity Fit
å¥åº·ä¸Žå¥èº«
â€œé€æ˜Žå’Œé«˜çº§çš„分æžä»ªè¡¨æ¿å¸®åŠ©æˆ‘ä»¬æ›´å¿«åœ°åšå‡ºå†³ç­–,而无需使用é¢å¤–的工具。这为我们节çœäº†å¤§é‡æ—¶é—´ï¼Œä»Žè€ŒèŠ‚çœäº†é‡‘钱。â€
Ekaterina K,
Gravity Fit产å“ç»ç†
Accuracy Adapty Appstore
ABC testing

付费墙A/B测试

找到最有利å¯å›¾çš„付费墙,增加应用收入。
探索A/B测试
MentalGrowth
MentalGrowth
å¥åº·ä¸Žä¿å¥åº”用
“Adapty的快速分æžå’Œæ˜“于å¯åŠ¨çš„A/B测试功能使我们能够快速验è¯å‡è®¾å¹¶å–å¾—å“越的结果。â€
Vadim Nemchenko,
MentalGrowth产å“ç»ç†

付费墙的远程é…ç½®

è¿œç¨‹æ›´æ”¹æ‚¨çš„ä»˜è´¹å¢™ï¼Œè€Œæ— éœ€é‡æ–°å‘布应用。
现在试试
Smitten
Smitten - 约会
生活方å¼
“我们的增长和收入团队能够快速实现和管ç†ä»˜è´¹å¢™ã€äº§å“报价,并在许多ä¸åŒå¸‚场测试定价阶梯。â€
Kyle Smith,
Smitten Datingæ•°æ®è´Ÿè´£äºº
Table Json Table Locale

用户满æ„度与æœåŠ¡å“è´¨åŒè®¤è¯

基于 500+ æ¡çœŸå®žè¯„ä»·
G2 Award: Leader (EMEA), winter 2025
G2 Award: Leader (EMEA), winter 2025
G2 Award: Leader (EMEA), winter 2025
G2 Award: Leader (EMEA), winter 2025
G2 Award: Leader (EMEA), winter 2025
ÿÿÿÿ