ReactiveCocoa-UI-Button

新项目中使用了ReactiveCocoa框架,然后在使用过程中遇见的问题记录一下
今天遇见了UIButton的使用
传统的UIButton Target Action 方式

之前我们使用UIButton的点击方法一般有两种。一种是直接从xib里面拖一个IBAction出来在里面写代码。

另外一种是代码创建的 比如这样

UIButton *myButton = [[UIButton alloc] init…];
[myButton addTarget:something action:@selector(myAction) forControlEvents:UIControlEventTouchUpInside];
然后在下面写一个myAction的方法来进行操作。

这样对我来说存在两个问题:

button对应的方法分开了。在阅读代码的时候,当我想知道这个button对应的方法或者反过来action方法对应的button。通常需要跳转一次以上才能知道。(也许是我的阅读代码习惯比较原始)
我在action方法里面如果需要引用一个变量的时候,无法使用局部变量。通常就需要把这个资源设计为一个property。尽管这个资源或者变量只是在action里面调用一次。(这个也许是我写代码的问题)
这两个可能在我遇见ReactiveCocoa都不能叫问题。但是在ReactiveCocoa里面我发现了更加优美的解决方法。好开心。

ReactiveCocoa方式的UIButton

由于ReactiveCocoa高深的知识点,我也弄不太清楚。下面我只是说明怎么用的hello world级别。更多内容请阅读github上的项目主页。

如果使用xib。只需拖一个IBOutlet的property出来。比如这样

@property (weak, nonatomic) IBOutlet UIButton xibButton;
NSString
helloWorld = @”hello world!!!”;
self.xibButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@”%@”, helloWorld);
return [RACSignal empty];
}];
如果是代码创建一切照旧

NSString helloWorld = @”hello world!!!”;
UIButton
myButton = [UIButton buttonWithType:UIButtonTypeSystem];
myButton.frame = CGRectMake(0, 0, 100, 50);
[myButton setTitle:@”Say” forState:UIControlStateNormal];
[self.view addSubview:myButton];
myButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@”%@”, helloWorld);
return [RACSignal empty];
}];
这些代码我一般写在viewDidLoad方法里面。当然你可以在正确的地方使用他们。
运行试试。哇。魔法一般。完全解决我在传统的UIButton遇到的两个问题。

Best Wishes

ios-iBeacon-test

iBeacon是苹果公司在iOS7推出的新技术,但是发现国内这方面的app一直很少,今天抽时间也研究一下
传统的GPS最多可以定位10米左右的范围,但是iBeacon的范围是可以
iBeacon是苹果被允许能在后台运行的,不论你将应用退出到后台还是杀死,iBeacon都能激活应用不过只能激活10秒左右,但是这段时间足可以做很多事情了。

iBeacon 硬件
当 Apple 在 iOS 7 中介绍 iBeacon 时,他们也宣布任何一个兼容的 iOS 设备都能作为一个 iBeacon 。然而,他们也表示硬件制造商同样也能制造单独的、低功耗的 iBeacon 。在本文发表前,距离 iOS 7 的推出已过去大约 6 个月,现在已有许多家公司宣布和推出了独立的硬件 iBeacon 发射器。

iBeacon 使用 Bluetooth LE 技术,所以你必须要有一个内置有低功耗蓝牙的 iOS 设备以便与 iBeacon 协同工作。目前这个列表里包含如下一些设备:

  1. iPhone 4s 或更新的
  2. 第三代 iPad 或更新的
  3. iPad mini 或更新的
  4. 第五代iPod touch 或更新的

注意的是:在iOS8中苹果改变了地位的开启方式(iBeacon的使用是基于蓝牙和定位的),首先要在工程里的info.plist增加字段NSLocationAlwaysUsageDescription(这个是允许一直在后台运行的)

还是看下面的吧
推荐一些关于iBeacon的详细的说明和使用
http://www.jianshu.com/p/7816b016ceac
http://www.cctime.com/html/2014-11-4/201411411115005.htm
http://www.cocoachina.com/industry/20140512/8377.html
http://www.5icool.org/a/201402/a4653.html

Best wishes

create-new-ios-app-process

最近公司要做新项目,涉及到搭建app的环境和一些简单的配置,就简单记录一下
App发布的工作一切准备好了之后,就可以发布应用到App Store了,应用发布概括起来需要以下几个流程:

1
2
3
4
5
6
注册App ID,在Xcode中指定Bundle Identifier
创建发布证书(Distribution Certificate)
创建 Distribution Provisioning Profile
用Distribution Profile为应用签名
打包App
在iTunes Connect上传App

