iOS內購IAP(十八) —— 自動續訂訂閱(一)

版本記錄

版本號 時間
V1.0 2019.05.07 星期二

前言

大家都知道,iOS虛擬商品如寶石、金幣等都需要走內購,和蘋果三七分成,如果這類商品不走內購那么上不去架或者上架以后被發現而被下架。最近有一個項目需要增加內購支付功能,所以最近又重新集成并整理了下,希望對大家有所幫助。感興趣的可以參考上面幾篇。
1. iOS內購IAP(一) —— 基礎配置篇(一)
2. iOS內購IAP(二) —— 工程實踐(一)
3. iOS內購IAP(三) —— 編程指南之關于內購(一)
4. iOS內購IAP(四) —— 編程指南之設計您的應用程序的產品(一)
5. iOS內購IAP(五) —— 編程指南之檢索產品信息(一)
6. iOS內購IAP(六) —— 編程指南之請求支付(一)
7. iOS內購IAP(七) —— 編程指南之促進應用內購買(一)
8. iOS內購IAP(八) —— 編程指南之提供產品(一)
9. iOS內購IAP(九) —— 編程指南之處理訂閱(一)
10. iOS內購IAP(十) —— 編程指南之恢復購買的產品(一)
11. iOS內購IAP(十一) —— 編程指南之準備App審核(一)
12. iOS內購IAP(十二) —— 一個詳細的內購流程(一)
13. iOS內購IAP(十三) —— 一個詳細的內購流程(二)
14. iOS內購IAP(十四) —— IAP的收據驗證(一)
15. iOS內購IAP(十五) —— IAP的收據驗證(二)
16. iOS內購IAP(十六) —— 添加介紹性定價選項(一)
17. iOS內購IAP(十七) —— 添加介紹性定價選項(二)

開始

首先看下寫作環境

Swift 5, iOS 12, Xcode 10

自動續訂訂閱非常棒。他們可以幫助您將已經非常棒的應用程序提升到一個新的水平,并幫助您在此過程中獲得額外的收入。如果您的應用提供一致或可更新的內容或集合,則添加對應用內購買(IAP)訂閱的支持可能是個好主意。

自動續訂訂閱提供了一種為用戶提供持續訪問應用更新內容的方式 - 為他們提供出色的用戶體驗和訪問他們關注的內容,同時為您提供吸引人的商業模式。

通過自動續訂訂閱,您不必堅持蘋果通常提供的舊70/30收入分配。為了激勵您為用戶提供持續的價值,Apple會在第二年開始時將您的份額提高到85%。

注意:如果用戶取消訂閱 - 并且未在60天內續訂 - 或切換到另一個訂閱組(稍后更多),則重置計入一年標記的天數。因此,請確保您的訂閱提供了用戶長期希望保留的體驗。

您是否已經確信您的應用可以從自動續訂訂閱中受益?太棒了,因為在本教程中你將學習如何做到這一點。

前面提到幾件重要的事情。首先,對于本教程 - 并且通常與IAP一起工作 - 您將需要一個付費的Apple Developer帳戶。免費版本不允許您設置應用內購買。其次,您需要在本教程中使用真實設備。模擬器不支持應用內購買。

為了演示向您的應用添加自動續訂訂閱的過程,您將使用令人喜愛的“Words of Wisdom by Winnie the Pooh”應用。這是一個非常簡單的應用程序,非常適合演示IAP訂閱。

該應用程序的初始版本提供了一個可自動更新的IAP - 從Winnie the Pooh獲得隨機智慧之言一整個月的權利!這足以照亮任何人的一天。但是,由于顯然人們希望繼續使用它的時間更長,因此您還應該提供年度訂閱選項。這對于應用程序的忠實用戶來說將更有價值。

但是,在深入了解實施細節之前,您可能了解應用程序內購買。

這里有一些重要的免責聲明:

  • 在示例應用程序中,您將使用硬編碼的產品標識符(Product Identifiers)。在現實生活中,您更喜歡從服務器獲取這些內容的靈活性。
  • 您將使用UserDefaults來指示用戶已購買產品。在真實的應用程序中,您需要執行收據驗證(receipt validation),而不是在本地保存此指示。

Setting Up the Project

