iOS开发_个人开发者怎么做出赚钱的APP

相信大家都有过做自己APP的想法,我把以前踩过的坑记录一下,大家多多少少也可以参考一下,受见识的局限可能会比较浅薄,请大家多多谅解。
👇下面是介绍,也可以直接下载源码

准备:

首先需要一个自己的开发者账号(因为我没有有国际支付功能的银行卡,所以找淘宝代充的,但是最后去银行办个visa卡,不然其他账号违规,容易被关联)(如果有账号的可以跳过准备,看下面)
iOS的开发者账号分为3种。

个人账号:每年688RMB,容易申请,在上架App Store后,开发者直接显示申请人姓名,个人使用,每一种Apple产品,均有各类设备各100台测试权限。iPhone、iPad、Mac等。

公司账号:每年688RMB,需要邓白氏编码才能申请,上架App Store的App开发者显示公司,公司账号下,可以添加多个测试子账号,支持Xcode在真机测试,但是子账号没有上传App Store权限。与个人账号权限类似,均有各类设备各100台测试机权限,iPhone、iPad、Mac等。

企业账号: 每年299美元,自行换算因为就这个我没买过。申请相对负责,审核比较严格,与公司账号不同处在于,测试设备无限,可以不将开发的App上架App Store,而仅供内部公司人员使用。

我用的是第一种,个人账号

然后登陆苹果后台,创建证书

苹果后台.png

证书创建

然后创建应用,填写资料


创建应用

第一步 先说怎么赚钱吧:

基本上个人开发者做应用,赚钱的方式就那么几种:

1.应用做好了,有人买你的应用

这个有很大的风险,现在好多买应用的,都是做马甲号的,容易被封号;当然不排除你做的很好,被公司看上了的情况,但是几率很小

.2.应用收费下载

就是下载要钱,大部分都是游戏类,工具类或者是笔记类的APP
首先在苹果后台选择价格,然后保存,价格都是固定的,按照苹果价格表来的。


选择价格,然后保存

在应用商店就可以看到了

3.苹果内支付,增值收费

比如说购买会员,或者是礼物打赏的礼物之类的,要使用苹果内支付需要给苹果30%的分成,只有超过150刀才会给你打钱,而且具体使用中还有好多坑,等等慢慢吐槽。
需要付费的虚拟物品必须使用苹果内支付(比如直播打赏的道具),当然你也可以隐藏一个用于支付的H5页面(不过被发现了下场会很惨)
具体的过程简书作者Bison说得很清楚了,我就不细说了;
首先是类型的选择

屏幕快照 2017-01-04 上午11.22.41.png

然后是审核最好详细点,最好有图片,千万不要高估审核人员的智商,不要高估,不要高估(重要的事情说三遍,说多了都是泪啊,有可能在哪购买他都找不到)
最后只能被迫录视频给他们,
最后提醒大家一下
如果是企业开发的话一定要和后台说清楚,不要只和苹果服务器校验是否成功,要把例如产品ID,价格都校验一下,而且要把订单标记为已购买(因为苹果服务器订单校验成功是没有时间限制的,如果一个人花一块钱买个东西把数据抓到以后,用这个订单再买别的东西,你只校验成不成功的话会出问题的)

4.应用内加广告

虽然在App中加入广告来盈利是比较低级的商业化方式,但对于个人开发者或者小团队开发者来说也是个不错的选择,
基本上应用的广告收入都是按展示和点击计算的,各种广告联盟都有自己的SDK,直接引用就行了。
如果用户有好多是国外的,可以使用谷歌GoogleAdMob,但是访问得要梯子,而且是用美金结算的,只有超过100刀才会给你。
如果只是国内的话可以用腾讯广告,结算属于比较快的,一月一结没有金额限制。
腾讯广告后台详情,基本上是没有怎么理会过

腾讯广告后台

广告形式主要有:
开屏广告,原生广告,横幅广告,插页广告,视频广告;
开屏广告和原生广告用户体验好,大厂用的比较多,其它的用户体验都比较差


