本篇记录App开发过程中发现的商业化机会。
一、技术方案
(一)iOS App内购
可以使用的优秀组件
pod ‘DYFStoreKit’, ‘~> 1.2.0’
广告接入
二、App收费的方法
- 边缘增值功能收费
比如:使用某项定制化的边缘功能时收费,用户不消费也不会影响使用体验。
- 团购收费
比如:使用某一项被垄断的服务(chatGPT)时,用户单独购买一个月需要30块,且付费很麻烦,还需要翻墙。这时作为服务商,就可以统一采购,然后向用户收费,更便宜,一个月只要10块。
广告收费
游戏收费
比如:游戏道具
- 雁过拔毛收费
这种目标就是做大平台,比如:提现时收费、在平台成交商品时收费
- 工具类App续费收费/买断收费
比如:工具类记忆App、闹钟App,主打的就是一个工具,这种类型的产品本身就是一项服务。
- 增值业务收费
比如:提供其它公司做不到或者很难做到的服务,像提供chatGPT的实时连网。
三、什么时候觉得可以收费了?
bug 比较少,已经自成一体的时候,成为小而美的时候,说明就可以收费了。
那什么是小而美呢?
做产品,要迅速达到一个小而美的状态,就是 inout 和 output 链路要是通的,链路上不能有 bug。
之后怎么对数据进行再加工,就不是小而美的范畴了。
四、订阅
订阅的流程是怎么样的? 如何更好区分出用户订阅的时间,以及自动付费时,怎么监听。
首先苹果提供了 StoreKit API,可让你的 App 在 Apple 所有平台以及 App Store 的所有类别中采用自动续期订阅模式。
(一)基础监听逻辑
发表检查 productId -> 允许订阅 -> 发起订阅 -> 接收订阅结果
[ChatGPT] iOS订阅业务的开发需要经过以下几个步骤:
1. 在苹果开发者后台中创建订阅产品。具体步骤可以参考苹果官方文档。
2. 在你的iOS应用中,使用StoreKit框架提供的API来实现订阅功能。以下是一个简单的订阅功能实现的代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// 导入StoreKit框架
// 定义订阅产品的标识符
NSString * const kSubscriptionProductId = @"your_subscription_product_id";
// 在需要订阅的地方调用以下方法
- (void)subscribe {
// 判断是否支持应用内购买
if ([SKPaymentQueue canMakePayments]) {
// 创建一个SKProductsRequest对象,用于请求订阅产品的信息
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kSubscriptionProductId]];
request.delegate = self;
[request start];
} else {
// 应用内购买不可用,提示用户
NSLog(@"应用内购买不可用");
}
}
// 实现SKProductsRequestDelegate协议中的方法,获取订阅产品信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
if (response.products.count > 0) {
// 获取订阅产品信息成功,发起订阅请求
SKProduct *product = response.products.firstObject;
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
} else {
// 获取订阅产品信息失败,提示用户
NSLog(@"获取订阅产品信息失败");
}
}
// 实现SKPaymentTransactionObserver协议中的方法,处理订阅结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased:
// 订阅成功,处理订阅结果
[self handleSubscriptionSuccess];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
// 订阅失败,处理订阅结果
[self handleSubscriptionFailure];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
// 恢复订阅成功,处理订阅结果
[self handleSubscriptionRestore];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
default:
break;
}
}
}
// 处理订阅成功的方法
- (void)handleSubscriptionSuccess {
// 处理订阅成功的逻辑
NSLog(@"订阅成功");
}
// 处理订阅失败的方法
- (void)handleSubscriptionFailure {
// 处理订阅失败的逻辑
NSLog(@"订阅失败");
}
// 处理订阅恢复的方法
- (void)handleSubscriptionRestore {
// 处理订阅恢复的逻辑
NSLog(@"订阅恢复");
}
在上面的代码示例中,我们首先定义了一个订阅产品的标识符`kSubscriptionProductId`,然后在需要订阅的地方调用了`subscribe`方法。在`subscribe`方法中,我们首先判断应用内购买是否可用,然后创建 一个`SKProductsRequest`对象,用于请求订阅产品的信息。在请求成功后,我们获取到订阅产品的信息,然后发起订阅请求。在订阅的过程中,我们通过实现`SKPaymentTransactionObserver`协议中的方法来 处理订阅结果。在订阅成功、订阅失败和订阅恢复的情况下,我们分别调用了`handleSubscriptionSuccess`、`handleSubscriptionFailure`和`handleSubscriptionRestore`方法来处理订阅结果。
需要注意的是,在实际开发中,我们还需要处理用户取消订阅、订阅过期等情况,并且需要将订阅状态同步到服务器端。此外,为了保证用户的订阅体验,我们还需要提供相应的订阅管理界面,让用户可以方便地管理自 己的订阅。
(二)自动续费
在用户订阅成功后,系统会自动在每个订阅周期结束时向应用发送一个交易 事务,我们可以通过实现以下方法来处理自动续订的事件。
回调的是下面这个方法:
1 | - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions |
然后使用单据里的结束时间,来计算会员过期时间:
1 | NSUInteger endTimeStamp = [info.transactionDate timeIntervalSince1970] + 366 * 24 * 60 * 60; |
五、发放体验码
- 使用 public iCloud
将体验码放到 [[CKContainer defaultContainer] publicCloudDatabase] 中
在CloudKit Console管理:
- 环境选择:Development or Production
如果是测试阶段(还没发布),选择 Development 环境新增 Records 即可。
如果已经发布,给现网用户使用的,选择 Production 环境即可。
- 出现了个重大bug
我发放的测试码,我自己测试的时候可以实现用完码就删!但我发给用户的测试码,他们可以无限期使用!
CloudKit中 public dataBase、private database 和 share database 的区别是什么?
在CloudKit中,public database、private database和shared database是三种不同的数据库类型,它们的主要区别如下:
Public database:公共数据库,可以被所有人访问和修改。适用于需要共享数据的场景,例如一个社交应用中的用户信息。
Private database:私有数据库,只能被应用程序的授权用户访问和修改。适用于存储用户个人信息或私密数据的场景,例如一个备忘录应用中的备忘录信息。
Shared database:共享数据库,可以被多个用户访问和修改,但是需要经过授权才能访问。适用于需要共享数据,但是只想授权给特定用户或用户组 的场景,例如一个协作应用中的任务列表。
除了数据库类型的不同,这三种数据库在使用上也有一些区别:
Public database和shared database的数据可以被所有人访问,因此需要注意数据的隐私和安全性。
Private database只能被授权用户访问,因此需要在应用程序中进行身份验证和权限控制。
Shared database需要在应用程序中进行用户管理和权限控制,以确保只有授权用户能够访问和修改数据。
总的来说,选择哪种数据库类型取决于你的应用程序的需求和场景,需要根据实际情况进行选择。
六、关于定价问题
销量不好,不要想着给App降价,而是要给App添加功能,让App更值钱。
七、商业化小目标
2023年05月16日19:27:11 制定
第一阶段小目标:营收1000块。
小技巧:给用户的按年优惠,要delay一阵子等确实缴费了,再给出去。
八、关于Apple Developer续费
直接续上,不要犹豫,这次因为断续费了,然后重新续费之后发现app的续费业务出现问题。
我前往App Developer尝试之后才发现能恢复:
然后2024年05月04日前往app Developer发现是因为某个协议没有签署:https://appstoreconnect.apple.com/
最后解决了,就是在 app Developer 上把上面的付费协议签署了就可以,不需要改代码。