好的,所以你有啟動項目。要使其工作,您需要在項目本身和App Store Connect上進行更改。完成所有這些步驟后,您將擁有一個可運行的應用程序,其中包含一個可自動更新的訂閱產品。

  • 1) 在Apple Developer Portal中創建應用程序ID(App ID)。請務必使用顯式應用程序ID(Explicit App ID)并記下您使用的Bundle ID
  • 2) 確保您已接受App Store Connect中的所有法律協議,否則您將無法在以下步驟中看到正確的選項。如果需要幫助,請參閱Checking Your Agreements
  • 3) 使用所述Bundle IDApp Store Connect中創建iOS應用程序。
  • 4) 創建IAP Auto-Renewable Subscription產品。在填寫必填字段時,請閱讀以下內容。

在創建自動續訂訂閱的過程中,App Store Connect會要求您定義訂閱組(subscription group)。訂閱組基本上是訂閱產品的集合。您可以在下一部分中了解有關訂閱組的更多信息,但是現在,只需為新的自動續訂訂閱創建一個新的訂閱組。稱之為PoohWisdomSubs。

確保完成新創建的應用程序內購買的所有元數據,包括審閱信息(Review Information)。您可以將此圖片this image用于評論截圖。

請注意“訂閱持續時間”(Subscription Duration)字段,該字段特定于“可續訂訂閱”(Renewable Subscriptions)。這是訂閱將自動續訂的持續時間,除非用戶選擇退出。在許多情況下,您的應用提供的各種IAP選項之間的唯一區別將是訂閱持續時間和與之相關的價格。內容本身不會更改 - 您的用戶可以在多個訂閱選項之間進行選擇,以便訪問相同的內容。

將持續時間設置為1個月(1 Month),將訂閱價格(Subscription Price)設置為0.99美元。

SUBSCRIPTION GROUPS下的左側導航欄中選擇PoohWisdomSubs并添加本地化。

完成后,您的新應用程序內購買的狀態將顯示為準備提交Ready to Submit

  • 5) 復制先前步驟中的應用和產品ID(App and Product IDs)以便于訪問。
  • 6) 在回到項目之前,您需要做的最后一件事是創建一個沙箱用戶進行測試。 請記住,您需要使用真實的電子郵件地址 - 您實際可以訪問的地址,以便您可以驗證該帳戶。

好的,現在是開始項目的時候了! 只需幾個步驟,您將擁有一個有效的初始應用程序:

  • 1) 將Bundle Identifier設置為您創建的Bundle Identifier
  • 2) 將常規(General)選項卡上的團隊Team切換到開發人員團隊。
  • 3) 搜索com.razeware.poohWisdom.monthlySub并將其替換為您創建的IAP的產品ID(Product ID )

接下來,在您要測試的設備上,打開iOS Settings應用,然后點擊iTunes & App Store。

點按您的Apple ID,然后點按Sign Out。 此時,實際上并未使用沙箱用戶登錄。 當您嘗試在應用中購買IAP時,您將執行此操作。

構建并運行項目,您將在項目控制臺中看到:

Not purchased: $MyIAPID
Loaded list of products...
Found product: $MyIAPID $GroupID $Pricing

如果你看到這個 - 恭喜! 您有一個可自動續訂IAP的工作應用程序。 但是不要太舒服。 你剛剛開始。

如果您看到其他內容,請確保您在上述步驟中沒有遺漏任何內容:

  • 你在App Store Connect上設置了一切嗎?
  • 您的新IAP產品狀態是否Ready to Submit?
  • 您是否在項目的“常規”選項卡上設置了TeamBundle Identifier?
  • 您是否用自己的product ID替換了com.razeware.poohWisdom.monthlySub?
  • 您是否接受了App Store Connect中的所有協議,并且它們是否都顯示為Active

點擊購買(Purchase)

輸入您在App Store Connect上創建的沙箱帳戶的用戶名和密碼,點擊Continue,然后點擊以下彈出窗口中的OK。 如果一切順利,你現在應該看到你的第一個Winnie the Pooh quote! 我希望這是一個很好的!

好的,既然您已經完成了這項工作,那么從訂閱組開始,您將深入了解自動更新的訂閱細節。


Subscription Groups

App Store Connect上設置自動續訂訂閱時,您遇到了訂閱組的概念。如上所述,這基本上是一組訂閱產品,但它還有更多。

您已經知道每個訂閱必須是訂閱組的一部分。用戶可以根據每個訂閱選項的價格和持續時間選擇最適合他們的訂閱選項。

您可能不知道的是,用戶一次只能在一個組內購買一個訂閱。如果您想要防止用戶意外購買相同內容的多個訂閱,這非常有用。要防止出現這種情況,您需要做的就是為所有相關訂閱產品使用單個訂閱組。

