玉炜的iOS开发规范(12.14更新)
苹果账号篇
1、新建一个新项目之后的bundle ID无论是否定没定,上架的账号如果没定,最好先写一个绝对用不上的名字,因为这个bundle ID一经确定会被绑定在当前你的苹果账号上,如果正好绑定的是非开发者账号(换句话说就是没有交钱的账号)那这个bundle ID就只能跟着这个账号了(如果是开发者账号还可以挽救一下,因为可以上苹果开发者网站删掉)。
2、苹果开发者网站底部有更改语言为中文的选项,虽然整个网站不可能是完全汉化的,但是申请开发者账号时访问的网页基本上都是中文的,对英语苦手来说确实是一大福利。
3、如果你维护中的iOS项目因为各种莫名其妙的原因会长时间不能使用原有的开发账号,这个时候不仅会无法上架,甚至连真机调试也不能用,这个时候的应对方式就是将bundle id修改别的,然后用自己的apple账号(不是开发者账号也能用)运行就可以解决。
bugly使用指导篇
埋点是个好习惯,当网络请求失败的时候记得上传报错信息,相关代码:
failure:^(NSString *errorMessage, int errorCode) {
NSDictionary *reportDic = @{
@"errorMessage":errorMessage,
//其他错误
}.copy;
NSException *exception = [[NSException alloc]initWithName:@"xxx"
reason:@""
userInfo:reportDic];
[Bugly reportException:exception];
}];
有时候,我们可能(其实也应该)当问题发生的时候都会想着一股脑的自定义上传一些全局信息(例如用户名、用户ID、搞不搞基等(咦?)),而人是很懒的,我们不希望每次都会重复输入又长又长的代码来上传这些信息,而且上一条的方法只是自定义上传的报错,当遇到崩溃的时候是不管用的。而bugly的delegate里面提供了一个方法:
- (NSString *)attachmentForException:(NSException *)exception ;
所以只要签订协议<BuglyDelegate>
,并实现该方法即可
- (NSString *)attachmentForException:(NSException *)exception {
NSDictionary *userDic = @{
@"hxId":@"xxx"
@"username":@"xxx",
@"userIdName":@"xxx",
@"userClassId":@"xxx",
@"userClassName":@"xxx",
};
NSLog(@"用户相关信息:%@", userDic);
NSLog(@"(%@:%d) %s %@",[[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, __PRETTY_FUNCTION__,exception);
return @"This is an attachment";
}
动作交互篇
1、SVProgressHUD提示信息一般条件下应当这么使用用户体验最佳
[SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeBlack];
[SVProgressHUD showSuccessWithStatus: @"成功"];
[SVProgressHUD dismissWithDelay:1 completion:^{
[SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeNone];
}];
即先把提示背景置为灰色(此时不可以点击其他),设定延迟1秒后消去(如果字数两行的话多延迟1秒,再长就用UIAlertViewController),然后又把提示背景设为为无。
2、确保SVProgressHUD不在UIAlertViewController中使用,因为不会出现。目前可行替代方案暂时是用UIAlertViewController。
UI篇
1、官方认为按钮宽高小于44的情况下按压下去是很难触发的,而实际情况下许多按钮比这个大小要小(日常黑美工),所以可用imageEdgeInsets属性来缓解触摸不灵的问题。
2、一般给按钮设定选择状态时的图片时一般都是这么做的
[btn setImage:[UIImage imageNamed:@"a1"]
forState:UIControlStateNormal];
[_pupilBtn setImage:[UIImage imageNamed:@"a2"]
forState:UIControlStateSelected];
然而这么做会出现一定的问题,用户在按键处于选择状态的时候长按(谁这么无聊)时,按钮立刻会显示为未选择的状态。
所以如果需要在高亮状态下保持原状的话代码应该这么写
[_pupilBtn setImage:[UIImage imageNamed:@"a1"]
forState:UIControlStateNormal];
[_pupilBtn setImage:[UIImage imageNamed:@"a1"]
forState:UIControlStateHighlighted];
[_pupilBtn setImage:[UIImage imageNamed:@"a2"]
forState:UIControlStateSelected];
[_pupilBtn setImage:[UIImage imageNamed:@"a2"]
forState:UIControlStateSelected | UIControlStateHighlighted];
【和后台相爱相杀篇】
每次进行新项目开发前与后台开发确定好返回错误,错误码(error code)和错误信息(error message)的key,并敦促后台一定千万要一直使用这个key。
——HTTPClient是公司iOS开发常用的用于发送网络请求的小型库,其与AFNetworking联动,可以针对请求成功和请求失败通过条件判断选择下一步的操作,这个在AFNetworking里虽有实现,但是其对正确、失败的判定依据多在于服务器是否返回数据,其中就存在着返回的数据明明在表达着“失败”却又被AFNetworking认定为“成功”的尴尬效果,HTTPClient就对此弊端进行了优化,在AFNetworking判定成功的前提下又增加了对错误码和错误信息是否存在的判定,完善了整个判定的正确性。以get请求为例,源代码如下:
[manager GET:url parameters:params progress:NULL success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *responseDict = (NSDictionary *)responseObject;
int code = [responseDict[@"code"] intValue];
if (0 == code && responseDict) {
if (success) {
success(responseObject);
}
} else {
NSString *errorMessage = responseDict[@"msg"];
if (failure) {
failure(errorMessage, code);
}
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[SVProgressHUD dismiss];
NSString *errorMsg = [error localizedDescription];
if (failure) {
failure(errorMsg, (int)error.code);
}
DebugLog(@"GET Request error:\n %@", errorMsg);
}];
看得出代码虽然成功实现了预期的功能,但是弊端也是有的,此代码只是通过是否存在”code”、”msg”来进行判定,所以与后台沟通的时候一定要确定好是否要用这两个key。
iOS 11适配遇坑篇
scrollView可能会有些坑,比如说tableview reloadData时会可能出现瞬移的现象。遇到这种情况的解决方法如下
if (@available(iOS 11.0, *)) {
self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
self.scrollView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
self.scrollView.scrollIndicatorInsets = self.scrollView.contentInset;
} else {
self.automaticallyAdjustsScrollViewInsets = YES;
}
注意,scrollView在iOS 11出现的时候需要先用以前的版本测试是不是在以前的版本也会出现,如果以前的版本也出现的话就说明这根本就不是iOS 11的锅,毕竟人家库克再怎么gay也是有gay力来统帅苹果的,干嘛什么事情都怪人家。
iOS 11还有个坑的地方就是导航栏的titleView,比如说我们要在导航栏中间加个什么搜索栏的时候通常都会用到如下语句。
self.navigationItem.titleView = titleView;
这个时候可能会出现按理说长条的搜索栏会长成了天眼(图日后补)。
这个时候就要做适配。
if(@available(iOS 11.0, *)) {
[[self.titleView.heightAnchor constraintEqualToConstant:<#高#>] setActive:YES];
[[self.titleView.widthAnchor constraintEqualToConstant:<#宽#>] setActive:YES];
}
玉炜的iOS开发规范(12.14更新)的更多相关文章
- 一份可以落地靠谱iOS开发规范
列出来的都是个人觉得在团队合作,代码阅读,代码维护中比较重要的一些点,没有什么空格 间距华而不实的东西在里面.涉及 命名规范.编码规范.代码管理规范 命名规范 项目名都遵循大驼峰命名.例如:MSMob ...
- iOS 开发之版本上线更新流程
iOS 开发之版本上线更新流程 把自己app上线的流程记录下来,希望能够让自己加深印象,也能帮助到一些人便是极好的! 证书和描述文件的配置就不写了,直接配置工程吧. 大致把我自己上线的流程写一下: ...
- iOS开发网络资源整理-持续更新
本文记录iOS开发相关的网络社区和博客 1.objc中国 网址:http://objccn.io 简介:onevcat创建,项目的成立源于国内 Objective-C 社区对 objc.io 的翻译活 ...
- [置顶] iOS开发规范
iOS代码编程规范 详细讲解代码该如何写,怎样写,如何规范. 什么样的代码是最美的,本文档会给你讲解 iOS代码编程规范........................................ ...
- Android应用开发相关下载资源(2014/12/14更新)
官方终于发布了Android Studio正式版,Android Studio将会成为推荐使用的主要Android开发工具. (1)Android SDK (Android SDK主安装包,包含SDK ...
- iOS开发笔记12:iOS7上UITextField限制字数输入导致崩溃问题
在一些场景中,需要限制用户的输入字数,例如在textField里进行控制(textView也类似,崩溃原因也相同),如图所示 系统会监听文本输入,需要注意的第一点是输入法处于联想输入还未确定提交的时候 ...
- iOS 开发规范
公司来了大牛 是绝好的学习机会 今天分享了我们一个代码规范 比如UITableViewCell 1.首先根据这个cell 需要的数据源 建一个数据model ,只针对于 该cell 好处:数据独立 ...
- iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案
今天在自己的项目中用CocoaPods引入第三方SDWebImage的时候,出现了问题.当更新完毕后,在终端没太注意这个问题的提示,就直接使用SDWebImage了,在使用的时候一些方法的提示和头文件 ...
- iOS开发常见问题(不断更新)
1.如何从程序退出到桌面 在单击事件中 exit(0);即可. 2.如何强制横屏 在你需要横屏的控制器里加入如下代码 - (BOOL)shouldAutorotate{ return NO; } - ...
- 我的iOS开发系列博文
之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...
随机推荐
- docker-compose安装EFK
一.环境 IP 系统 配置 版本 192.168.10.100 Centos7.9 2核4G Docker Compose version v2.19.1.EFK-7.17.11 EFK版本是试用版本 ...
- Android Studio自强迫升级到4.2版本后调试Native项目时总是卡死问题
原文地址:https://www.zhaimaojun.top/Note/5464968 就在昨天,也就是2021年5月6号,Android Studio强迫用户升级到4.2版本, 原因就是jcent ...
- OpenCompass-书生浦语大模型实战营第二期第7节作业
书生浦语大模型实战营第二期第7节作业 这一节的作业和第6节作业一样没有特别多好说的,以运行结果为主. 基础作业 使用 OpenCompass 评测 internlm2-chat-1_8b 模型在 C- ...
- SQL Server实战五:存储过程与触发器
本文介绍基于Microsoft SQL Server软件,实现数据库存储过程与触发器的创建.执行.修改与删除等操作. 目录 1 交互式创建并执行--存储过程一 2 交互式创建并执行--存储过程二 ...
- 深度学习项目-MobileNetV2水果识别模型
FruitRecognition DeepLearning深度学习小项目,利用CNN和MobileNetV2搭建的水果识别模型. github地址 fruit为本次大作业使用的数据集. geneFru ...
- Vue 3.3 发布
本文为翻译 原文地址:宣布推出 Vue 3.3 |The Vue Point (vuejs.org) 今天我们很高兴地宣布 Vue 3.3 "Rurouni Kenshin" 的发 ...
- 基于 ESP8266_RTOS_SDK 驱动 DHT11
概述 DHT11模块使用一根data线实现信号触发以及数据反馈,信号格式参考如下 https://zhuanlan.zhihu.com/p/347904660 本文使用GPIO中断的方式采集反馈数据 ...
- MyBatis延迟加载策略详解
延迟加载就是在需要用到数据的时候才进行加载,不需要用到数据的时候就不加载数据.延迟加载也称为懒加载. 优点:在使用关联对象时,才从数据库中查询关联数据,大大降低数据库不必要开销. 缺点:因为只有当需要 ...
- Vue cli之安装
1.安装node.js Node.js是一个新的后端(后台)语言,它的语法和JavaScript类似,所以可以说它是属于前端的后端语言,后端语言和前端语言的区别: 运行环境:后端语言一般运行在服务器端 ...
- Asp.NetCore3.1 asp.net 5.0 中多次读取 Request.Body Ajax Post过来的JSON数据等 已验证有效
首先,以下方式是错误的(这个重复读取只能在using语句里面生效,因为用了ms对象赋值,当using结束后ms资源被释放,Request.Body就无法再读了) [HttpPost] public a ...