以上大部分的操作是在Provisioning Portal、XCode、Keychain Access工具和iTunes Connect中完成的。
上传App必须在Xcode软件里执行(也就是要有MacAir, MacMini等运行Moc OS X Mountain等10.x的系统,最好是10.7等最新版的。
XCode这个Object C的集成开发环境目前版本是4.3.2。
其他操作都可以在普通浏览器里完成。

发布iOS应用程序到App Store - 创建App ID
首先给iOS应用程序申请一个App ID,它是你的应用程序的唯一标识。登录iOS Developer网站,点击右侧的iOS Provisioning Portal链接,选择App ID。
选择创建新app ID。在Description中输入应用的描述信息。Bundle Identifier是指应用的代码标识,你可以用公司名.应用名来标识,例如:com.company.demoapp。
然后打开X-Code,选择Target > Summary。在Identifier输入框中输入上面注册的Bundle Identifier。
发布iOS应用程序到App Store - 创建Distribution Certificate
iOS应用都有一个安全证书用于验证开发者身份和签名。在Provisioning Portal的Distribution栏目下有详细介绍,但总体可以归纳为以下步骤。

1
2
3
4
5
6
7
8
9
打开Keychain Access,在Preferences中关闭OCSP和CRL。
点击Keychain Access菜单,选择Certificate Assistant > Request Certificate from Authority。

输入Email地址,选择Saved to Disk
然后会在桌面上生成一个.CSR的文件。
然后进入Provisioning Portal,选择Certificates -> Distribution -> Add Certificate,添加刚才创建的.CSR签名文件。
在等待审核的时候下载并安装WWDR intermediate certificate。
刷新页面,然后就可以下载证书了。下载后安装。
最后一步,打开Keychain Access。选中刚才安装的private key,选择菜单中的Export Item将私钥导出。将导出的私钥备份到一个安全的地方,以便以后重装了系统可以还原。

发布iOS应用程序到App Store - 创建Distribution Provisioning Profile
打开Provisioning Portal,选择Provisioning -> Distribution,选择添加一个新的profile。Distribution Method要选择App Store,App ID需要输入在前面申请的App ID。提交后需要等一会儿再刷新这个页面。然后就可以下载和安装profile了。安装后profile会被添加到XCode。
发布iOS应用程序到App Store - 检查签名和生成设置
打开XCode,在Build Settings中选择Code Signing。在Release设置上选择刚才申请的Distribution Profile。
选择生成目标为iOS device,然后点击Archiving开始打包应用。

感谢原作者:http://blog.sina.com.cn/s/blog_3e28c8a50101fxtp.html
希望可帮到你,Best wishes

how-to-install-cocoapods

CocoaPods安装和使用
CocoaPods是iOS最常用的第三方类库管理工具,绝大部分有名的开源类库都支持CocoaPods。
CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境。幸运的是OS X系统默认已经可以运行Ruby了,因此我们只需执行以下命令

CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境。幸运的是OS X系统默认已经可以运行Ruby了,因此我们只需执行以下命令:

1
2
sudo gem install cocoapods
sudo gem install -n /usr/local/bin cocoapods

由于某些原因,执行时会出现下面的错误提示:

1
2
ERROR:  Could not find a valid gem 'cocoapods' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - Errno::EPIPE: Broken pipe - SSL_connect (https://rubygems.org/latest_specs.4.8.gz)

当你使用代理后如果还是很慢,可以用淘宝的RubyGems镜像来代替官方版本,

#注意taobao的镜像地址已经都换成https了,好多博客如果没更新的话还是http
执行以下命令:

1
2
3
4
$ gem sources -l
$ gem sources --remove https://rubygems.org/
$ gem sources -a https://ruby.taobao.org/
$ gem sources -l

安装成功后,接着执行命令:

git-reflog-in-order-to-recovery-deleted-files-or-be-rebased-commits

git reflog 可以查看所有分支的所有操作记录(包括(包括commit和reset的操作),包括已经被删除的commit记录
git log 则不能察看已经删除了的commit记录

具体一个例子,假设有三个commit:
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c

如果执行 git reset –hard HEAD~1 则删除了commit3,如果发现删除错误了,需要恢复commit3,
或者是rebase的时候被rebase掉了,
这个时候就要使用 git reflog

1
2
HEAD@{0}: HEAD~1: updating HEAD
63ee781 HEAD@{1}: commit: test3:q

test3就是commit信息,然后拿到63ee781
可以运行git reset –hard 63ee781,则恢复了cmmit3,
运行 git log 后可以看到:

1
2
3
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c

这里也可以使用另外一种方法来实现:

1
git cherry-pick 63ee78

感谢原作者 http://blog.csdn.net/ibingow/article/details/7541402
希望可帮到你,Best wishes

git-tag-option

查看标签

1
2
$ git tag # 在控制台打印出当前仓库的所有标签
$ git tag -l ‘v0.1.*’ # 搜索符合模式的标签

切换标签
与切换分支命令相同,用git checkout [tagname]
切回去用 git checkout . 或者是 git checkout [当前开发的branch]
查看标签信息
用git show命令可以查看标签的版本信息:

1
$ git show v0.1.2

创建标签
git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。
创建轻量标签

1
$ git tag v0.1.2-light

创建附注标签

1
$ git tag -a v0.1.2 -m "0.1.2版本"

创建轻量标签不需要传递参数,直接指定标签名称即可。
创建附注标签时,参数a即annotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。

删除标签

误打或需要修改标签时,需要先将标签删除,再打新标签。

1
$ git tag -d v0.1.2 # 删除标签

参数d即delete的缩写,意为删除其后指定的标签。

给指定的commit打标签
打标签不必要在head之上,也可在之前的版本上打,这需要你知道某个提交对象的校验和(通过git log获取)。
补打标签

1
$ git tag -a v0.1.1 9fbc3d0

提交标签
通常的git push不会将标签对象提交到git服务器,我们需要进行显式的操作:

1
2
$ git push origin v0.1.2 # 将v0.1.2标签提交到git服务器
$ git push origin –tags # 将本地所有标签一次性提交到git服务器

注意:如果想看之前某个标签状态下的文件,可以这样操作
1.git tag 查看当前分支下的标签
2.git checkout v0.21 此时会指向打v0.21标签时的代码状态,(但现在处于一个空的分支上)

感谢原作者:http://blog.csdn.net/wangjia55/article/details/8793577
希望可帮到你,Best wishes

mysql-came-issues

今天突然碰见mysql服务挂掉的问题,就记录一下

先是重启
mysql service restart
/etc/init.d/mysql: ERROR: The partition with /var/lib/mysql is too full!

这时候发现是硬盘存储空间不够了

1
df -lh

发现/dev/xvda1 下可使用的几乎没有了

但是并不知道如何把大文件找到,如下

1
2
3
find path -type f -size +100M (大于100M的文件)
find path -type f -size 100M (等于100M的文件)
find path -type f -size -100M (小100M的文件)

也可以把所有比较大的目录都会列出来

1
du -sh *

然后开删

1
rm -rf

但是发现即使把这些删除了,硬盘的内存好像没有变化,最后google后用到了这个(PS:执行完后果然立马内存释放了)

1
sudo apt-get clean

然后就是接着启动

1
mysql service restart

但是奇怪的是一直在starting 但是并没有日志,后来用

1
2
3
mysqld --console

151114 23:49:56 [ERROR] Found 8 prepared transactions! It means that mysqld was not shut down properly last time and critical recovery information (last binlog or tc.log file) was manually deleted after a crash. You have to start mysqld with --tc-heuristic-recover switch to commit or rollback pending transactions.

最后google后找到一个办法

1
mysqld --tc-heuristic-recover=ROLLBACK

最后看了一下控制台,也可以用service mysql status

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysqld --console
151114 23:55:58 InnoDB: The InnoDB memory heap is disabled
151114 23:55:58 InnoDB: Mutexes and rw_locks use GCC atomic builtins
151114 23:55:58 InnoDB: Compressed tables use zlib 1.2.3.4
151114 23:55:58 InnoDB: Using Linux native AIO
151114 23:55:58 InnoDB: Initializing buffer pool, size = 256.0M
151114 23:55:58 InnoDB: Completed initialization of buffer pool
151114 23:55:58 InnoDB: highest supported file format is Barracuda.
151114 23:55:59 InnoDB: Waiting for the background threads to start
151114 23:56:00 Percona XtraDB (http://www.percona.com) 5.5.41-MariaDB-37.0 started; log sequence number 2610000435

151114 23:56:00 [Note] Plugin 'FEEDBACK' is disabled.
151114 23:56:00 [Note] Server socket created on IP: '0.0.0.0'.
151114 23:56:00 [Note] Event Scheduler: Loaded 1 event
151114 23:56:00 [Note] mysqld: ready for connections.
Version: '5.5.42-MariaDB-1~precise-log' socket: '/var/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution

希望可以帮到你,Best wishes

ios-latest-error-when-upload-new-version

fuck,感觉每次提交app到appStore都会遇见新的问题,今天果然也不例外!
错误代码为ERROR ITMS-90049
Aaron Swartz

解决问题方式:

  1. 在xcode左下角搜索info.plist 找到第三方的info.plist文件,如友盟中腾讯Api文件夹下的info.plist文件;
  2. 找到Bundle version字段 ,添加项目的build号
  3. 添加Bundle identifier 字段,并对应添加项目的BundleId号;
  4. 找到Bundle versions string, short字段 添加项目的版本号
  5. 然后进行提交。

感谢原作者 附上原文地址:
http://blog.csdn.net/u013950854/article/details/49337605

Best wishes