iOS

How to monitor iPhone's HTTP traffic

I usually wonder how my iPhone apps communicate with their servers. I had a debate with my ex-coworker about the security of app communication. He thinks we can use simple HTTP protocol for app communication, including authentication. But I insist that we should use more secure way for transmission in apps.

Let me use an example to demonstrate how little an app protects the content and how easy it is to monitor the traffic of an iPhone app.

According to Apple’s document here. I choose tcpdump and take 7-11 Taiwan app as an example.

This app provides coupon for Starbucks. I want to get the content of this coupon.

The steps are as following :

Best way of singleton in Objective-C

It’s very useful during iOS development

static GeneralData __strong *generalDataObject = nil;
@synthesize currentUser;
+(GeneralData *) getInstance
{
static dispatch_once_t pred;
dispatch_once(&pred, ^{
generalDataObject = [self new];
});
return generalDataObject;
}

Usage

  1. Add Data

    firstViewController.m
    #import "GeneralData.h";
    - (IBAction) passValueButton:(id)sender {
    {
    User *user = [User new];
    user.name = "Mary Jane";
    user.age = "21";
    [GeneralData sharedInstance].currentUser = user;
    }
  2. Read Data

    secondViewController.m
    #import "GeneralData.h";
    - (void)viewDidLoad
    {
    [super viewDidLoad];
    User *loggedInUser = [GeneralData sharedInstance].currentUser;
    NSLog(@"Name : %@", loggedInUser.name);
    NSLog(@"Age : %@", loggedInUser.age);
    }

Reference : StackOverflow

Make UILabel glow

You have to import QuartzCore

#import <QuartzCore/QuartzCore.h>

Then apply effect on your UILabel or titleLabel.

myLabel.layer.shadowOffset = CGSizeMake(0.0, 0.0);
myLabel.layer.shadowRadius = 20.0;
myLabel.layer.shadowOpacity = 0.5;
myLabel.layer.masksToBounds = NO;

Get current location and city name

1. Add CoreLocation.framework to your project

2. Add CLLocationManagerDelegate to your viewController

3. Initialize CLLocationManager in viewDidLoad

4. Get current location in  the delegate method
- (void)locationManager:(CLLocationManager)managerdidUpdateLocations:(NSArray)locations;


5. Use CLGeocoder to reverseGeocodeLocation

Full Code here

Update Enterprise Apps for iOS Devices only ONE TAP ! (faster OTA)

We all know that Apple provides an easy way(OTA - Over The Air) to distribute your in-house application through a simple web link like following.

<a href="itms-services://?action=download-manifest&url=http://example.com/maniifest.plist">Install App</a>

Sure, we can use the same way to update the app. That means we have to send a email or url to our device owner, then they can click it. But in my case, we serve some people who are very busy. Thus we need a faster to update the app.

Usage : 
Simply One Tap on the AutoUpdate Icon


Then the browser will show up and ask you to update the app

How to : 
1. Create a html file with following code

2. Add it to the home screen.

Remember to update the apple-touch-icon link 

Demo:
Use you iOS device browser : http://goo.gl/HNJuV

Download:
ota-test.zip - This zip include the sample app-touch-icon, sample-plist, and sample html.

推薦 XCode Plug-in - ColorSense + CodePilot


以目前來說,iOS的Developer大部分都還是使用XCode來做為主要的開發工具。
但只要用過就知道,XCode充滿了許多神祕的問題:

XCode WTF http://xcodewtf.tumblr.com/  Text from XCode http://www.textfromxcode.com/
* @wtfxcode https://twitter.com/wtfxcode 
嗯… 其實XCode真的很需要釋出開發Plug-in的API,就算有廣大的回響,官方目前似乎對於這件事情還是沒有什麼反應
一山還有一山高還是有很多高手,弄出了一些好用的Plug-In,也就是今天要介紹的內容。

第一套:ColorSense 

說明
一般我們在Objective-C裡面,時常會使用到UIColor,不過每次都要請視覺設計師大大給或是自己去找詳細的RGBA實在很麻煩。加入這個Plug-In,一個正常的UIColor Syntax(例如: [UIColor redColor]) 上面就會出現色塊,點擊之後就會出現Mac OS X的Color Panel供選擇,非常方便。


上面是我自己的螢幕截圖,身為一個Web Developer,我另外裝了Hex Color Picker,使得我的Color Panel還可以得到Hex值。
安裝方式:

  1. 到官方的Git Repo,下載整個Project (git clone)
  2. 用XCode開啟ColorSense專案
  3. Build ColorSense專案
  4. 重啟XCode
    這樣就完成了!!
    官方網址(Git Repo) 
    https://github.com/omz/ColorSense-for-Xcode

第二套:CodePilot

說明
XCode有自己的一套檔案管理方式,並不是按照實際的資料夾排列,而是使用群組的觀念,讓檔案在開發環境中看起來是整齊的。但是開發久了專案大了,或是加了很多其他Library,還是難免會有找不到檔案的情形。一直都很希望XCode可以像是Sublime Text 2 或是 Alfred 一樣有個快速簡便的尋找檔案方式。於是我找到了CodePilot 這個Plug-in。


以上是截圖。
安裝方式

  1. 將下載下來的檔案解壓
  2. 把 CodePilot2.xcplugin 放到 “~/Library/Developer/Xcode/Third-Party Plug-ins” (目前我是使用App Store抓下來的Xcode 4.5.1)
  3. 重啟XCode
    啟動的快捷健是Shift + Command + X (X)
    是不是很好找呢~?
    官方網址
    http://codepilot.cc/

在ViewController 之間傳值

在iOS的開發中,我們經常會使用ViewController來控制每一個畫面的行為,
剛開始的時候最常遇到的問題就是

“怎麼在兩個ViewController之間傳遞資訊”這篇文章中我列出了幾種常見的方法,提供給大家做參考。

1. 透過實體(Instance)傳遞資訊

我們都知道,每一個ViewController 的類別(Class),不管是用Storyboard還是Nib的方式,都要先初始化(alloc + init),然後再透過這些實體(Instance)物件做操作。所以,要在彼此之間傳遞資訊,必須要取得這些實體

如果傳遞的資訊比較簡單,或是傳遞資訊的動作只有一次的時候,透過物件的實體是比較簡單的方式

範例A: 透過 Nib 的方式,取得ViewController2 的實體,傳遞資訊,指定user的值

範例B:在StoryBoard中,透過Segue 取得的實體,傳遞資訊,指定user的值

**2.透過單例(Singleton)物件傳遞** 透過物件的實體來傳遞固然很方便,但是很多時候,資訊的共享並不只存在於兩個ViewController之間,例如這個應用程式的作者資訊、目前登入者的暫存資料等等,應該是在一個共通的地方,每個人都是去同一個地方存取共通的資訊。這時我們就可以透過Singleton的方式,讓資訊傳遞更簡單。
[![](http://3.bp.blogspot.com/-_ivnC4oFHjU/UGvy1U3Z79I/AAAAAAAACUM/3HjhOjMIaxg/s640/blog2.png)](http://3.bp.blogspot.com/-_ivnC4oFHjU/UGvy1U3Z79I/AAAAAAAACUM/3HjhOjMIaxg/s1600/blog2.png)
以下是範例程式碼

iOS Developer Enterprise Program How To

Following are steps add a new developer to your iOS Developer Enterprise Program
Blue for Administrator / Green for Developer

1. Add new member 
2. Request certificate by using Keychain Access
3. Approve request
4. Download and install certificates
    Development certificate + WWDR intermediate certificate

5. Admin create provisioning profile (Wildcard & non-wildcard bundle ID)
    Must select new member’s name and add devices who can use
6. Download new provisioning profile
7. Select code signing provisioning profile (in XCode)
    > Debug : Wildcard bundle ID
    > Destribution(Release) : Specific bundle ID


Diagram:

iOS Web 畫面閃爍問題 (CSS3)

在iOS (iPhone 4s/ iPad 2/iPod Touch) 上測試 Mobile Web的時候出現了閃爍問題
和Team member 花了一段時間發現一個很詭異的問題
狀況
1. 父節點(DIV)因為要做Transition使用了 **<span style="color: #666666;"> </span><span style="color: blue;">transform: translate3d(…)</span>**
<span style="font-family: Arial;">2\. 畫面處理完成後,觸動事件將子節點(DIV)的CSS改變** **</span><span style="color: blue; font-family: 'Courier New';">**left : *px**</span>

就在這個更改子節點的瞬間 iOS 的畫面一定會**<span style="color: red;">閃爍一下</span>** ``測試過了 iPad / iP4s / iPod Touch 都有這問題 但是Android 2.x 4.x 都沒有…

處理方式

原本以為是iOS 的 webkit 在處理特定 position 的 left 造成子節點重畫的問題,
後來想想覺得這 也太基本了吧 不太可能,經過嘗試以及搜尋,發現很多人都有類似問題。

像是StackOverflow 這篇 還有 這篇 他是改 CSS top 導致發生神秘的閃爍事件…

最後使用動態增加translatde3d 並且 reset 的 爛招 解法   

後來將以下的 css 指定給子節點 問題就解決了

transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);

補充
回家後看到jsconsole/jsbin的作者 Remy Sharp 大大的影片

造成我畫面閃動的原因 應該是跟iOS的硬體加速有關

故需要Reset translate3d …..

真。他x的  上一次遇到這種神秘的問題 是面對高級瀏覽器 IE 6 …………… 

References
http://stackoverflow.com/questions/tagged/translate3d