Debug Nokia X

今天突然發現京東Nokia X有貨,想也不想就買下來當測試機了。

Nokia X作為Nokia第一代Android產品,以及599的低廉價位,應該在中國市場很受歡迎的。作為公司最低端的測試機還算不錯。畢竟我們的新項目門檻提到了 Android 4.0

買到之後發現 UI還是metro風格,只要不用App 近似於分不出來 Android 還是 WinPhone

但插在電腦上準備調試的時候發現,adb devices -l 找不到設備。

去搜了一圈,發現 Nokia 的 Android 開發者網站 上有處理方式。

  • ~/.android/打開或者新建一個叫做:adb_usb.ini的文件。即 vim ~/.android/adb_usb.ini
  • 在裡面輸入 0x0421
  • 保存並重啟adb

那麼我們來思考一個問題,為什麼 0x0421 是可以的呢,這到底代表著什麼?

我們可以打開命令行輸入:system_profiler SPUSBDataType

之後可以看到如下內容。

1
2
3
4
5
6
7
8
9
10
11
12
Nokia_X (RM-980):

          Product ID: 0x06e8
          Vendor ID: 0x0421  (Nokia Corporation)
          Version:  2.33
          Serial Number: 6147c013
          Speed: Up to 480 Mb/sec
          Manufacturer: Nokia
          Location ID: 0x14100000 / 13
          Current Available (mA): 500
          Current Required (mA): 100
          

注意Vendor ID了麼,那個就是關鍵。

所以我們可以橫向推理,如果出現一台打開了USB調試的機器,adb卻不認的話,可以嘗試這個方案。

關於android-async-http的單元測試

前言

最近由於業務需要,就轉行做Android了。

作為一個TDD的實踐者,以及被Apple慣出一身臭毛病的人,實在是不能接受Android原生的apache.webclient。就像我們很少用NSURLConnection一樣。這個時候,我讓同事調研了一些Android網絡的封裝庫,他選擇了https://github.com/loopj/android-async-http 這個庫。

這個庫我很有感情的,兩年前做Android開發課的大作業時,就用了它。那個時候我還在用ASIHTTPRequest,接觸到這個庫的時候被亮瞎了雙眼。就根據這個庫的API,在NSURLConnection層面封裝了一個出來。

之後,用了AFNetworking,發現API也和這個神似,好了不扯淡了,開始正題。

Read on →

新版本的rmbp/mba在插著耳機休眠后無聲的解決方案

相信這個問題讓不少人抓狂不已,休眠的時候手賤插著耳機了,導致下一次一定要重啟。

其實處理方式異常簡單,只要在終端下鍵入

1
2
sudo kextunload /System/Library/Extensions/AppleHDA.kext
sudo kextload /System/Library/Extensions/AppleHDA.kext

聲音就回來了,不過就我目前測試,如果這個進程先獲取到了Session,那麼要關掉它再開一次,否則還是無聲狀態。

NSNull Category

相信不少开发者,都被NSNull坑过,最常见的是服务器返回的json里面,说好的字典、数组、数字,结果返回的是空值。

这个时候,NSJSONSerialization 会自动把他们换成 NSNull。当我们再去用dict[@“hello”]的时候,就会出触发exception,导致程序崩溃。

那么如何处理它呢?

Read on →

Yahoo Weather API

在拿inSysu做实验的时候,发现以前一直在用的腾讯天气的API关闭了。就去找了一下其他的天气API,然后发现大家推荐的中国天气网的API太不科学了。我想请求一次天气需要:

  • 拿到经纬度
  • 地理反查询拿到城市
  • 查表获取地区代号
  • 用代号调用API查询天气。

看起来还好,但是那个查表的过程,实在是太猎奇了,也没什么文档。

之后去对比了一下国外服务,看到的要么就是严重不准确,要么就是收费的如Google、Weather.com,我一个公益项目这样太不值了。

选来选去,就使用和iOS一样的数据提供商雅虎吧,虽说也不怎么省事。

Read on →

移除Kindle的DRM

注意: 本文提到的方法,仅供交流和学习,不要用于盗版

前言

