Elvin's blog

陈文强的博客


  • 首页

  • 分类

  • 归档

  • 搜索

升级新版CocoaPod的几点注意

发表于 2016-08-18 | 分类于 tech

5月10号,CocoaPods发布了1.0.0版本,本文将介绍升级CocoaPods之后iOS项目的配置变化。

1 Podfile变化

新版CocoaPod要求必须在Podfile中标识“target”,即针对的项目名,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '7.0'

target 'EOAS' do
pod 'Masonry', '0.6.4'
pod 'PNChart', '0.8.8'
pod 'SWTableViewCell', '0.3.7'
pod 'TPKeyboardAvoiding', '1.2.11'
pod 'MJExtension', '3.0.10'
pod 'FXBlurView', '1.6.4'
pod 'FSCalendar', '1.8.2'
pod 'SDWebImage', '3.7.5'
pod 'ViewDeck', :git => 'https://github.com/ElvinChan/ViewDeck.git', :branch => 'develop'
end
阅读全文 »

MySQL存储3字节Emoji的3种解决方案

发表于 2016-06-29 | 分类于 tech

在使用MySQL存储微信用户昵称时,有时会发生报错。

Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1
这是因为有些Emoji使用了4字节的UTF8字符,而MySQL默认只支持3字节的UTF8,所以报出以上错误。

由于我们的网站后端使用Go语言,如何在Golang+MySQL环境下解决这个问题,以下是我想到的3种解决方案:

1 名门正派:修改MySQL配置使其支持4字节UTF8字符

①支持4字节的UTF8字符集是utf8mb4,但要求MySQL版本为5.5.3及以上,若不是,请升级到较新版本
②修改database、table和column字符集

1
2
3
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

③修改mysql配置文件my.cnf(windows为my.ini)
(找不到my.cnf的位置?看这里
MacOS下
Linux下
Windows下
)

阅读全文 »

由Docker时区设置引发的问题

发表于 2016-05-26 | 分类于 tech

老实说,在以往的开发中一般很少考虑时区问题。一来因为以往的项目不论用户还是服务器都在国内,不存在时差;二来服务器一般都设定了正确的时区,所以在整个项目中直接使用Local时间是没有问题的。但这次有些不同:项目部署到云服务器的Docker后,发现存入MySql数据库中的时间比本地时间慢8小时。

貌似是很简单的问题——MySQL存入了UTC时间,但究竟什么原因?如何解决?还是费了不少功夫。

1 问题排查

①首先怀疑是MySQL设定问题,然而Golang后端与MySQL的连接字符串已经设定了时间存取方式,如下
"root:123456@tcp(127.0.0.1:3306)/wxshop_dev?charset=utf8&parseTime=True&loc=Local"
而且在本地测试是不存在时差问题的,那么初步判断应该是部署环境的设定问题。

阅读全文 »

小心!KVO重复添加引起Crash

发表于 2016-02-16 | 分类于 tech

KVO是个好东西,但使用不当将导致巨坑——甚至应用崩溃都不在话下。下面就是一个典型案例。

1 问题描述

使用第三方框架ViewDeck实现侧滑出现隐藏View的功能。具体步骤为:

①创建IIViewDeckController(带有leftController和centerController)

1
2
3
4
5
6
7
8
9
10
11
12
13
// ViewController.m
- (void)setupNextController
{
IIViewDeckController *deckController = [[IIViewDeckController alloc] init];
LeftViewController *leftController = [[LeftViewController alloc] init];
CenterViewController *centerController = [[CenterViewController alloc] init];

deckController = [[IIViewDeckController alloc] initWithCenterViewController:centerController leftViewController:leftController];

deckController.centerhiddenInteractivity = IIViewDeckCenterHiddenNotUserInteractiveWithTapToClose;

[self.navigationController pushViewController:deckController animated:YES];
}
阅读全文 »

iOS远程推送和证书的一些Q&A

发表于 2016-01-25 | 分类于 tech

iOS开发中的一大课题是研究和排查关于证书和推送的各种问题,以下是一些比较重要但容易被忽略的点。

Q:为什么有时收到远程推送但没有任何提示?