如果您確實希望同時提供多個訂閱,并且每個訂閱都授予對不同類型內容的訪問權限,則應使用多個訂閱組。確保您的用戶了解他們實際上訂閱了多個服務,并且不希望只有一個有效訂閱。這可能導致沮喪的用戶取消訂閱并留下負面評論,這反過來可能阻止其他用戶訂閱,并且沒有人想要這樣做。

要防止出現這種情況,請確保您的訂閱選項清晰易懂。您的訂閱組的名稱僅對您可見,而不是對您的用戶可見,因此請以對您最有意義的方式使用它。

您可以在每個組中對您的訂閱進行排名。提供對大多數內容,功能或服務的訪問權限,忽略訂閱持續時間,都應位于頂部。如果產品相同,您可以在每個級別擁有多個訂閱。您可以通過拖動組中的訂閱來進行設置。將一個拖到另一個上面以將它們設置在同一級別。

用戶可以選擇在App Store的帳戶subscription page中升級,跨級(crossgrade)或降級訂閱:

  • 當用戶升級(upgrades)時,交易立即生效,并且他們會收到原始訂閱的按比例分配的退款。
  • 當用戶降級(downgrades)時,原始訂閱將繼續,直到下一個續訂日期,然后在較低級別續訂。
  • 當用戶進行交叉分級(crossgrades)時,如果訂閱持續時間相同,則新訂閱立即開始。 否則,新訂閱將在下一個續訂日期生效。

注意:這些都不會影響付費服務一年標記的計數。 但是,轉移到不同組中的訂閱會重置服務日期。


Adding More Subscriptions

您現在要為應用添加另一個自動續訂訂閱:yearly。 由于該應用程序僅提供一種類型的內容 - life changing quotes by Winnie the Pooh - 您將保持新的自動續訂訂閱與現有訂閱處于同一水平。

轉到App Store Connect并添加另一個可自動更新的訂閱產品。 當系統提示您選擇新產品的訂閱組時,請選擇您之前創建的相同PoohWisdomSubs組。

將訂閱Duration字段設置為1 Year,并填寫所有其他必要信息。 單擊“保存”并確認狀態為Ready to Submit。 復制新的自動續訂訂閱的Product ID。 你很快就會需要它。

現在,回到Xcode。

打開Main.storyboard并將Purchase按鈕標題更改為Subscriptions,因為您要更改按鈕以便用戶在兩個可用的自動更新訂閱選項之間進行選擇。

轉到ViewController.swift,找到displayRandomQuote()并刪除以下代碼行:

purchaseBttn.isHidden = true

這將在成功購買后保持訂閱按鈕可見,并允許您的用戶在訂閱之間切換。

現在,找到purchaseSubscription(_ :)并將整個buyProduct閉包移動到名為purchaseItemIndex(index:Int)的新方法。 請注意,從不使用index參數。 將第一行的products[0]更改為products[index]。 新方法應如下所示:

PoohWisdomProducts.store.buyProduct(products[index]) { [weak self] success, productId in
  guard let self = self else { return }
  guard success else {
    let alertController = UIAlertController(title: "Failed to purchase product",
                                            message: "Check logs for details",
                                            preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "OK", style: .default))
    self.present(alertController, animated: true, completion: nil)
    return
  }
  self.displayRandomQuote()
}

您現在可以使用此新方法根據用戶的選擇購買相關訂閱。 您將根據作為products[index]傳遞的值選擇訂閱。

回到purchaseSubscription(_ :),您需要添加alert以允許用戶選擇他們的首選訂閱選項。 在guard下方添加以下內容:

let alertController = UIAlertController(
  title: "Choose your subscription",
  message: "Which subscription option works best for you",
  preferredStyle: .alert)

alertController.addAction(
  UIAlertAction(title: "Monthly",
                style: .default,
                handler: { action in
                  self.purchaseItemIndex(index: 0)})
)

alertController.addAction(
  UIAlertAction(title: "Yearly",
                style: .default,
                handler: { action in
                  self.purchaseItemIndex(index: 1)})
)

present(alertController, animated: true, completion: nil)

您剛剛添加了一個alert控制器,它有兩個選項:每月訂閱和每年訂閱。 您將向應用商店發送請求,以根據用戶在此alert中的選擇(由index標識)購買相關訂閱。

現在,剩下的就是將新product ID添加到產品數組中,這樣用戶實際上就有兩個訂閱選項可供選擇。

轉到PoohWisdomProducts.swift并將poohWisdomSub的名稱更改為monthlySub。 然后,在其下方添加另一個product ID。 將其命名為yearlySub

