唐巧的博客

唐巧的博客

记录下自己学习的点滴

iOS应用内支付(IAP)的那些坑

前言

udacity 中的在线课程 《How to build a startup》 中提到,所谓创业,就是尝试寻找新的赢利模式。正因为这是一种尝试,所以不可避免地需要调整产品方向,寻找市场中还未被发现的用户需求,给用户创造价值,进而获得收入。最近很火的 精益创业 的观点,则是强调将这种尝试成本降到最小,使得自己可以根据市场反馈迅速调整产品。

我们在今年春节后上线了新的在线智能题库:猿题库。这应该是我们在互联网教育这个创业领域尝试的第二个方向。

猿题库现在推出了公务员考试行测和申论 2 个产品,均包括 web, iOS 和 Android 三个平台。这次我们尝试做一个收费的产品,所以在 iOS 端集成了应用内支付(IAP)功能。在开发过程中和上线后,我们遇到了 IAP 中的一些坑,在此分享给各位。

是否应该使用ARC?

我和身边做 iOS 开发的同事组建了一个 QQ 群,每隔一段时间,大家就会讨论是否应该使用 ARC。所以我觉得有必要将这些讨论分享出来,让大家消除对于 ARC 的疑虑。

设置应用内的系统控件语言

在iOS应用中,有时候会需要调用系统的一些UI控件,例如:

  1. 在UIWebView中长按会弹出系统的上下文菜单
  2. 在UIImagePickerController中会使用系统的照相机界面
  3. 在编译状态下的UITableViewCell,处于待删除时,会有一个系统的删除按钮。

以上这些UI控件中,其显示的语言并不是和你当前手机的系统语言一致的。而是根据你的App内部的语言设置来显示。结果就是,如果你没有设置恰当的话,你的中文App可能会出现一些英文的控件文字。

谈ObjC对象的两段构造模式

前言

Objective-c 语言在申请对象的时,需要使用两段构造 (Two Stage Creation) 的模式。一个对象的创建,需要先调用 alloc 方法或 allocWithZone 方法,再调用 init 方法或 initWithSomething 方法。如下是一个 NSString 对象的创建示例:

NSString * str = [[NSString alloc] initWithString:@"http://blog.devtang.com"];

由于该语言的对象创建方法和大多数其它语言(如 C、C++、Java、JavaScript)都不一样,所以引起了我的好奇。是什么原因促使 Objective-C 做了这种设计,而又是什么原因促使大多数其它语言都采用 “new” 方法来一次性创建对象呢?

在看了 《Cocoa Design Patterns》 一书(顺便吐槽一下该书中文版翻译质量不高,建议看英文版),并且做了一些调研之后,我将总结分享给大家,欢迎大家讨论。

StoryBoard--看上去很美

介绍

StoryBoard 是苹果在 2011 年的 WWDC Session 309《Introducing Interface Builder Storyboarding》中介绍的 Interface Builder 的新功能。其基本想法是将原本的 xib 进行升级,引入一个容器用于管理多个 xib 文件,并且这个容器可以通过拖拽设置 xib 之间的界面跳转。而这个容器就是被苹果称做的 StoryBoard。下图是一个 Storyboard 的截图。

关于IAP的破解

介绍

大概在今年7月份,有俄罗斯黑客破解了苹果的应用内付费(In-App Purchases),设备在不越狱的情况下就可以免费获得来自苹果官网App Store里应用的收费道具。受影响的产品众多,包括著名的Angry Birds,切水果,Mega Jump, Pandora等。这里有一份受影响的著名的游戏应用列表。

正常的越狱行为还是比较复杂的,需要下载破解软件,并且操作进入DFU模式,所以大部分人并不能够方便地越狱。但该方案不需要越狱就可以破解应用内付费,给用户实施该行为提供了方便。

iOS应用内付费(IAP)开发步骤列表

前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作。步骤繁多,在此把开发步骤列表整理如下。因为只是步骤列表,所以并不含详细的说明教程,需要看教程的新手,可以看我附在最后的一些参考链接。

让Xcode的 stack trace信息可读

昨天在写 iOS 代码的时候,调试的时候模拟器崩溃了。异常停在了如下整个 main 函数的入口处:

int main(int argc, char *argv[])
{
@autoreleasepool {
// 异常停在了下面这行,毫无提示作用
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyClass class]));
}
}

改进iOS客户端的升级提醒功能

功能设计

先申明一下,我是码农,不是一个产品经理,但我觉得现有市面上的很多 App,设计的 “升级提示功能” 都不太友好。在此分享一下我的想法,欢迎大家讨论。

这些 App 包括:新浪微博、网易微博、网易新闻客户端以及大部分带有升级提示功能的 App,所以我觉得这个问题还是挺普遍的。对于该问题,一句话描述起来就是:“这些 App 都会在用户刚刚使用它的时候,提示有新版本,让用户去 AppStore 上下载最新的版本”。下面是某个应用的升级提示截图:

为什么我认为这是一个糟糕的设计呢?因为用户刚刚打开你的 App,明显就是想使用你的功能。例如刚刚打开新浪微博,可能就是想看一下最新的消息或回复。刚刚打开网易新闻客户端,可能就是想看看最新的新闻。这个时候,你告诉用户有新版本,是想让用户暂时放弃使用该 App 吗?我不知道有多少用户会去点 “升级” 这个按钮,反正我每次看到这个提示都很郁闷,因为我如果点了,我就暂时不能使用该应用了(升级时原版本的 App 是无法使用的)。所以我在想,这个提示升级的时间能不能做得更友好一些?

avatar
唐巧
一个中年程序员,正在努力学习做业务