2011年7月6日 星期三

iPhone 開發教學 - 測試 Xcode 4 和 iPhone 3G iOS 4.2.1 取得網路資料

好久沒碰 Xcode 了,上一次寫這種筆記應該是一年前了吧?昨天把公司的環境打理了一下,下載最新的 Xcode 4.0.2 and iOS SDK 4.3,接著把 iPhone 3G iOS 4.2.1 的機器測一下網路連線,結果會噴訊息:


warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/usr/lib/info/dns.so (file not found).


因為 Xcode 沒有支援 iOS 4.2.1 的環境,接上手機後會從手機上下載相關環境資訊,但偏偏就是沒有 info/dns.so 這個檔案,查了一些文章,解法也只是從 4.2 裡頭複製一份,如此一來就不會出現訊息。


xcode 4.0.2


實際測試時,在 iOS 4.3 模擬器可以正常,但在 iPhone 3G iOS 4.2.1 出錯,一直以為是 DNS 反查失敗,其程式大概如下:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSData *d = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"TheWebURL"]];
    NSLog(@"%@", d );


    // Override point for customization after application launch.
    // Add the navigation controller's view to the window and display.
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}


其中 "TheWebURL" 是比較複雜的網址,如果只是 "http://www.google.com" 這種不會有問題,但如果是 "http://www.google.com.tw/q=?ooxx" 帶有複雜參數且非常長的,看到的是 (null) 的現象,就陷入跑去找到正確的 dns.so 的深淵了。


後來,不知何時跑去印出 NSLog( "NSURL:%@" , [NSURL URLWithString:@"TheWebURL"] ),才發現在機器上也是噴 (null) ,這下可好,就跟 dns.so 沒啥關係了吧?!


急轉而下,改成找 NSURL 回傳是 null 的解法,不一會兒就解掉了:


NSString *url = [[NSString stringWithFormat:@"TheWebURL"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog( "NSURL:%@" , [NSURL URLWithString:url ] );


可以解釋的理由是網址內有特殊符號,在使用上如果丟進較新的瀏覽器時,瀏覽器有的會自動幫你處理,因此,在 iOS 4.3 環境中,NSURL 會自動處理,但是舊版 4.2.1 就沒有了。


至於 dns.so 的問題?看來只有真的碰到時,才能來解了 Orz 又藏了一顆未爆彈。


沒有留言:

張貼留言