A:如果程序是运行在前台的状态下,收到远程推送时不会有任何提示,这是苹果对iOS系统设定的逻辑,无法改变。但是可以通过以下方式灵活处理:
①在application:didReceiveRemoteNotification:方法中将远程推送转换为本地通知,虽然不能在屏幕顶端弹出提示,但是还是可以显示在系统通知栏且发出提示音的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
// Required
[APService handleRemoteNotification:userInfo];
NSLog(@"收到通知:%@", userInfo);

// 当App运行在前台,转换为本地通知
if (application.applicationState == UIApplicationStateActive && userInfo.count != 0) {
[[UIApplication sharedApplication] cancelAllLocalNotifications];
UILocalNotification *notify = [[UILocalNotification alloc] init];

notify.soundName = UILocalNotificationDefaultSoundName;
notify.userInfo = userInfo;
notify.alertBody = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];

[[UIApplication sharedApplication] presentLocalNotificationNow:notify];
}
}
阅读全文 »

忙里偷闲,写了一个JQuery插件

发表于 2015-11-01 | 分类于 tech

相比HTML原生的select控件,bootstrap提供的drop-down控件不仅更好看,在各个浏览器下的样式更统一,而且可以添加很多个性化的设置,比如单按钮/分裂式、各种尺寸、向上弹出等等。

Compare

然而bootstrap并没有提供很便捷的使用方法,要想创建一个这样的drop-down控件,至少需要10到20行左右的HTML代码,之后添加数据、添加事件还需要用JQuery直接操作DOM结点,一两个还好,写多了绝对把人逼疯。

手写drop-down实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="btn-group">
<button type="button" class="btn btn-default">Action</button>
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</div>
阅读全文 »

重写File控件样式,实现文件异步上传

发表于 2015-09-09 | 分类于 tech

目前比较流行的Web端文件上传插件大多使用了Flash或HTML5技术,比如WebUploader。一个比较极端的情况是同时不具备以上环境,比如没有装Flash插件的IE8,基本上只剩下javascript模拟表单这一条路了。以下介绍一种比较简单的,利用CSS重写原生input(type=”file”)控件样式,实现文件异步上传的方法。

1 重写原生File控件的CSS样式

这里参考了input(file)浏览按钮美化提供的方法。

需要注意的是:IE9以下不支持opacity(透明度)属性,需要单独设置filter:alpha(opacity=0);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
input[type=file]
{
position: absolute;
right: 0;
top: 0;
font-size: 100px;
opacity: 0;
filter:alpha(opacity=0);
cursor: pointer;
}
#file-submit
{
display:none;
}
阅读全文 »

OSX下使用Workbench/Navicat连接MySQL出现61错误的解决办法

发表于 2015-07-29 | 分类于 tech

安装MySQL 5.26.6 for Mac后,在Console中可以正常连接到本地Database,但使用Workbench/Navicat连接就会出现61错误。

61Error

检查数据库的各项配置均正常,推测可能是root账户密码为空造成的,Console中使用命令mysqladmin -u root password "123456"将密码修改为123456,故障依旧。

阅读全文 »

一次性厘清loadView、initFromNib、viewDidLoad之间的关系

发表于 2015-06-04 | 分类于 tech

当一个UIViewController通过代码生成之后,其事件调用顺序init → ViewDidLoad → viewWillAppear → viewDidAppear,这是众所周知的。然而在init和ViewDidLoad之间,系统还隐式调用了一些方法,今天就来探讨这部分问题。

1 问题起源

通过一个按钮跳转到控制器ApplyViewController,在ViewDidLoad中加载ApplyView.xib作为控制器的SubView,ApplyView.xib中有一个View,其类型是ApplyView,如图

图1

阅读全文 »

当UIActionSheet遇上Block

发表于 2015-05-29 | 分类于 tech

众所周知,Block会对其中使用的对象进行强引用,但如果要在Block中要实现弹出ActionSheet的操作,又会有哪些问题呢?

换句话说,当有点像代理的Block遇上真正的代理方法——ActionSheet的点击事件,又会不会产生冲突呢?

1 问题描述

页面是一个TableViewController,由继承自UITableViewCell的不同类作为每个Cell的类,而Cell中的各种元素都交给了模型管理,也包括点击Cell触发的事件,代码如下:

阅读全文 »
123
Elvin Chan

Elvin Chan

If you rest, you rust

26 日志
1 分类
32 标签
RSS
GitHub 微博
Links
  • BestUCloud
© 2014 — 2021 Elvin Chan
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4
Hosted by Coding Pages