public static let monthlySub = "com.razeware.poohWisdom.monthlySub"
public static let yearlySub = "com.razeware.poohWisdom.yearlySub"

確保將兩個訂閱的product ID替換為您在App Store Connect上創建的product ID。

更改productIDs數組的初始化以包含兩個訂閱產品:

private static let productIDs: Set<ProductID> =
  [PoohWisdomProducts.monthlySub, PoohWisdomProducts.yearlySub]}

現在,productID包含兩個可用的訂閱,應用程序將根據用戶在訂閱alert中的選擇從Apple的服務器請求相關的訂閱。

最后,返回ViewController.swift并在viewDidLoad()中,如果用戶購買了poohWisdomSub并檢查了兩個可用訂閱中的任何一個,則替換條件檢查。 你的情況現在應該是這樣的:

if (PoohWisdomProducts.store.isProductPurchased(PoohWisdomProducts.monthlySub) ||
  PoohWisdomProducts.store.isProductPurchased(PoohWisdomProducts.yearlySub)){
  displayRandomQuote()
} else {
  displayPurchaseQuotes()
}

如果用戶購買了任一訂閱,您現在正在顯示quote。


Seeing it All Come Together

現在,既然您已經在App Store Connect和應用程序本身上設置了兩個訂閱,那么就該進行測試了。 使用相同的沙箱用戶,通過點擊Subscriptions然后選擇Yearly來升級到年度訂閱。

如果您想直接測試購買年度訂閱,則需要創建一個新的沙箱用戶。

但是在你對各種測試場景瘋狂之前(我強烈建議你這樣做,因為測試非常重要 - 特別是可能不被注意的邊緣情況),當涉及到自動更新續訂時,你需要了解有關沙箱與生產的信息。

您真的不想在幾天,幾個月或幾年的時間內測試您的自動更新(auto-renewable)。 因此,只要您處于測試環境中,續訂就會以加速的速度發生:

也知道續訂每天限制為六次。 因此,如果要測試各種方案,您可能會發現自己正在與多個測試用戶合作。


Auto Renewable Subscriptions Best Practices

您現在有一個基本的工作應用程序,有多個訂閱選項供您的用戶選擇。 現在是涵蓋一些自動續訂訂閱最佳實踐的好時機:

  • 您已經知道不應該在應用程序中對product ID進行硬編碼,而是從服務器中獲取它們。這將使您可以更靈活地選擇提供的選項和時間。
  • 您永遠不應該在您的應用中存儲其他訂閱數據 - 例如價格,描述等。您應始終依靠Apple獲取此最新數據。這將使您能夠更改價格并制作獨特的促銷產品,而無需考慮升級到較新版本的用戶。
  • 您應該考慮在應用中提供訂閱管理選項。這將使您有機會創建為您的特定應用量身定制的訂閱體驗。您可以提供品牌化的上下文體驗,用于升級,交叉評級甚至降級,同時在用戶決定取消訂閱時提供設置的深層鏈接。
  • 確保您清楚地描述了您的訂閱,以便您的用戶準確了解他們將要購買的內容。這可能不僅可以幫助您吸引更多訂閱者,還可以幫助防止付費訂閱但獲得的不是期望內容的沮喪用戶。
  • 除了吸引新訂閱者之外,您還應該考慮保留現有訂閱者。要考慮的一件事是管理價格。您可能會有興趣提高其中一個訂閱選項的價格。這對新用戶來說沒問題,但現有用戶呢?您可以決定讓現有用戶保持舊訂閱價格,只提高新用戶的價格,或者您可以決定為每個人提高價格并希望獲得最佳價格。如果您決定提高現有用戶的價格,并且以不同的價格擁有多組現有用戶,請確保首先提高最接近當前價格的用戶的價格,然后是下一個最接近的用戶,依此類推。否則,Apple可能會多次提示您的用戶接受越來越高的價格。
  • 最重要的是,始終要注意Apple的指導方針(guidelines)。這與您在iOS上所做的一切相關,但由于本教程是關于應用程序內購買的,因此您應該查看Apple指南中的相關部分relevant section,并確保在開始處理下一個應用程序之前一切對您有意義。

您現在應該非常了解如何設置自動續訂訂閱。 如果您對進一步閱讀感興趣,我強烈建議:

當您添加對自動續訂訂閱的支持時,請始終牢記用戶。 實現利潤最大化的最佳方法是為用戶提供他們真正需要或想要的東西,并以用戶友好的方式進行。 這將使他們和他們的錢回來更多!

后記

本篇主要講述了自動續訂訂閱,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容