作为一个正版使用者,为何要干这样的事情呢。是这样的:我的所有kindle设备,全都绑定的美国的亚马逊账号,上面保留了、购买了很多书。但是,有些中文书就没办法了,难道买两台Kindle? 或者上盗版?前者我觉得蛋疼,而且有的时候用iPhone看书的时候也会出问题。后者是个人信仰问题,我不能接受,以及好多书没盗版。

Read on →

IPA 重签名

注意:这篇文章所记录的技巧仅供大家交流学习使用,不要像快用那样用作盗版分发

在日常生活中,经常会有朋友丢给你自己写的ipa,或者有的app没有上架appStore,只有一个越狱渠道的版本。

这个时候如果我们设备没有越狱的话,可以通过重签名的方法来将这个app部署到我们的开发机上,所谓开发机就是安装了证书的手机。

对于重签名,可以通过一个软件InstaSign,来自动化实现这个过程。但是有个很大的弊端,它会破坏掉我们的发布环境,即替换了/usr/bin/codesign。

这个时候,我们可以手动实现这个流程。

Read on →
iOS, ipa

Facebook Paper使用的第三方库

第三方库名 简介 链接
ACE code editor https://github.com/ajaxorg/ace
Appirater 用户评分组件 https://github.com/arashpayan/appirater
Reachability 网络连通测试 https://github.com/tonymillion/Reachability
AQGridView iPhone/iPad网格视图 https://github.com/AlanQuatermain/AQGridView
bitvect yasm组件一部分 https://github.com/yasm/yasm/blob/master/libyasm/bitvect.c
Boost C++黑科技库 http://www.boost.org/
Breadcrumb 基于UIControl的分级控件 https://github.com/meiwin/BTBreadcrumbView
breakpad google的崩溃收集系统 code.google.com/p/google-breakpad/
Chromium 这个还用说么 http://www.chromium.org/
CocoaHTTPServer 将iOS/Mac当做简易服务器 https://github.com/robbiehanson/CocoaHTTPServer
CocoaLumberjack 非常著名的一个logger https://github.com/CocoaLumberjack/CocoaLumberjack
DCRoundSwitch 可定制的Switch https://github.com/domesticcatsoftware/DCRoundSwitch
DTCoreText 在coretext里面用HTML https://github.com/Cocoanetics/DTCoreText
EGODatabase 线程安全的 SQLite封装 https://github.com/enormego/egodatabase
expat C语言的XML解析器 http://expat.sourceforge.net/
FFT by Mark Oleson 快速傅里叶变换 https://github.com/dkogan/PDL/tree/master/Lib/FFT
FFT by Takuya Ooura WWDC2010 accelerate guide提到的最快的FFT http://www.fftw.org
gh-kit Utilities and categories for Objective-C Utilities and categories for Objective-C
gh-unit Test Framework for Objective-C https://github.com/gh-unit/gh-unit
Google Toolbox for Mac Google Mac/iOS 代码集合 https://code.google.com/p/google-toolbox-for-mac
google-web-toolkit GWT http://www.gwtproject.org/
gtest google c++ test https://code.google.com/p/googletest/
gyp GYP can Generate Your Projects https://code.google.com/p/gyp/
IEEE 754r Half Precision floating 浮点格式 http://en.wikipedia.org/wiki/Half-precision_floating-point_format
HPGrowingTextView 与iOS SMS 类似的发送框 https://github.com/HansPinckaers/GrowingTextView
InAppSettingsKit setting in app http://www.inappsettingskit.com/
ios5-cookbook https://github.com/erica/iOS-5-Cookbook
iso-8601-parser-unparser Cocoa class to convert dates to and from ISO-8601-formatted strings https://github.com/nixme/iso-8601-parser-unparser
jqueryjs 这个不用说了吧 http://jquery.com/
JSONKit 号称效率最高的JSON解析器 https://github.com/johnezang/JSONKit
leveldb key-value型数据库 https://code.google.com/p/leveldb/
LibComponentLogging-Core logging library https://github.com/aharren/LibComponentLogging-Core
LibComponentLogging-NSLog 同上 https://github.com/aharren/LibComponentLogging-NSLogger
libjingle Google Talk Voice and P2P Interoperability Library https://code.google.com/p/libjingle/
libjpeg-turbo jpeg加速编码解码库 http://libjpeg-turbo.virtualgl.org/
libjpeg jpeg库 http://libjpeg.sourceforge.net/
libPhoneNumber-iOS 标准化电话号码库 https://github.com/me2day/libPhoneNumber-iOS
libphonenumber google的电话号码处理库 https://code.google.com/p/libphonenumber/
libsrtp 开源的SRTP(Secure Real-time Transport Protocol) http://srtp.sourceforge.net/srtp.html
libvpx 开源的VP8编解码器 http://www.webmproject.org/code/
libyuv 实现各种YUV,RGB色彩之间的转换、旋转、缩放 https://code.google.com/p/libyuv/
llvm 这个还用说么.. http://llvm.org/
MAZeroingWeakRef 智能指针 https://github.com/mikeash/MAZeroingWeakRef
minizip 如其名 https://github.com/nmoinvaz/minizip
mixpanel-iPhone tracking library for Mixpanel Analytics https://github.com/mixpanel/mixpanel-iphone/
mosquitto 一个实现了MQTT3.1协议的代理服务器 http://mosquitto.org/
MessagePack 一个类似于JSON的东西 http://msgpack.org/
MessagePack Objective C implement MessagePack OC 实现 https://github.com/msgpack/msgpack-objectivec
msinttypes 用vs编译c99项目所缺失的头文件 https://code.google.com/p/msinttypes/
OpenCV Tutorials 如其名 http://docs.opencv.org/doc/tutorials/tutorials.html
nimbus 著名的framework http://nimbuskit.info/
NJKWebViewProgress 没有用私有API的WebView进度条 https://github.com/ninjinkun/NJKWebViewProgress
unmodified objc4 ???
ObjQREncoder 二维码生成 https://github.com/jverkoey/ObjQREncoder
OCHamcrest 测试 https://github.com/hamcrest/OCHamcrest
OCMock mock不用多说吧? http://ocmock.org/
OCPDFGen iOS HTML to PDF https://github.com/ocrickard/OCPDFGen
OmniGroup OmniUI OmniGroup的一个组件 https://github.com/omnigroup/OmniGroup
OpenSSL 不用说了吧 https://www.openssl.org/
OpenUDID 这也不用说了吧 https://github.com/ylechelle/OpenUDID
opus 传输互动的视频和音频的开源免专利费音频编解码器 www.opus-codec.org/‎
peertalk iOS and OS X Cocoa library for communicating over USB and TCP https://github.com/rsms/peertalk
PhotoScroller 苹果在wwdc的scrollview demo https://github.com/robertwalker/PhotoScroller
PHP
PLCrashReporter 崩溃收集 https://www.plcrashreporter.org/
pmtk3 机器学习工具包,高大上! https://pmtk3.googlecode.com/
Pocket-ObjC-SDK Pocket的SDK https://github.com/Pocket/Pocket-ObjC-SDK
portaudio 跨平台的开源音频I/O库 http://www.portaudio.com/
protobuf Google 数据交换格式 类似于JSON https://code.google.com/p/protobuf/
PSTCollectionView UICollectionView的低版本替代品 https://github.com/steipete/PSTCollectionView
QSUtilities 又是一个代码库 https://github.com/mikeho/QSUtilities/
RestKit 更好的支持 RESTful web service https://github.com/RestKit/RestKit
Ring Buffer Utility 不明真相 http://docs.nscl.msu.edu/daq/11.0/x123.html
SDURLCache 让URLCache支持本地缓存 https://github.com/rs/SDURLCache
SDWebImage 异步图片加载、缓存 https://github.com/rs/SDWebImage
SOCKit String <–> Object Coding for Objective-C https://github.com/jverkoey/sockit
SPDY-for-iPhone iOS SPDY协议 https://github.com/sorced-jim/SPDY-for-iPhone
spdylay c语言的spdy实验性扩展 https://github.com/tatsuhiro-t/spdylay
spreadsort 一个相对于快排更好的排序算法 http://en.wikipedia.org/wiki/Spreadsort
ssziparchive zip/unzip封装 https://github.com/soffes/ssziparchive
TDOauth 如其名 https://github.com/tweetdeck/TDOAuth
tiqr qq微信的二维码扫描登录 https://tiqr.org/
UAModalPanel 类似新浪微博的那个oauth的弹框 https://github.com/UrbanApps/UAModalPanel
webkit 这个不用说了吧
webp 一种Google的图片格式 https://developers.google.com/speed/webp/?hl=zh-CN
webrtc Real-Time Communications (RTC) capabilities via simple JavaScript API http://www.webrtc.org/
WebViewJavascriptBridge JS OC互调 https://github.com/marcuswestin/WebViewJavascriptBridge
XMLReader 如其名 https://github.com/amarcadet/XMLReader
yaml-cpp 如其名 YAML的CPP解析器 https://code.google.com/p/yaml-cpp/
yasm 一个完全重写的NASM汇编 http://yasm.tortall.net/
zlib 大伙儿都知道的压缩解压库 www.zlib.net/‎
zxing 二维码识别库 https://github.com/zxing/zxing
iOS

