iOS项目实战-同学录-整体构架

同学录项目,实际上它不应该称之为项目。起先,它是我在上课时tableView章节的一次作业。秉着要做就要做好、要玩就要玩high的前提,索性就做足它。
所以,通讯录中加入了不少在真实生产当中会用到的元素。比如注册登陆、比如短信验证码、比如网络加载,etc。而这一切,都是无须花钱、无须服务器编程的。

构架

所谓构架,当然不是传统意义上的构架。这里只是东拼西凑的拿些SDK、开源库过来凑成一个项目。你可以在这里评论“负分、滚粗”,因为这里没有干货,有的只是最基本的“解决方案”。

根据功能点,这里流水清单一下:

短信验证码:

Mob短信验证码官网
使用了Mob的短信SDK,因为它免费,同时又无需编写后台API。直接拿来用,简单省事。
这里主要是用到了它的两个方法:

  • [SMSSDK getVerificationCodeByMethod]验证码获取方法,这个方法是用来从服务器请求校验码。
  • [SMSSDK commitVerificationCode]验证码校验方法,这个方法是将验证码和手机做匹配,校验合法性的。

网络数据存储服务:

BMOB官网
使用了Bmob的云端数据库服务,当然它也提供了一套SDK来获取数据,但是这里并不建议使用。如果你把所有的事情都丢给SDK,那么你来做什么?(SMS验证码必须使用SDK,他们并没有提供RESTFul的接口)
对于bmob的数据,rest涉及到的几点如下:

  • 基本的get、post请求
  • 自定义header请求头
  • request、response json格式的数据

网络请求库

AFNetworking官网
这个库,基本上是github上的一个神话!star数目现在是2万+。做什么的,怎么用,不展开了。
这里用了它的post方法:[贴上我的烂代码如下:]

- (void)registerUser:(NSDictionary *) dict {
    NSString *url = @"https://api.bmob.cn/1/users";

    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
    [sessionManager.requestSerializer setValue:@"***" forHTTPHeaderField:@"X-Bmob-Application-Id"];
    [sessionManager.requestSerializer setValue:@"***" forHTTPHeaderField:@"X-Bmob-REST-API-Key"];
    [sessionManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

    [sessionManager POST:url parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@", responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@", error);
    }];
}
`</pre>

### JSON对象模型库YYModel

YYModel[YYModel](https://github.com/ibireme/YYModel)
MJ大婶的开源库,优秀的json、model互转框架。谁用谁知道!
<pre>`// UserModel.h 用户模型
#import &lt;Foundation/Foundation.h&gt;

@interface UserModel : NSObject

@property (nonatomic, strong) NSString *objectId;
@property (nonatomic, strong) NSString *username;
@property (nonatomic, strong) NSString *email;
@property (nonatomic, assign) NSInteger emailVerified;
@property (nonatomic, strong) NSString *mobilePhoneNumber;
@property (nonatomic, assign) NSInteger mobilePhoneNumberVerified;
@property (nonatomic, strong) NSString *updatedAt;
@property (nonatomic, strong) NSString *createdAt;

@end
`</pre>
<pre>`UserModel *user = [UserModel yy_modelWithJSON:responseObject];
`</pre>
使用起来就是这么简单!

### Progress 进度条 HUD

漂亮的等待、加载进度条KVNProgress[官网](https://github.com/kevin-hirsch/KVNProgress)
在网络请求等比较耗时的操作时,用这个比较赞!

### iOS抽屉视图

JVFloatingDrawer iOS Floating Drawer [官网](https://github.com/JVillella/JVFloatingDrawer)
看多了TabViewController?试试Android推崇的Drawer吧!

### 辅助工具

网络请求调试API [HTTPBin](https://Httpbin.org)
网络请求调试工具 Chrome + PostMan扩展

### 知识点
  • MVC分层
  • ViewController间传值
  • 持久化储存数据 NSUserDefaults
  • 网络请求(session)
  • 基础界面构建
  • 基础动画
  • 抽屉导航
  • 字符串MD5加密
    `// MD5加密方法(使用类方法)
    + (NSString *)StringMD5:(NSString *)string {
        const char *cStr = [string UTF8String];
        unsigned char result[CC_MD5_DIGEST_LENGTH];
        CC_MD5(cStr, (int)strlen(cStr), result);
    
        NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
        for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++){
            [output appendFormat:@"%02x",result[i]];
        }
        return output;
    }

结束

大致构架就这样,日后将逐步展开。