app开发Swifty CodingiOS开发资料收集

iOS开发_个人开发者怎么做出自己的APP

2016-12-30  本文已影响4797人  起于微未

相信大家都有过做自己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聚合数据了吧,

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

第二步 用户注册登录:

用户注册登录(当然会搭服务器的小哥继续可以跳过)大家可以搜一下,有专门的SDK,据我所知有腾讯云和bmob后端云是免费的,我现在用的bmob后端云
控制台效果:

后端云控制台.png
具体实现代码奉上
       //注册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)添加到你的工程目录中。
添加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];// 设置角标(到服务器)
   
    
}


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

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

图标讲解.png
做应用的话,需要用到好多图标(作为连画画都不会的人来说,能愁死。当然如果有好的UI朋友的话可以跳过)
矢量图的话推荐用阿里矢量图库图标算是最全的了,基本上搜的都有,
阿里矢量图.png
下载的话可以设置格式,颜色,大小
阿里矢量图2.png
应用图标尺寸
应用图标.png

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

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

第六步:苹果内支付

苹果内支付(不需要的话可以跳过)
要使用苹果内支付需要给苹果30%的分成,只有超过150刀才会给你打钱,而且具体使用中还有好多坑,等等慢慢吐槽。
需要付费的虚拟物品必须使用苹果内支付(比如直播打赏的道具),当然你也可以隐藏一个用于支付的H5页面(不过被发现了下场会很惨,但是我发现有好多没被发现的,难道是看脸的吗)
具体的过程简书作者Bison说得很清楚了,我就不细说了,但是套句领导的话“我再补充两句”
首先是类型的选择

屏幕快照 2017-01-04 上午11.22.41.png
然后是审核最好详细点,最好有图片,千万不要高估审核人员的智商,不要高估,不要高估(重要的事情说三遍,说多了都是泪啊,有可能在哪购买他都找不到)
最后只能被迫这样 晓文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是动态语言,具有运行时特性,该特性可通过类名称和方法名的字符串获取该类和该方法,并实例化和调用。
我们可以通过类名/方法名反射得到相应的类和方法,
也可以替换某个类的方法为新的实现,
还可以新注册一个类,为类添加方法。
具体的方法可以看它的官网

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

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

上一篇下一篇

猜你喜欢

热点阅读