编译leveldb for iOS

昨天slack上的zhouyuan24同学被leveldb 虐了,出于好奇也来研究一下这东西的iOS编译。

本文参考自 http://www.tanhao.me/pieces/1397.html

为什么要用leveldb

跑分请看此文

注意:LevelDB 是 非关系型数据库,Keyvalue 模式的,有点类似于redis,而SQLite 是关系数据库。

使用的情景不一样。

编译准备:

clone levelDB repo https://code.google.com/p/leveldb/

编译

在levelDB 根目录下 CXXFLAGS=-stdlib=libc++ make PLATFORM=IOS

注意:如果出现

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: archive library: libleveldb.a will be fat and ar(1) will not be able to operate on it

我们貌似可以无视掉。。。

设置工程

  1. 将.a 和include 拖入XCode
  2. 由于是cpp项目,记得把和leveldb有关的所有.m 都改成.mm
  3. 在build setting 里面修改一下header path。
  4. 编译

处理错误

这个时候报了一个错,找不到arm64,于是就在Build Setting 里面将 Architectures 改成 armv7 armv7s

结果还报错,找不到armv7s

于是我随手就把.a扔入ida了,如下图

明显,这个Makefile 文件有点老了,需要改一下:

  1. vim Makefile
  2. 通过 /IOS 定位到 .cc.o: 和 .c.o:
  3. 将里面的 -arch armv6 改成 -arch armv7s
  4. 添加arm64 -arch arm64
  5. :wq!
  6. make clean
  7. CXXFLAGS=-stdlib=libc++ make PLATFORM=IOS

