相信大家都有过做自己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.苹果爸爸说以后热更新,热修复不让用了,恭喜热修复不用看(ᵒ̤̑ ₀̑ ᵒ̤̑)
未完待续。。。。。最近在找工作 有时间更新东西了,想到什么写什么吧!
网友评论
接下来的步骤
您的应用程序必须以卖方名称和公司名称发布,以反映应用程序或其元数据中引用的彩票服务所有者或政府实体的名称。
“你”和“你”的意思,是指人(S)或法律实体(无论是公司、组织、教育机构或政府机构,部门,或部门)使用苹果软件或行使本协议下的权利。为了清晰起见,您可以授权承包商为您开发应用程序,但任何此类应用程序必须在您的开发人员帐户下提交。
一旦创建,就不能在iTunes连接中更改您的卖家名称或公司名称。为了帮助更改您的公司名称或卖家名称,您需要通过“联系人”页面与iTunes Connect联系。选择从第一下拉菜单开始,然后选择一般的iTunes连接查询联系适当的iTunes连接小组。”,请问您知道怎么破吗