2011年12月28日

iOS developer實機開發前二三事

雖然不太難
不過圖都截了就來寫一寫
說明一下繳了保護費後到開始寫程式前的準備:
1.先登入http://developer.apple.com/,然後進到iOS Provisioning Portal
選取左邊Certificate,網頁會有一連串說明
2.接下來要取得certificate,讓認得準備拿來開發的MAC:
工具程式->鑰匙圈存取->憑證輔助程式->從憑證授權要求憑證


3.輸入E-mail、使用者名稱
比較重要的是:把"已將要求"選擇"儲存到磁碟",下一步後把產生的.cer檔存起來
image.png
4.網頁最下面可以找到submit,上傳剛剛的.cer檔後,頁面會跳轉,
如果certificate檔的狀態在pending,重整網頁應該就會變成active可下載的狀態了
image.png
5.下載後點兩下,憑證就會被加入,代表認證完成了
image.png
6.接下來要產生一個Team provisioning file,讓寫好的App可以通過code sign認證跑在裝置上
7.將裝置接上Mac
8.在orginzer中將任意一個裝置add to protal即可產生認證所有App的Team provisioning file

2011年11月14日

iOS 5 data storage的改變


由於iOS 5加入了iCloud的備份機制,資料儲存的規則多了一些規範
以下整理一下新的政策:
1.          Critical Data:只有user自行加入、或無法重新取得的檔案可以放在/Document底下,會被iTunesiCloud備份
2.          Cached Data:可重新產生、下載的檔案,如書籍、音樂要放在/Library/Caches,不會被備份,low storage situations時會被清除
3.          Temporary Data:暫存檔放在/tmp,不會被備份,系統可能會清,官方建議不用就清除
4.          Offline Data5.0.1新增”do not back up”的屬性,讓檔案即使放在/Document也不會被備份,且low storage situations時不會被清除,但也是建議不用就清除

此外QA1719中還提到了Offline Data:不可重新產生但會影響使用者體驗的檔案可擺在Private Documents或/Document,但如果把檔案擺在/Document則需設定好”do not back up”的屬性,否則會被reject(目前有聽過這樣的案例)

1719中也提到設定”do not back up”的方法

另可參考QA1699 Storing Private Data
過幾天再來整理一下可用的資料夾

2011年10月15日

UIWebView自定user agent

不知道忙什麼一個月就過去了
記錄一下有關自訂user agent的問題

一般request的自訂user agent可經由NSMutableURLRequest的函式達到:[request setValue:userAgentString forHTTPHeaderField:@"User-Agent"];
自訂一般UIWebView的request基本上也可以先定義好request後再由webview loadRequest:載入即可但如果要保有UIWebView裡原本request的user agent,再加入自訂的值,事情就比較麻煩一點
UIWebView預設的user agent大概長這樣:
Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/534.32 (KHTML, like Gecko) Mobile/8F190
一些值可能會隨版本而變動,可參考Safari Web Content Guide

2011年9月8日

XML Parser心得分享(2)-TBXML

另外一套是蠻多人推薦的TBXML
主要用法就是讀入檔案,然後用[TBXML elementName:element], [TBXML textForElement:element]取值
詳細可參照TBXML網站
因為開始第一次用,而且每次都要針對新的XML重新寫一遍delegate覺得很麻煩

就找了一下資料 ,後來參照了iOS下超级簡潔的xml解析框架:TBXML
修改了一下原始碼如下:

- (void)parse{
if (xmlData.rootXMLElement) {
TBXMLElement *element = xmlData.rootXMLElement;
[self recurrence:element];
}
else {
NSLog(@"Format Error!");
}
}