横幅广告

插页广告

第二步 数据接口:

因为没有服务器(当然会搭服务器的小哥可以跳过),网上有好多免费的API数据接口,大家可以找一下看看有没有需要的。
当然也可以使用各种的云服务,最稳定的应该属于腾讯云阿里云了,但是比较贵。

免费的也有,像是bmob后端云或者是LeanCloud(不过免费版有很多限制)

我现在用的bmob后端云,控制台效果:

后端云控制台

具体实现代码奉上

       //注册key
        [Bmob registerWithAppKey:BmobAppkey];
 //登录
            [BmobUser loginWithUsernameInBackground:@"用户名" password:@"登录密码"  block:^(BmobUser *user, NSError *error) {
         if (user) {
                   登录成功
                    
                } else {
                   登录失败
                  
                }
            }];

         BmobUser *bUser = [[BmobUser alloc] init];
            bUser.username=views.username.textField.text;//名字
            bUser.password=views.password.textField.text;//密码
            [bUser signUpInBackgroundWithBlock:^ (BOOL isSuccessful, NSError *error){
               @"注册成功"
                } else {
                @"注册失败"
                }
            }];

具体数据的增删改查,看文档吧这里就不细讲了

实在不行的话可以使用抓包工具来寻找自己需要的数据,工具下载奉上

第三步 用户第三方登录分享:

用户第三方登录分享(不需要的可以跳过去)
新浪开发平台地址
腾讯开放平台地址
微信开发平台地址
注册提交资料就行,注意微信提交审核的官网要正规点,不然审核不过,随便搭个好看点的静态页面吧。
SDK可以单独集成,也可以使用第三方,推荐使用友盟,使用简单点而且加入友盟统计的时候方便点

依赖库.png

第四步 应用统计:

集成友盟统计(不需要的可以跳过)
集成友盟统计可以分析流量来源、内容使用、用户属性和行为数据,可以知道用户干了什么

    //初始化SDK
   //设置友盟Appkey
    [UMSocialData setAppKey:UmengAppkey];
    //使用友盟统计
    UMConfigInstance.appKey = UmengAppkey;
    UMConfigInstance.channelId = @"App Store";//来源
    [MobClick startWithConfigure:UMConfigInstance];

设置用户的属性,这样用户做的事件就可以携带着这些属性,传的样式是字典

//设置超级属性
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:user.idString, @"uid",user.nickName,@"name",user.gender, @"sex", nil];
    [DplusMobClick registerSuperProperty:dic];
    

统计页面

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [MobClick beginLogPageView:@"首页"];
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [MobClick endLogPageView:@"首页"];
}

自定义事件,数量统计,比如可以统计充值按钮被点击的多少下

 @param  eventId 网站上注册的事件Id.
 @param  label 分类标签。不同的标签会分别进行统计,方便同一事件的不同标签的对比,为nil或空字符串时后台会生成和eventId同名的标签.
 @param  accumulation 累加值。为减少网络交互,可以自行对某一事件ID的某一分类标签进行累加,再传入次数作为参数。
[MobClick event:@"kaola_props"];//传定义的ID

第五步:bug收集

用过的感觉腾讯bugly界面好看点,友盟方便点直接友盟统计就可以收集到。其实也没啥好说的,腾讯bugly也可以统计,友盟统计也可以收集bug,感觉都差不多。


腾讯bugly.png

第六步:消息推送

现状推送的第三方SDK很多,像友盟推送,极光推送,信鸽消息推送等等,个人感觉极光推送是最快的(也有可能是自己的错觉,个人看法)

1.创建推送证书

创建推送证书1.png
创建推送证书2.png

2.导入SDK将SDK包解压

在Xcode中选择“Add files to 'Your project name'...”,将解压后的lib子文件夹(包含JPUSHService.h、jpush-ios-x.x.x.a,jcore-ios-x.x.x.a)添加到你的工程目录中。

3.使用

极光推送可以设置标签和别名达到个性化单独推送的效果,比如单独推送某人,或者按地区推送。 具体实现自己看极光开发者文档吧太多了,不细写了,

