苹果账号篇


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. netcore依赖注入通过反射简化

    aspnetcore里面用到许多的service,好多业务代码都要通过Service.AddScoped.Singleton.Transient等注入进去,类太多了写起来和管理起来都很麻烦,所以借鉴了 ...

  2. Ollama开发指南

    安装必备工具 确保已安装以下软件的正确版本: CMake 3.24 或更高版本 Go 1.22 或更高版本 GCC 11.4.0 或更高版本 使用 Homebrew 安装这些工具(适用于macOS和L ...

  3. 阿里巴巴Canal常见问题:重复解析/Filter失效/消费落后

    前言 Canal是阿里巴巴开源的数据库Binlog日志解析框架,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 在之前我写的文章阿里开源MySQL中间件Canal快速入门中, ...

  4. Java IO流文件

    Java IO流文件 创建文件 使用File类进行创建文件操作,创建该对象包含三种构造方法 new File(String pathname); //根据路径+文件名创建一个File对象 new Fi ...

  5. 【OpenVINO™】在 C# 中使用OpenVINO™ 部署PP-YOLOE实现物体检测

     前言 OpenVINO C# API 是一个 OpenVINO 的 .Net wrapper,应用最新的 OpenVINO 库开发,通过 OpenVINO C API 实现 .Net 对 OpenV ...

  6. java学习之旅(day.14)

    可变字符串 StringBuffer:可变长字符串,运行效率慢,线程安全 StringBuilder:可变长字符串,运行效率快,线程不安全 package com.zhang.lei; //Strin ...

  7. 10-flask博客项目

    centos7 编译安装python3.7.1 安装步骤 centos7自带python2,由于执行yum需要python2,所以即使安装了python3也不能删除python21.安装依赖包yum ...

  8. call failed:, {"errMsg": "canvasToTempFilePath:fail invalid viewId"}苹果设备保存离屏 canvas 问题

    call failed:, {"errMsg": "canvasToTempFilePath:fail invalid viewId"}苹果设备保存离屏 can ...

  9. NumPy 随机数据分布与 Seaborn 可视化详解

    随机数据分布 什么是数据分布? 数据分布是指数据集中所有可能值出现的频率,并用概率来表示.它描述了数据取值的可能性. 在统计学和数据科学中,数据分布是分析数据的重要基础. NumPy 中的随机分布 N ...

  10. 【力扣-TS解题】1、回文数

    给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不是 来源 ...