Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Building a modern subscription experience on iOS
Search
Bas Broek
August 17, 2022
Programming
230
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Building a modern subscription experience on iOS
Sharing a story on how we built subscriptions for the iOS WeTransfer app.
Bas Broek
August 17, 2022
More Decks by Bas Broek
See All by Bas Broek
Assistive Access: Reinventing Your App for a New (sort of) Generation
basthomas
0
17
Roasting Your App's Accessibility
basthomas
0
56
Building an Accessibility Culture, One Step at a Time (Leeds)
basthomas
0
150
Building an Accessibility Culture, One Step at a Time
basthomas
1
130
Not an afterthought: accessibility from start to finish
basthomas
0
180
Accessibility on Apple Platforms: Beyond VoiceOver
basthomas
0
200
No Touch(screen) Required: Voice & Keyboard Accessibility
basthomas
0
190
Dancing with Dinosaurs: Objective-C and Swift Interop
basthomas
0
200
Effective Pull Request Reviews
basthomas
0
450
Other Decks in Programming
See All in Programming
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.9k
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
720
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
480
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
520
Cloudflare is Agents
chimame
0
170
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
150
Flow は今どうなっているか
mizdra
PRO
0
620
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
960
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
300
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
780
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
810
Featured
See All Featured
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
490
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Technical Leadership for Architectural Decision Making
baasie
3
500
Docker and Python
trallard
47
4.1k
HDC tutorial
michielstock
2
790
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.4k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Transcript
BUILDING A MODERN SUBSCRIPTION EXPERIENCE ON IOS @BASTHOMAS 1 —
@basthomas, SwiftConf, August 17, 2022
AMAZING ANNUAL RECURRING REVENUE... ON IOS @BASTHOMAS 2 — @basthomas,
SwiftConf, August 17, 2022
SUPERB SUBSCRIPTIONS... ON IOS @BASTHOMAS 3 — @basthomas, SwiftConf, August
17, 2022
INTERESTING IN-APP PURCHASES... ON IOS @BASTHOMAS 4 — @basthomas, SwiftConf,
August 17, 2022
BUILDING A MODERN SUBSCRIPTION EXPERIENCE ON IOS @BASTHOMAS 5 —
@basthomas, SwiftConf, August 17, 2022
WHO AM I? ▸ @basthomas on Twitter ▸ XING ▸
Moya, GitHawk ▸ Apple (macOS VoiceOver) ▸ WeTransfer 6 — @basthomas, SwiftConf, August 17, 2022
WHY AM I TALKING ABOUT THIS TOPIC? 7 — @basthomas,
SwiftConf, August 17, 2022
WETRANSFER IOS ! 8 — @basthomas, SwiftConf, August 17, 2022
WETRANSFER IOS !! 9 — @basthomas, SwiftConf, August 17, 2022
WETRANSFER IOS !!! 10 — @basthomas, SwiftConf, August 17, 2022
! 11 — @basthomas, SwiftConf, August 17, 2022
! ..? 12 — @basthomas, SwiftConf, August 17, 2022
! 13 — @basthomas, SwiftConf, August 17, 2022
! 14 — @basthomas, SwiftConf, August 17, 2022
WE GOT SOME DESIGNS. LET'S GET CRACKIN', RIGHT? 15 —
@basthomas, SwiftConf, August 17, 2022
16 — @basthomas, SwiftConf, August 17, 2022
ACCESSIBILITY 17 — @basthomas, SwiftConf, August 17, 2022
18 — @basthomas, SwiftConf, August 17, 2022
19 — @basthomas, SwiftConf, August 17, 2022
WAIT, TWITTER? 20 — @basthomas, SwiftConf, August 17, 2022
! 21 — @basthomas, SwiftConf, August 17, 2022
HAPTICS 22 — @basthomas, SwiftConf, August 17, 2022
VOICEOVER 23 — @basthomas, SwiftConf, August 17, 2022
VOICE CONTROL & FULL KEYBOARD ACCESS 24 — @basthomas, SwiftConf,
August 17, 2022
DARK MODE, MOTION, MORE 25 — @basthomas, SwiftConf, August 17,
2022
LET'S GET CRACKIN' 26 — @basthomas, SwiftConf, August 17, 2022
LOCAL CONFIGURATION 27 — @basthomas, SwiftConf, August 17, 2022
28 — @basthomas, SwiftConf, August 17, 2022
29 — @basthomas, SwiftConf, August 17, 2022
WE'LL START SLOWLY 30 — @basthomas, SwiftConf, August 17, 2022
... AND USE FEATURE FLAGS 31 — @basthomas, SwiftConf, August
17, 2022
EVERYTHING'S GOING TO BE FINE, RIGHT? 32 — @basthomas, SwiftConf,
August 17, 2022
33 — @basthomas, SwiftConf, August 17, 2022
34 — @basthomas, SwiftConf, August 17, 2022
35 — @basthomas, SwiftConf, August 17, 2022
36 — @basthomas, SwiftConf, August 17, 2022
public func purchase(product: StoreProduct) async throws -> PurchaseInformation { try
checkRevenueCatConfiguration() let purchaseInformation = try await revenueCat.purchase(product: product) return .init( transaction: purchaseInformation.0, customerInformation: .init(customerInformation: purchaseInformation.1), isUserCancelled: purchaseInformation.2 ) } 37 — @basthomas, SwiftConf, August 17, 2022
... THAT'S IT? 38 — @basthomas, SwiftConf, August 17, 2022
THANKS, REVENUECAT 39 — @basthomas, SwiftConf, August 17, 2022
OH, AND THEN WE CRASHED 40 — @basthomas, SwiftConf, August
17, 2022
HAS ANYONE EVER TOLD YOU TO BE CAREFUL WITH FORCE-UNWRAPPING?
41 — @basthomas, SwiftConf, August 17, 2022
! 42 — @basthomas, SwiftConf, August 17, 2022
// when we are here, we should always be able
// to find a package. if not, that's a programmer error 43 — @basthomas, SwiftConf, August 17, 2022
PRODUCT IDENTIFIER: ? 44 — @basthomas, SwiftConf, August 17, 2022
// when we are here, we should always be able
// to find a package. if not, that's a // programmer error... or an Apple issue. // So do _NOT_ crash. ! 45 — @basthomas, SwiftConf, August 17, 2022
PRODUCT IDENTIFIER: 46 — @basthomas, SwiftConf, August 17, 2022
ANYWAY... 47 — @basthomas, SwiftConf, August 17, 2022
DEMO 48 — @basthomas, SwiftConf, August 17, 2022
49 — @basthomas, SwiftConf, August 17, 2022
50 — @basthomas, SwiftConf, August 17, 2022
DEMO 51 — @basthomas, SwiftConf, August 17, 2022
52 — @basthomas, SwiftConf, August 17, 2022
53 — @basthomas, SwiftConf, August 17, 2022
54 — @basthomas, SwiftConf, August 17, 2022
55 — @basthomas, SwiftConf, August 17, 2022
EVERYTHING IS GOING (TO BE) FINE, RIGHT? 56 — @basthomas,
SwiftConf, August 17, 2022
57 — @basthomas, SwiftConf, August 17, 2022
GRADUAL ROLLOUT 58 — @basthomas, SwiftConf, August 17, 2022
59 — @basthomas, SwiftConf, August 17, 2022
60 — @basthomas, SwiftConf, August 17, 2022
IT'S NOT A BUG, IT'S A FEATURE 61 — @basthomas,
SwiftConf, August 17, 2022
YOLO 62 — @basthomas, SwiftConf, August 17, 2022
YOLO CARPE DIEM 63 — @basthomas, SwiftConf, August 17, 2022
64 — @basthomas, SwiftConf, August 17, 2022
!"# 65 — @basthomas, SwiftConf, August 17, 2022
✅ 66 — @basthomas, SwiftConf, August 17, 2022
! 67 — @basthomas, SwiftConf, August 17, 2022
PAYWALLS 68 — @basthomas, SwiftConf, August 17, 2022
PAYWALLS CONTEXTUAL PAYWALLS 69 — @basthomas, SwiftConf, August 17, 2022
DEMO 70 — @basthomas, SwiftConf, August 17, 2022
71 — @basthomas, SwiftConf, August 17, 2022
CHANGING EXPIRATION DATES PASSWORD PROTECTION TRANSFER LIMIT 72 — @basthomas,
SwiftConf, August 17, 2022
PRE-LOGIN PAYWALL 73 — @basthomas, SwiftConf, August 17, 2022
! 74 — @basthomas, SwiftConf, August 17, 2022
! 75 — @basthomas, SwiftConf, August 17, 2022
! 76 — @basthomas, SwiftConf, August 17, 2022
A NOTE ON CUSTOMER SATISFACTION... 77 — @basthomas, SwiftConf, August
17, 2022
BE CAREFUL WITH "TRICKING" USERS TO BUY SUBSCRIPTIONS 78 —
@basthomas, SwiftConf, August 17, 2022
DEMO 79 — @basthomas, SwiftConf, August 17, 2022
80 — @basthomas, SwiftConf, August 17, 2022
! 81 — @basthomas, SwiftConf, August 17, 2022
82 — @basthomas, SwiftConf, August 17, 2022
TICKING LIKE (GERMAN) CLOCKWORK 83 — @basthomas, SwiftConf, August 17,
2022
There's something one should expect not only of a watch
but also of oneself: to never stand sti . — Walter Lange 84 — @basthomas, SwiftConf, August 17, 2022
EXPERIMENTS 85 — @basthomas, SwiftConf, August 17, 2022
OPTIMIZATION* 86 — @basthomas, SwiftConf, August 17, 2022
* HAPPY CUSTOMERS > SHORT TERM 87 — @basthomas, SwiftConf,
August 17, 2022
OPTIMIZATIONS TO CONSIDER ▸ Default to monthly ▸ Default to
yearly ▸ Focus on Pro ▸ Focus on Premium ▸ Button colors ▸ Etc. etc. 88 — @basthomas, SwiftConf, August 17, 2022
VERIFY, VERIFY, VERIFY 89 — @basthomas, SwiftConf, August 17, 2022
! 90 — @basthomas, SwiftConf, August 17, 2022
THANK YOU! @BASTHOMAS 91 — @basthomas, SwiftConf, August 17, 2022