4.点击推送控制跳转的页面

在networkDidReceiveMessage函数里处理得到的参数,
来确定跳转的页面
注意设置角标,不过好像第一次点进角标不会消失,再点才会,好像简书的也是这样(不知道是不是错觉)

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
    if (userInfos==nil) {
        userInfos =userInfo ;
//        通知方法回调:接受自定义消息 
        [self networkDidReceiveMessage:userInfos];
    }
    
    [JPUSHService handleRemoteNotification:userInfo];
    [JPUSHService setBadge:0];// 设置角标(到服务器)
   
    
}


第六步:应用内用到的图标

做应用需要这样的图标怎么办

图标讲解.png

做应用的话,需要用到好多图标(作为连画画都不会的人来说,能愁死。当然如果有好的UI朋友的话可以跳过)
矢量图的话推荐用阿里矢量图库图标算是最全的了,基本上搜的都有,
阿里矢量图.png

下载的话可以设置格式,颜色,大小
阿里矢量图2.png

应用图标尺寸
应用图标.png

App Icons的尺寸大小(里面有iPhone和iPad的尺寸,可以自己删除不需要的)

图标尺寸.png

启动图片尺寸输出列表:
640x960
640x1136
750x1334
1242x2208

第七步:应用国际化

说实话这可是个体力活(不然不就白叫码农了吗),英语分个美国英国等等,现在连繁体字也分香港和台湾(兄弟们准备好翻译软件了吗)

介绍宣传国际化(也可以叫本地化)

介绍本地化.png

代码国际化

首先点击项目->PROJECT->Info->Localizations中添加要支持的语言


代码国际化.png

然后就会多出两个文件来


添加效果图.png

InfoPlist.strings是应用名称国际化
例如:
CFBundleDisplayName="XWstarNote";
CFBundleDisplayName="晓文星球笔记";

Localizable.strings是应用内容国际化
例如:
//首页列表
(中)
"HomeTite1" = "金星(衣)";
"HomeTite2" = "木星(食)";
"HomeTite3" = "水星(住)";
"HomeTite4" = "火星(行)";
"HomeTite5" = "土星(其它)";
"HomeTite6" = "创建自己的星球";
(英)
//首页列表
"HomeTite1" = "Venus(dressing)";
"HomeTite2" = "Jupiter(eat)";
"HomeTite3" = "Mercury(live)";
"HomeTite4" = "Mars(motion)";
"HomeTite5" = "Saturn(other)";
"HomeTite6" = "Create your own planet";

宏定义
/** 代码切换语言 **/
#define Localized(key)  NSLocalizedString(key, nil)
使用
 titearray=[NSMutableArray arrayWithObjects:Localized(@"HomeTite1"),Localized(@"HomeTite2"),Localized(@"HomeTite3"),Localized(@"HomeTite4"),Localized(@"HomeTite5"),nil];

切换语言效果


效果图中文.png
效果图英文.png

第八步:数据持久化(应用储存)

持久存储是一种非易失性存储,在重启设备时也不会丢失数据。
NSUserDefaults,用于存储配置信息
SQLite,用于存储查询需求较多的数据
CoreData,用于规划应用中的对象
使用基本对象类型定制的个性化缓存方案

最常用和简单的应该就属于NSUserDefaults了
比如储存一些用户的信息或者设置的信息
最好封装一下节省代码
修改直接把key传过去就行会覆盖原来的数据
删除的话把key传过去个“”空也行