//遞迴
- (void)recurrence:(TBXMLElement *)element {
do {
//NSLog(@"<%@>:{%@}",[TBXML elementName:element], [TBXML textForElement:element]);
// Display the name of the element
if ([dic objectForKey:[TBXML elementName:element]]) {//如key name重複,命名為parent_chlid
[dic setObject:[TBXML textForElement:element] forKey:[NSString stringWithFormat:@"%@_%@",[TBXML elementName:element->parentElement],[TBXML elementName:element]]];
}
else{
[dic setObject:[TBXML textForElement:element] forKey:[TBXML elementName:element]];
}

//迭代處理所有屬性
TBXMLAttribute * attribute = element->firstAttribute;
while (attribute) {
//顯示
//NSLog(@"<%@>->[%@ = %@]", [TBXML elementName:element], [TBXML attributeName:attribute], [TBXML attributeValue:attribute]);
//迭代
attribute = attribute->next;
}

//遞迴處理子樹
if (element->firstChild) {
[self recurrence:element->firstChild];

}

//迭代處理sibling
} while ((element = element->nextSibling));

}

執行完會存成一個巢狀的NSDictionary結構
這樣應該可以處理稍微複雜一點、包含attribute的xml

2011年8月29日

XML Parser心得分享(1)-NSXML

有網友留言問到XML處理,就把之前的草稿完成一下
怕文章太長不好讀,拆成兩篇寫
寫到現在遇過挺多處理case要xml資料
目前用過的XML parser有內建的NSXML和TBXML


這篇先簡單說明一下NSXMLParserDelegate三個重要的函式:

2011年8月23日

兩個目前遇過的iOS 5 SDK crash bug

紀錄一下兩個升級iOS 5 SDK後遇到的error:


1. iOS 5好像還不太支援UIActivityIndicatorView
錯誤訊息:-[UIImage initWithCoder:]: unrecognized selector sent to instance 0xc974760
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImage initWithCoder:]: unrecognized selector sent to instance 0xc974760'
參考自:http://stackoverflow.com/questions/7023430/uiimageview-initwithcoder-unrecognized-selector-sent-to-instance-ios-5-beta
解決方法:只好先把indicator移掉,或者用4.3 SDK跑就沒事

2.  一些專案不能用4.3 simulator跑
錯誤訊息:dyld: Library not loaded: /usr/lib/libc++abi.dylib ............. Reason: image not found
解決方法:先用5.0 simulator跑

debug了半天才知道是iOS 5的問題,目前還沒看到解法,看來只能等官方修正了
真的有案子要交的還是要準備兩套SDK阿阿阿

2011年8月16日

iOS 5關閉特定檔案的ARC

這篇文章參考以下影片完成:IOS5 -- How To Turn Off ARC On Individual Files
從iOS 4到iOS 5首先要面對的就是新增的automatic reference counting(第一次開專案看到release被deprecate有嚇到:P)
iOS 5新專案有ARC,但舊的code卻沒有,筆記一下關閉特定檔案ARC的作法:以(Xcode 4為例)
點選專案檔,選target,在Build Phase中找到compile source

2011年8月11日

NSArray排序筆記

本來以為這種功能要自己實做的
沒想到iOS SDK關於array的排序還挺簡單的
整理幾個基本的常用用法:
1.字串(NSString)、日期(NSDate)排序
2.使用NSSortDescriptor達到降冪排序
3.元素為自訂物件的排序

2011年7月14日

iOS幾個UI應用整理

整理幾個比較特別的UI用法:
  1. 自訂UITableViewCell的選取顏色
  2. 關閉UIWebView的scroll功能
  3. 移除 UISearchBar背景色
  4. UIColor自訂顏色注意事項
  5. 取得iPad, iPhone解析度
  6. 自訂UISegmentControl背景色

1.Custom UITableViewCell selected color
UIView *selectBgv=[[UIView alloc]init];
selectBgv.backgroundColor=[UIColor lightGrayColor];
cell.selectedBackgroundView=selectBgv;
[selectBgv release];
要注意的是,UITableViewStylePlain下cell.selectedBackgroundView是NIL,要自己alloc,UITableViewStyleGrouped則不用


2.Disable UIWebView scroll
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

3.Remove UISearchBar background
[[searchbar.subviews objectAtIndex:0]removeFromSuperview];


2011年7月10日

CFWriteStreamOpen連線建很久

