苹果账号篇


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更新)的更多相关文章

  1. 一份可以落地靠谱iOS开发规范

    列出来的都是个人觉得在团队合作,代码阅读,代码维护中比较重要的一些点,没有什么空格 间距华而不实的东西在里面.涉及 命名规范.编码规范.代码管理规范 命名规范 项目名都遵循大驼峰命名.例如:MSMob ...

  2. iOS 开发之版本上线更新流程

    iOS 开发之版本上线更新流程   把自己app上线的流程记录下来,希望能够让自己加深印象,也能帮助到一些人便是极好的! 证书和描述文件的配置就不写了,直接配置工程吧. 大致把我自己上线的流程写一下: ...

  3. iOS开发网络资源整理-持续更新

    本文记录iOS开发相关的网络社区和博客 1.objc中国 网址:http://objccn.io 简介:onevcat创建,项目的成立源于国内 Objective-C 社区对 objc.io 的翻译活 ...

  4. [置顶] iOS开发规范

    iOS代码编程规范 详细讲解代码该如何写,怎样写,如何规范. 什么样的代码是最美的,本文档会给你讲解 iOS代码编程规范........................................ ...

  5. Android应用开发相关下载资源(2014/12/14更新)

    官方终于发布了Android Studio正式版,Android Studio将会成为推荐使用的主要Android开发工具. (1)Android SDK (Android SDK主安装包,包含SDK ...

  6. iOS开发笔记12:iOS7上UITextField限制字数输入导致崩溃问题

    在一些场景中,需要限制用户的输入字数,例如在textField里进行控制(textView也类似,崩溃原因也相同),如图所示 系统会监听文本输入,需要注意的第一点是输入法处于联想输入还未确定提交的时候 ...

  7. iOS 开发规范

    公司来了大牛  是绝好的学习机会 今天分享了我们一个代码规范 比如UITableViewCell 1.首先根据这个cell 需要的数据源 建一个数据model ,只针对于 该cell  好处:数据独立 ...

  8. iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案

    今天在自己的项目中用CocoaPods引入第三方SDWebImage的时候,出现了问题.当更新完毕后,在终端没太注意这个问题的提示,就直接使用SDWebImage了,在使用的时候一些方法的提示和头文件 ...

  9. iOS开发常见问题(不断更新)

    1.如何从程序退出到桌面 在单击事件中 exit(0);即可. 2.如何强制横屏 在你需要横屏的控制器里加入如下代码 - (BOOL)shouldAutorotate{ return NO; } - ...

  10. 我的iOS开发系列博文

    之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...

随机推荐

  1. [FE] FastAdmin 动态下拉组件 Selectpage 自定义 data-params

    正常情况下,我们想获取列表只需要定义接口路径和要显示的字段名即可, 比如: <input id="c-package_ids" data-rule="require ...

  2. Redis 5集群部署

    1.redis特点 (1)基于内存 (2)可持久化数据 (3)具有丰富的数据结构类型,适应非关系型数据的存储需求 (4)支持绝大多数主流开发语言,如C.C++.Java.Python.R.JavaSc ...

  3. CF1872G

    题意:一个正整数序列,\(a[i] < 10^9\),求 \(l\),\(r\),最大化 \[\sum_{i = 1}^{l - 1} a[i] + \prod_{i = l}^r a[i] + ...

  4. 【WebForms王者归来】在 ASP.NET Core 中运行 WebForms 业务代码,99%相似度!

    1. 先说结论 我们为 ASP.NET Core 带来了全新的 WebForms 开发模式,可以让 20 年前的 WebForms 业务代码在最新的 ASP.NET Core 框架中运行,代码相似度9 ...

  5. Windows远程连接工具有哪些

    Windows远程连接工具,一般称为远程桌面软件,更准确的叫远程访问软件或远程控制软件,可以让你从一台电脑远程控制另一台电脑.远程桌面软件允许您控制连接的计算机,就好像它就在您面前一样. 远程桌面工具 ...

  6. 前后端分离项目集成PageOffice——实现在线编辑Word文件的版本控制

    PageOffice本身提供了SaveFilePage的js方法,但是由于该方法不支持代理且不能跨域导致在前后端分离项目中无法使用 功能:实现三个按钮分别保存不同版本的文件 1.PageOffice可 ...

  7. PageOffice 在线打开 word 文件并添加水印

    一.服务器端方法插入水印 1.插入文字水印 WordDocument doc = new WordDocument(); //添加水印 ,设置水印的内容 doc.getWaterMark().setT ...

  8. Base64 java图片工具类

    import org.springframework.util.Assert; import javax.imageio.ImageIO; import java.awt.image.Buffered ...

  9. Linux之kill命令

    1.kill命令的使用格式 kill [参数] [进程号] 2.kill命令的功能 发送指定的信号到相应进程.不指定型号将发送SIGTERM(15)终止指定进程.如果任然无法终止该程序可用" ...

  10. 2024 FIC取证比赛wp(更新中)

    本次竞赛容器挂载密码为: 2024Fic@杭州Powered~by~HL! 2024年4月,卢某报案至警方,声称自己疑似遭受了"杀猪盘"诈骗,大量钱财被骗走.卢某透露,在与某公司交 ...