创业团队 iOS 开发的小技巧 (一)

真的是好久好久没有发文章了,其实攒了不少篇草稿:深入浅出 AFNetworking、如何阅读 crash 文件、UIKit response chain 等等,但是基本上,还没放出来,国内外的大大们写了同样的内容,而且基本上我想表达的都说了,写得还比我写得好。

但作为一个有输出的男人,还是要写点什么的。但我能分享给大家的除了创业经验,作合伙人的经验,也就剩下这种提升单兵作战能力的,歪门邪道小技巧了。于是,这里就准备开坑写这个系列。不过我这里推荐的基本上都是国内服务,但是大可放心,我完全没有收任何好处费,大伙儿批判的看就好了

Read on →
iOS

WWDC14 Session 401 學習筆記

回廣州休息了十天,就又偷懶了:-P。今天正式上班,就該幹正事了。

401 是 Tools 系列的第一篇,介紹的是 What’s New in XCode。

在飛回來的飛機上+Google I/O Night 上看完的,有這麼幾點需要注意。

Read on →

WWDC14 Session 406 學習筆記

昨天太貪玩,打了一晚上PSV就沒看視頻寫筆記。

前兩次分辨寫了 Swift入門和調試Swift。這一講就選擇了Swift 和 OC互相調用,這樣我們就能真正的做開發了。

這一講非常簡單,聽了一小時結果就總結了以下幾條內容。沒了…

Read on →

WWDC14 Session 409 學習筆記

學習筆記好久沒寫了呢,主要是昨天看了What’s New In Cocoa Touch,感覺沒什麼可寫的。那個就只是一個目錄罷了,乾貨還是得去看目錄指向的Session。言歸正傳,調試是軟件工程師必備技能之一,本Session介紹的是Swift調試的初步知識。

Read on →

WWDC14 Session 402 學習筆記 (下)

由於上一篇篇幅太長,mou沒事就崩潰,而且太長了也沒人願意仔細看了。我還是把他分開吧。

Read on →

WWDC14 Session 402 學習筆記 (中)

前言

上回書說道,我們在一個 <Stirng, Int> 的字典裡面查找信息。但明顯遇到了一個問題:Int是一個Value不是引用,也就是不能傳回來NSNull之類的東西了。若像NSString的Range一樣返回NSNotFound(-1)的話,也不對。畢竟-1以及-2147483648~2147483647都是我們可能要的數據。所以返回數字不成立。那該怎麼辦?

Read on →

WWDC14 Session 402 學習筆記 (上)

前言

這篇是Swift 系列教程的第一篇,即使是最簡單的第一篇也讓我這個三年多開發經驗的老菜鳥研究了一下午才寫出來這篇文章的。

Swift這個語言各個方面的東西都不齊全,語法上,文檔上,社區上。所以毫無iOS經驗或者iOS初學者,我強烈不建議現在就學習這門語言。

這裡舉個非常非常坑的例子:

1
2
3
4
5
6
7
8
9
import Cocoa

var a = [1, 2, 3]
var b = a[0...2]
var c = a

a===b
b===c
c===a

這個東西吧,第一句話是否註釋掉結果截然不同。我們日常討論的問題好多都是去掉了Cocoa 之後是另外一個樣子。可見蘋果對於這門語言的設計還是不夠規範的。故我不推薦新手們浪費時間去學這個東西,以及Swift 就目前來玩是完全無法替代Objective-C的,我們的項目基本上都會或多或少的混入一些C++的內容,例如自己的移動端通用的網絡協議、Facebook Pop、OpenCV之類。Swift是無法直接調用C++的,它需要用OC封裝好了去調用OC。

在我們開始寫正文之前,再啰嗦一句:

注意:這篇文章僅僅是WWDC Session 402 Introduction to Swift的學習筆記,不含任何意淫與揣測。所有代碼都是默認有import Cocoa的 : ]

Read on →

關於iOS原生條碼掃描,你需要注意的兩三事

前言

這篇文章是我們在新發佈的禮物說的iOS端開發過程中遇到的一些關於條碼的問題總結而來。

本文記錄的問題是:當AVFoundation使用多解碼器掃描的時候。二維碼是秒殺,但是條形碼卻經常掃不上。如果去掉二維碼的話,條形碼掃描又秒殺的問題。

為什麼我們沒有選用ZXing而是用AVfoundation呢,是因為我說服了老闆,iOS7開發,而不再去兼容iOS5/6。所以我們終於可以拋棄效率低下的ZXing,而選擇AVFoundation。為什麼說ZXing效率低下,我們這裡可以說上幾句。

Read on →
iOS

解決WeiboSDK Bundleid 綁定問題

本文僅用於交流學習目的,不要用它做一些奇怪的事情,例如微博尾巴欺騙之類的。

前言

不知道有多少團隊遇到這麼一個問題,weibo sdk 的sso 是和bundle id綁定的,而我們的daily build,企業證書版本,一般都和上線版本 採用不同的 bundle id。於是就會遇到些麻煩。這篇文章用OC的黑魔法來解決這個問題。

分析微博SDK

這裡接上一篇文章,解壓.a文件。 我們拿到了微博sdk的所有符號。