再编译就一切正常了。

注意:如果添加了arm64支持,记得把Architectures改回standard

测试

这里我们直接采用 老谭 blog 上的 demo,编译运行,一次通过。

强制旋转一个UIViewController

刚才V2ex上问了这么一个问题: http://www.v2ex.com/t/97577#reply7

然后就随手搜了下 stackoverflow

在iOS5的年代是有这么个API:

1
[[UIDevice currentDevice] setOrientation: UIInterfaceOrientationPortrait];

但是在iOS 6开始,苹果把这个API 私有了。

于是乎,可以用OC runtime 绕过去,但是:

有可能审核会被拒掉

做法就是用 objc/message.h 强制对这个类发消息

1
objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), @(UIInterfaceOrientationPortrait));

或者

1
2
[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationPortrait)
                            forKey:@"orientation"];

都可以达到同样的效果。

这个bug的原因

其实,这不应该叫做bug的,应该说是开发者不理解iOS 设备的屏幕旋转 那三个API的触发条件。

触发条件仅有两个:

  • 设备方向改变
  • 当rootViewController 改变的时候

于是乎,一直在push pop是不会触发rootViewController的旋转检测的。 这个时候只能用各种怪招了,这里还有一个不用私有API也能实现的作法:

在viewWillAppear里面加上这东西:

1
2
3
4
5
[self presentViewController:[UIViewController new]
              animated:NO
              completion:^{
                  [self dismissViewControllerAnimated:NO completion:nil];
              }];
iOS