//获取数据
+(id)getData:(NSString*)key{
   return [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:key]];
    
}
//设置数据
+(void)setData:(NSString *)key data:(id)data{
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
//清空
 [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
 [[NSUserDefaults standardUserDefaults] synchronize];

那么问题来了 NSUserDefaults只适合存储轻量级的本地数据,一些简单的数据(如NSString类型的),但是如果我们自定义了一个对象,对象保存的是一些信息,这时候就不能直接存储到NSUserDefaults了怎么办
可以将自定义类型转换为NSData类型
我们先建立一个叫UserInfo 的类,这个类里有各种属性来储存用户的信息,这里要实现 在.h 文件中申明 NSCoding 协议,再 在 .m 中实现 encodeWithCoder 方法 和 initWithCoder 方法就可以了

@interface ModelUser : UserInfo<NSCoding>

-(void)encodeWithCoder:(NSCoder *)encoder{
    
    [encoder encodeObject:self.usersecurityMoel forKey:@"usersecurityMoel"];
    [encoder encodeObject:self.followIds forKey:@"followIds"];
    [encoder encodeObject:[NSString stringWithFormat:@"%d",self.isLoginS] forKey:@"isLoginS"];
    
}

- (id)initWithCoder:(NSCoder *)decoder {
    
    if (self = [super init]) {
        
        self.usersecurityMoel = [decoder decodeObjectForKey:@"usersecurityMoel"];
        self.followIds = [decoder decodeObjectForKey:@"followIds"];
        self.isLoginS =((NSNumber*) [decoder decodeObjectForKey:@"isLoginS"]).boolValue;
        
    }
    
    return self;  
    
}

最后转换储存就行了

//存储
 NSData *securityObject = [NSKeyedArchiver archivedDataWithRootObject:model];
 [user setObject:securityObject
                 forKey:@"UserInfo"];
   [user synchronize];
//读取
NSData* data  = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserInfo"];  
  UserInfo *userInfo = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

第九步:IM聊天消息( 单聊,群聊,聊天室)

应用有时候需要用户单聊,或者群聊,也有可能需要客服聊天,不管怎么说也可以增进用户的黏贴性。
市面上提供IM SDK服务的最大的应该就是环信了吧(个人感觉),但是自从腾讯把它的IM放出来之后感觉有点变化。
之前说腾讯的信鸽推送用得不太好,但是感觉腾讯云IM对并发的处理更好一些,而且功能多(虽然给的demo有点烂),支持创建超级大群(可以超过一万人 上限多少没说)像如果做直播聊天室的话还是挺方便的,而且腾讯云IM有自己的用户管理系统可以帮自己省很多事。

第十步:JSPatch(热更新)

原因
由于Apple严格的审核标准和低效率,iOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码需要热更新。
介绍
JSPatch 是一个 iOS 动态更新框架,只需在项目中引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 原生接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原生代码动态修复 bug。
基础原理
Objective-C是动态语言,具有运行时特性,该特性可通过类名称和方法名的字符串获取该类和该方法,并实例化和调用。
我们可以通过类名/方法名反射得到相应的类和方法,
也可以替换某个类的方法为新的实现,
还可以新注册一个类,为类添加方法。
具体的方法可以看它的官网

热更新.png

现在只说一下工程应用的步骤(因为后台不太想管理热补丁,所以整个流程都是客户端完成的)
1.先导入JSPatch SDK到工程里(很小的,只有几个文件)
2.根据JSPatch语法写好热补丁,然后MD5加密上传到七牛,因为要自己管理七牛文件命名 开头一个字母来判断是否是正式环境,后面加上版本号。
3.每次进入应用判断有没有热补丁就行了。。
4.苹果爸爸说以后热更新,热修复不让用了,恭喜热修复不用看(ᵒ̤̑ ₀̑ ᵒ̤̑)

未完待续。。。。。最近在找工作 有时间更新东西了,想到什么写什么吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,719评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,337评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,887评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,488评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,313评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,284评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,672评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,346评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,644评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,700评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,457评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,316评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,706评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,261评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,648评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,859评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,121评论 25 707
  • 前段时间项目开发过程中遇到一个需求,想做一个类似微信那样的小视频,然后在录制视频的自定义图层上播放。于是就研究了 ...
    zone1026阅读 3,904评论 0 6
  • 望烟波浩淼无边,融水天终成一色。汇三山五岳之灵,集大地万有于胸。借滴水兴波之力,成巨浪万里吞舟。
    尤里加加林阅读 146评论 0 1