App间跳转

iOS篇

schema

schema是iOS9之前比较主流的一种跳转方案了, 更多的是用在了两个APP相互跳转中。也可以在Safari中输入 schema:// 跳转到App内部
比如在浏览器输入 wechat:// 就可以跳到微信

使用URL Scheme 跳转到系统

要跳转到别人的app,就要知道别人的app的跳转协议是什么,需要传入什么参数,我们常见的跳转到系统有下面这些:

1
2
3
4
5
6
// 1.打开Mail
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:[email protected]"]]
// 2.打开电话
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:1-408-555-5555"]];
// 3.打开SMS
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:1-408-555-1212"]];

Read More

Chrome-shortcuts

Chrome 常用快捷键

  • 打开最近关闭tab: Command-Shift-T
  • 跳到指定tab: Command-[1-9]
  • 切换到上一个、下一个tab: Ctrl-Tab(下一个)、Ctrl-Shift-Tab(上一个)
  • 关闭tab、window: Command-W(Tab) Command-Shift-W(window)
  • 在新tab打开链接: Command-Shift-click(在新tab打开链接并切换过去) Command-click(在新tab打开链接不切换过去)
  • 在新window打开链接: Shift-click
  • 打开新window: Command-N Command-Shift-N(隐私模式)
  • 向下、向上滚:空格(向下) Shift+空格(向上)
  • 滚到顶部、底部: Command-上箭头 Command+下箭头
  • 停止刷新、重载: Escape Command-R
  • 跳到地址栏: Command-L
  • 重置缩放: Command-0
  • 将当前网页添加到书签: Command-D
  • 打开设置: Command-,
  • 查看所有下载: Command-Shift-J

react-optimized

react 性能优化

使用 shouldComponentUpdate

react 生命周期
upload successful

react 的生命周期可以看出,当 componentpropsstate 改变时,会调用 shouldComponentUpdate 确认要不要刷新。默认 shouldComponentUpdate 都是返回 true ,这样 component 就会 re-render 。我们可以重写 shouldComponentUpdate , 使之只在特定情况返回 true ,其他情况返回 false ,来避免不必要的 re-render

Read More

react-native 日期格式化

今天在 react native 项目中,遇到了一个日期格式化的问题,做下笔记

问题

当App开启调试模式时

1
let date = new Date('2018-07-07T22:44:14.000+0800'); // Sat Jul 07 2018 22:44:14 GMT+0800 (中国标准时间)

就这样很开心提交代码打包。第二天发现客户端显示日期不对,显示 Invalid Date,😫。
经过重复实验,发现
当关闭调试模式

1
let date = new Date('2018-07-07T22:44:14.000+0800'); // Invilid Date

终于重现问题。

Read More

CryptoJS 使用

CryptoJS 使用

安装

1
npm install crypto-js

3DES 加密解密

key 和 iv

1
2
3
4
5
6
7
8
// 导入模块
let TripleDES = require('crypto-js/tripledes');
import CryptoJS from 'crypto-js';

// key
const TripleDESKey = 'abcdefghijklmnopqrstuvwxyz';
// iv
const TripleDESIV = '23333333';

Read More

OpenGL坐标体系

顶点坐标

顶点坐标采用的是标准化设备坐标(Normalized Device Coordinates, NDC)
标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上

upload successful
与通常的屏幕坐标不同,y轴正方向为向上,(0, 0)坐标是这个图像的中心,而不是左上角。最终你希望所有(变换过的)坐标都在这个坐标空间中,否则它们就不可见了。

Read More

image memory manage

imageNamed: vs imageWithContentsOfFile:

  • 利用imageNamed:方法加载过的图片, 永远有缓存, 这个缓存是由系统管理的, 无法通过代码销毁缓存
  • 利用initWithContentsOfFile:/imageWithData:等方法加载过的图片, 没有缓存, 只要用完了, 就会自动销毁
    Tips
  • 小图片或使用频率比较高的图片使用imageNamed:方法加载
  • 大图片或使用频率比较低的图片使用initWithContentsOfFile:/imageWithData:方法加载
  • 由于”Deployment Target >= 7.x”放在Images.xcassets里面的所有图片,会被放到Assets.car中,无法得到图片的全路径, 只能通过图片名(imageNamed:方法)来加载图片, 永远会有缓存,所以小图片或使用频率比较高的图片可以放在Images.xcassets中,大图片和使用频率比较低低图片最好不要

UIViewController Lifecycle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#pragma mark --- life circle

// 非storyBoard(xib或非xib)都走这个方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
NSLog(@"%s", __FUNCTION__);
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {

}
return self;
}

// 如果连接了串联图storyBoard 走这个方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
NSLog(@"%s", __FUNCTION__);
if (self = [super initWithCoder:aDecoder]) {

}
return self;
}

// xib 加载 完成
- (void)awakeFromNib {
[super awakeFromNib];
NSLog(@"%s", __FUNCTION__);
}

// 加载视图(默认从nib)
- (void)loadView {
NSLog(@"%s", __FUNCTION__);
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor redColor];
}

//视图控制器中的视图加载完成,viewController自带的view加载完成
- (void)viewDidLoad {
NSLog(@"%s", __FUNCTION__);
[super viewDidLoad];
}


//视图将要出现
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewWillAppear:animated];
}

// view 即将布局其 Subviews
- (void)viewWillLayoutSubviews {
NSLog(@"%s", __FUNCTION__);
[super viewWillLayoutSubviews];
}

// view 已经布局其 Subviews
- (void)viewDidLayoutSubviews {
NSLog(@"%s", __FUNCTION__);
[super viewDidLayoutSubviews];
}

//视图已经出现
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewDidAppear:animated];
}

//视图将要消失
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewWillDisappear:animated];
}

//视图已经消失
- (void)viewDidDisappear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewDidDisappear:animated];
}

//出现内存警告 //模拟内存警告:点击模拟器->hardware-> Simulate Memory Warning
- (void)didReceiveMemoryWarning {
NSLog(@"%s", __FUNCTION__);
[super didReceiveMemoryWarning];
}

// 视图被销毁
- (void)dealloc {
NSLog(@"%s", __FUNCTION__);
}

Read More