把前陣子遇到的問題筆記一下 :
前陣子嘗試著要做iOS裝置間訊息的傳遞

一開始找到了這個聊天室的範例:

http://mobileorchard.com/tutorial-networking-and-bonjour-on-iphone/
用Bonjour network發佈服務,傳輸部份則用CFStream來完成

run範例後跑起來有個問題:選擇了聊天室後,連線卻要等1分鐘左右才會建立
設了一些NSLog都跑完了,也可以打字,不過傳輸的文字還是傳不過去

但一分鐘後連線建立,聊天訊息傳遞得很順暢且很即時

2011年6月28日

數位閱讀軟體開發雜談

一些閱讀開發的淺談,本來寫一寫想投稿試試的,結果一直忘了寄出去,有些東西不貼就要過期了,只好貼這邊吧。

2011年6月23日

In-app purchase和server測試的注意事項

之前有用到就整理起來,主要針對開始撰寫程式前需要的準備事項
改天再針對程式方面發一篇
整個過程,主要可以分成三種角色:Apple、商品提供者、程式開發者
下面列一下各個方面的一些注意事項:

2011年6月17日

iOS App開啟載入的圖片(launch image)

如何替iOS App加入一個啟動時的載入圖片?
只要把圖片存成下列檔名後,加入專案中即可:
Default.png      320*480 iPhone, iPod
Default@2x.png 640*960 iPhone, iPod Retina Display
Default.png iPad Portriat
Default-Portrait.png      768*1004 iPad Portrait
Default-Landscape.png  1004*768  iPad Landscape

在xcode 4開始更簡單,只要在project或target裡Summary->Launch Images右鍵就可以直接加了
以為很麻煩的功能,其實出乎意料的簡單,記一下

2011年6月13日

iOS 5 beta SDK touble shooting

如果有用到libz.1.2.3.dylib這個framework(例如ASIHTTP)
iOS SDK升級到5 beta會遇到下列錯誤:
ld: library not found for -lz.1.2.3
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-g++-4.2 failed with exit code 1
或是用了ASIHTTP:

2011年5月17日

iOS keychainWrapper trouble shooting

之前把一個project用官方提供的Keychain Services加上了自動記憶帳號密碼的功能
一直都正常運作,直到某一天一台裝置忽然跑出了不該出現的assert:
NSAssert(SecItemAdd((CFDictionaryRef)
[self dictionaryToSecItemFormat:keychainData],NULL) == noErr, @"Couldn't add the Keychain Item." );

當機,帳號密碼存不起來
想說嘗試著要把舊的刪掉加新的看看:
SecItemDelete((CFDictionaryRef)[self dictionaryToSecItemFormat:keychainData]));
結果錯誤訊息是-25300(errSecItemNotFound, The item cannot be found.)
然後試了:
SecItemAdd((CFDictionaryRef)[self dictionaryToSecItemFormat:keychainData],NULL));
得到-25299(errSecDuplicateItem, The item already exists.)
想說這下是見鬼了,查了一堆文件也沒找到解答,其他裝置好像也沒災情
解不掉就只好暫時丟著不管

2011年4月25日

UIWebView local file注意事項

不是什麼大問題,卡了關留個紀錄
1.加入檔案時,選Create folder reference for any added folders才會建立相對資料夾
否則雖然看到有個資料夾,build到機器上檔案還是全解在根目錄

2011年4月13日

message sent to deallocated instance 除錯

常常程式一長,哪邊就不小心多release了一次
這時候編譯器就只會告訴你:BAD_ACCESS,然後程式就死了
剛開始會google到去Argument加個NSZombieEnabled YES
會多吐一點東西讓你把bug除掉
今天遇到加了這個後error message變:
[CALayer release]:message sent to deallocated instance 0x4dd650
layer這麼多怎麼知道哪裡出問題阿???
google了一下才找到解法:

2011年3月23日

objective-c:delegate

delegate應該可以翻成指派、委派
是我剛開始學objective-c比較難理解的東西
大概有觀念後就覺得拿來餵資料或其他十分的便利