iOS开发_个人开发者怎么做出自己的APP
相信大家都有过做自己APP的想法,我把以前踩过的坑记录一下,大家多多少少也可以参考一下,受见识的局限可能会比较浅薄,请大家多多谅解。
准备:
首先需要一个自己的开发者账号(因为我没有有国际支付功能的银行卡,所以找淘宝代充的)(如果有账号的可以跳过准备,看下面)
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 证书创建.png然后创建应用,填写资料
创建应用.png第一步 数据接口:
因为没有服务器(当然会搭服务器的小哥可以跳过),网上有好多免费的API数据接口,大家可以找一下看看有没有需要的,最大的应该就是API Store和聚合数据了吧,
实在不行的话可以使用抓包工具来寻找自己需要的数据,工具下载奉上
第二步 用户注册登录:
用户注册登录(当然会搭服务器的小哥继续可以跳过)大家可以搜一下,有专门的SDK,据我所知有腾讯云和bmob后端云是免费的,我现在用的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可以单独集成,也可以使用第三方,推荐使用友盟,使用简单点而且加入友盟统计的时候方便点
第四步 应用统计:
集成友盟统计(不需要的可以跳过)
集成友盟统计可以分析流量来源、内容使用、用户属性和行为数据,可以知道用户干了什么
//初始化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)添加到你的工程目录中。
添加Framework
CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework
libz.tbd (Xcode7以下版本是libz.dylib)
AdSupport.framework (获取IDFA需要;如果不使用IDFA,请不要添加)
UserNotifications.framework (Xcode8及以上)
libresolv.tbd (JPush 2.2.0及以上版本需要, Xcode7以下版本是libresolv.dylib)
3.使用
极光推送可以设置标签和别名达到个性化单独推送的效果,比如单独推送某人,或者按地区推送。 具体实现自己看极光开发者文档吧太多了,不细写了,
4.点击推送控制跳转的页面
在networkDidReceiveMessage函数里处理得到的参数,
来确定跳转的页面
注意设置角标,不过好像第一次点进角标不会消失,再点才会,好像简书的也是这样(不知道是不是错觉)
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
if (userInfos==nil) {
userInfos =userInfo ;
// 通知方法回调:接受自定义消息
[self networkDidReceiveMessage:userInfos];
}
[JPUSHService handleRemoteNotification:userInfo];
[JPUSHService setBadge:0];// 设置角标(到服务器)
}
第六步:应用内用到的图标
做应用需要这样的图标怎么办
做应用的话,需要用到好多图标(作为连画画都不会的人来说,能愁死。当然如果有好的UI朋友的话可以跳过)
矢量图的话推荐用阿里矢量图库图标算是最全的了,基本上搜的都有,
阿里矢量图.png
下载的话可以设置格式,颜色,大小
阿里矢量图2.png
应用图标尺寸
应用图标.png
App Icons的尺寸大小(里面有iPhone和iPad的尺寸,可以自己删除不需要的)
启动图片尺寸输出列表:
640x960
640x1136
750x1334
1242x2208
第六步:苹果内支付
苹果内支付(不需要的话可以跳过)
要使用苹果内支付需要给苹果30%的分成,只有超过150刀才会给你打钱,而且具体使用中还有好多坑,等等慢慢吐槽。
需要付费的虚拟物品必须使用苹果内支付(比如直播打赏的道具),当然你也可以隐藏一个用于支付的H5页面(不过被发现了下场会很惨,但是我发现有好多没被发现的,难道是看脸的吗)
具体的过程简书作者Bison说得很清楚了,我就不细说了,但是套句领导的话“我再补充两句”
首先是类型的选择
然后是审核最好详细点,最好有图片,千万不要高估审核人员的智商,不要高估,不要高估(重要的事情说三遍,说多了都是泪啊,有可能在哪购买他都找不到)
最后只能被迫这样 晓文1
晓文2.png
晓文3.jpeg
最后提醒大家一下
如果是企业开发的话一定要和后台说清楚,不要只和苹果服务器校验是否成功,要把例如产品ID,价格都校验一下,而且要把订单标记为已购买(因为苹果服务器订单校验成功是没有时间限制的,如果一个人花一块钱买个东西把数据抓到以后,用这个订单再买别的东西,你只校验成不成功的话会出问题的)大家不要做坏事哦
第七步:应用国际化
说实话这可是个体力活(不然不就白叫码农了吗),英语分个美国英国等等,现在连繁体字也分香港和台湾(兄弟们准备好翻译软件了吗)
介绍宣传国际化(也可以叫本地化)
介绍本地化.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是动态语言,具有运行时特性,该特性可通过类名称和方法名的字符串获取该类和该方法,并实例化和调用。
我们可以通过类名/方法名反射得到相应的类和方法,
也可以替换某个类的方法为新的实现,
还可以新注册一个类,为类添加方法。
具体的方法可以看它的官网
现在只说一下工程应用的步骤(因为后台不太想管理热补丁,所以整个流程都是客户端完成的)
1.先导入JSPatch SDK到工程里(很小的,只有几个文件)
2.根据JSPatch语法写好热补丁,然后MD5加密上传到七牛,因为要自己管理七牛文件命名 开头一个字母来判断是否是正式环境,后面加上版本号。
3.每次进入应用判断有没有热补丁就行了。。
4.苹果爸爸说以后热更新,热修复不让用了,恭喜热修复不用看(ᵒ̤̑ ₀̑ ᵒ̤̑)
未完待续。。。。。最近在找工作 有时间更新东西了,想到什么写什么吧!