經過簡單分析,發現 weibo.o 這個裡面有一些奇怪的東西。如圖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
00000740 t +[WeiboSDK3rdApp appWithDictionary:]
00000080 t +[WeiboSDK3rdApp callbackSchemePrefix]
0000008c t +[WeiboSDK3rdApp callbackSchemeWithAppKey:]
0000027c t +[WeiboSDK3rdApp currentApp]
00000628 t +[WeiboSDK3rdApp dictionaryWithApp:]
000024e8 t -[InstallWeiboAppAlert alertView:willDismissWithButtonIndex:]
00002450 t -[InstallWeiboAppAlert alertWithTransferObject:]
0000240c t -[InstallWeiboAppAlert dealloc]
00002690 t -[InstallWeiboAppAlert setTransferObject:]
00002680 t -[InstallWeiboAppAlert transferObject]
00000860 t -[WeiboSDK3rdApp appKey]
00000894 t -[WeiboSDK3rdApp bundleID]
000000cc t -[WeiboSDK3rdApp callbackScheme]
00000000 t -[WeiboSDK3rdApp dealloc]
000008c8 t -[WeiboSDK3rdApp iconData]
0000011c t -[WeiboSDK3rdApp isAppInstalled]
000001c4 t -[WeiboSDK3rdApp isEqual:]
0000082c t -[WeiboSDK3rdApp name]
00000870 t -[WeiboSDK3rdApp setAppKey:]
000008a4 t -[WeiboSDK3rdApp setBundleID:]
000008d8 t -[WeiboSDK3rdApp setIconData:]
0000083c t -[WeiboSDK3rdApp setName:]

可以看到 WeiboSDK3rdApp 這個類,裡面放了一個 ‘bundleID’. 那麼我們能不能通過 Method Swizzling 這黑魔法來實現呢?

Method Swizzling

不了解的可以去看一下,念茜姐姐的文章: Objective-C的hook方案(一): Method Swizzling 以及 mattt的Method Swizzling

這裡就拿念茜姐姐推薦的那個RNSwizzle做修改好了。

RNSwizzle源碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+ (IMP)swizzleSelector:(SEL)origSelector
               withIMP:(IMP)newIMP {
  Class class = [self class];
  Method origMethod = class_getInstanceMethod(class,
                                              origSelector);
  IMP origIMP = method_getImplementation(origMethod);

  if(!class_addMethod(self, origSelector, newIMP,
                      method_getTypeEncoding(origMethod)))
  {
    method_setImplementation(origMethod, newIMP);
  }

  return origIMP;
}

我們可以看出,調配黑魔法藥劑需要三種原料,類、原始的SEL、替換的IMP

獲取Class指針

由於WeiboSDK3rdApp是一個私有類,不能直接call [WeiboSDK3rdApp class],所以我們可以這樣

1
Class c  objc_getClass("WeiboSDK3rdApp");

獲取Selector指針

理由同上,所以我們用

1
SEL selctor = NSSelectorFromString(@"bundleID");

獲取IMP

這裡是我們需要實現的部份。我們只需要讓bundleId這個method返回的是我們想要的東西即可。那麼就return 在新浪上面註冊的那個字符串就是了。

由於我比較懶,就選用imp_implementationWithBlock來完成這個過程。

1
2
3
4
5
6
7
id block = ^NSString*()
{
  return @"im.txx.app";
};


IMP test = imp_implementationWithBlock(block);

Swizzling

直接把代碼帶入RNSwizzle,得到:

1
2
3
4
5
if(!class_addMethod(c, selctor, test,
                        method_getTypeEncoding(origMethod)))
{
  method_setImplementation(origMethod, test);
}

魔藥調製完成~

總結

整個method是這樣的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (void) methodSwizzling
{
    Class c = objc_getClass("WeiboSDK3rdApp");
    id block = ^NSString*()
    {
        return @"im.txx.app";
    };

    SEL selctor = NSSelectorFromString(@"bundleID");
    IMP test = imp_implementationWithBlock(block);
    Method origMethod = class_getInstanceMethod(c,
                                                selctor);

    if(!class_addMethod(c, selctor, test,
                        method_getTypeEncoding(origMethod)))
    {
        method_setImplementation(origMethod, test);
    }
}

然後這貨被我丟到appDelegate裡面了。

運行,成功!

這篇文章是對iOS安全、OC黑魔法的一個簡單嘗試,歡迎拍磚。

其實還折騰了半天ida分析,但懶得截圖,就沒弄出來。

iOS

解壓.a文件

剛才心血來潮想hack一下微博SDK,於是傻傻的就去class-dump了,但效果很慘烈。

畢竟class_dump不支持靜態文件

那麼我們該怎麼做呢?

分離不同的arch

我們先file一下,libWeiboSDK.a

得到:

1
2
3
4
5
6
7
libWeiboSDK git:(master) ✗ file libWeiboSDK.a
libWeiboSDK.a: Mach-O universal binary with 5 architectures
libWeiboSDK.a (for architecture armv7):   current ar archive random library
libWeiboSDK.a (for architecture armv7s):  current ar archive random library
libWeiboSDK.a (for architecture cputype (16777228) cpusubtype (0)):   current ar archive random library
libWeiboSDK.a (for architecture i386):    current ar archive random library
libWeiboSDK.a (for architecture x86_64):  current ar archive random library

這個時候我們可以抽出任意一個 arch,但是需要注意一個問題:我們下一步要抽出object的時候,必須是單一library,也就是thin, 而我們常見的都是fat。

所以我們應該 lipo libWeiboSDK.a -thin armv7 -output nyan.a 而不是 lipo libWeiboSDK.a -extract armv7 -output nyan.a

抽出.a中的object

很簡單,ar 命令即可

1
ar -x nyan.a

獲取頭文件

1
2
nm Weibo.o > weibo.m
vim weibo.m

小節

其實上面寫的都是廢話。

完全可以 nm libWeiboSDK.a | grep 或者新建一個項目,然後class-dump那個項目

iOS