<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 35  文章 - 21  trackbacks - 0
    <2011年10月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    1 Launch Keychain Access from your local Mac and from the login keychain, filter by the Certificates category. You will see an expandable option called “Apple Development Push Services”
    2 Right click on “Apple Development Push Services” > Export “Apple Development Push Services ID123″. Save this as apns-dev-cert.p12 file somewhere you can access it. There is no need to enter a password.
    3 The next command generates the cert in Mac’s Terminal for PEM format (Privacy Enhanced Mail Security Certificate):
    openssl pkcs12 -in apns-dev-cert.p12 -out apns-dev-cert.pem -nodes -clcerts
    posted @ 2012-05-29 11:07 lincode 閱讀(732) | 評論 (0)編輯 收藏

    這個 bug 在 xcode 4.3 以下會出現(xiàn),4.3 以后已經(jīng)修正了。
    解決方法為:找到 target 的圖標,更改其 Other Linker Flags 為: -all_load 或 -force_load
    -force_load,后跟隨一個文件位置,可以更精確地加載所需文件。
     
    蘋果的解釋為 : http://developer.apple.com/library/mac/#qa/qa1490/_index.html

    簡單點說就是,Objective-C 的動態(tài)特性使得需要,為鏈接器添加一個標簽(設(shè)置 Other Linker Flags 為 -ObjC)來解決通過 Category 向類添加方法的問題。
    但這個標簽 -ObjC 在 64 位 和 iOS 中有問題,需要使用 -all_load 或 -force_load。

    總結(jié)如下:
    如果,第三庫中沒有 category,Other Linker Flags 無需設(shè)置
    如果,第三方庫中有 category,需要設(shè)置為 -ObjC
    如果,某些 Xcode 版本中,出現(xiàn)問題,修改設(shè)置為 -all_load
    posted @ 2012-04-23 14:56 lincode 閱讀(1814) | 評論 (0)編輯 收藏
    獲得 Crash Report:
    1 itunesConnect 的后臺會提供一個 Crash report 表;
    2 把一臺打開了開發(fā)模式的機器接入 Mac,Xcode 的 Organizer 中能查看這臺設(shè)備的 Crash Report;
    3 若使用了 Umeng.com, Bugsense.com 之類的工具。

    閱讀 Crash Report:
    這之前需要一個名為 AppName.app.dSYM 的文件。Xcode 中,Archive 一個項目之后,可以在 Organizer 的 Archives 分頁中,找到所有項目的 Archvie 文件。
    右鍵點擊一個, Show Package Content,就能看到一個類似 AppName-3-19-12.app.PM.xcarchive  的文件,show in finder 這個文件,就能找到 .dSYM 文件。

    在 Ternimal 中執(zhí)行,若是 來自于 iphone 3G 的機器,就需要使用 armv6 代替 armv7.

     atos -o AppName.app.dSYM/Contents/Resources/DWARF/AppName  -arch armv7 0x0000b82

    這樣就能看到,地址對應(yīng)的類,函數(shù),代碼行數(shù)。這個命令只能解析出客戶代碼的位置。若是錯誤堆棧中的系統(tǒng)調(diào)用,是無法翻譯出來的。
    posted @ 2012-03-18 13:56 lincode 閱讀(1001) | 評論 (0)編輯 收藏
    Apple 提供了一個地址方向解析的服務(wù) MKReverseGeocoder,上傳一個經(jīng)緯度,返回一個詳細的地理位置信息。但這個服務(wù)在中國不太穩(wěn)定,時常不可用。
    Google map 也提供了一個類似的服務(wù),是訪問一個 google map 的 api,這里試圖封裝了 google map 的服務(wù)。使使用 apple 和 google 的服務(wù)的接口基本一致,替換起來很容易。Google map 的這個服務(wù)在中國的狀態(tài)比 apple 稍微好一些,但也有不穩(wěn)定的時候。我猜想,apple 也許是使用 google 的服務(wù)封裝了自己的 MKReverseGeocoder。若是如此,這里的嘗試也就沒有什么意義了。

    DOUHttpRequest 是對 ASIHTTPRequest 的一個簡單封裝。這些代碼可以 繼承自 MKReverseGeocoder。這樣,使用方法就和 MKReverseGeocoder 一樣了。

    static NSString* kGeoServerUrl = @"http://maps.google.com/maps/api/geocode/json?latlng=%f,%f&sensor=true&language=en";
    static NSString* kLatitudeUserInfoKey = @"latitudeUserInfoKey";
    static NSString* kLongitudeUserInfoKey = @"longitudeUserInfoKey";

    //
    // It's tje solution for replacing MKReverseGeocoder that has problem in China.
    //
    - (void)startedReverseGeoderWithLatitude:(double)latitude longitude:(double)longitude {
      NSString *url = [NSString stringWithFormat:kGeoServerUrl, latitude, longitude];
      DOUHttpRequest *req = [DOUHttpRequest requestWithURL:[NSURL URLWithString:url] target:self];
      
      NSNumber *lat = [NSNumber numberWithDouble:latitude];
      NSNumber *lon = [NSNumber numberWithDouble:longitude];
      req.userInfo = [NSDictionary dictionaryWithObjectsAndKeys:lat, kLatitudeUserInfoKey, lon, kLongitudeUserInfoKey, nil];
      
      DOUService *service = [DOUService sharedInstance];  
      [service addRequest:req];
    }


    - (NSDictionary *)addressDictionary:(NSObject *)obj {
      
      NSArray* ary = nil;
      if (IS_INSTANCE_OF(obj, NSDictionary)) {
        NSObject* data = [(NSDictionary*)obj objectForKey:@"results"];
        if (IS_INSTANCE_OF(data, NSArray)) {
          ary = (NSArray*)data;
          NSDictionary *dic = [ary objectAtIndex:0];
          
          NSArray *addressComps = [dic objectForKey:@"address_components"];
          
          //NSString *streetNumber = @"";
          NSString *route = @"";
          NSString *locality = @"";
          NSString *country = @"";
          for (NSDictionary *comp in addressComps) {
            NSArray *types = [comp objectForKey:@"types"];
            NSString *type = [types objectAtIndex:0];
            
    //        if ([type isEqualToString:@"street_number"]) {
    //          streetNumber = [comp objectForKey:@"long_name"];
    //        }
            
            if ([type isEqualToString:@"route"]) {
              route = [comp objectForKey:@"long_name"];
            }
            
            if ([type isEqualToString:@"locality"]) {
              locality = [comp objectForKey:@"long_name"];
            }
            
            if ([type isEqualToString:@"country"]) {
              country = [comp objectForKey:@"long_name"];
            }        
          }
          
          NSDictionary *addressDic = [NSDictionary dictionaryWithObjectsAndKeys:route, kABPersonAddressStreetKey,
                                      locality, kABPersonAddressCityKey,                                        
                                      country, kABPersonAddressCountryKey, nil];
          return addressDic;
        }
      }
      return nil;
    }


    - (void)requestFinished:(DOUHttpRequest *)req {
      NSError *error = [req error];
      if (!error) {
        DebugLog(@"str:%@", [req responseString]);
        
        NSObject *obj = [[req responseString] JSONValue];
        NSDictionary *addressDic = [self addressDictionary:obj];
        
        CLLocationCoordinate2D coordinate;
        coordinate.latitude = [[req.userInfo objectForKey:kLatitudeUserInfoKey] doubleValue];
        coordinate.longitude = [[req.userInfo objectForKey:kLongitudeUserInfoKey] doubleValue]; 
        MKPlacemark *placemark = [[[MKPlacemark alloc] initWithCoordinate:coordinate 
                                                       addressDictionary:addressDic] autorelease];
        [self reverseGeocoder:nil didFindPlacemark:placemark];
      }
    }

    - (void)requestFailed:(DOUHttpRequest *)req { 
      [self reverseGeocoder:nil didFailWithError:[req error]];
    }


    #pragma mark - MKReverseGeocoderDelegate

    static NSString * const AppleLanguagesKey = @"AppleLanguages";

    - (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {

      NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:AppleLanguagesKey];
      NSString *currentLanguage = [array objectAtIndex:0];
      
      // set current language as english
      [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", nil] 
                                                forKey:AppleLanguagesKey];
      NSString *local = [placemark.locality lowercaseString];
     
      [AppContext sharedInstance].currentCityUid = local;
      
      // reset current language
      [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:currentLanguage, nil] 
                                                forKey:AppleLanguagesKey];
    }

    - (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
      TraceLog(@"reverseGeocoder :%@", [error localizedDescription]);  
    }
    posted @ 2012-01-12 21:27 lincode 閱讀(1367) | 評論 (0)編輯 收藏

    定義

    OAuth(開放授權(quán))是一個開放標準,允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲的私密的資源(如照片,視頻,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用。

    OAuth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務(wù)提供者的數(shù)據(jù)。每一個令牌授權(quán)一個特定的網(wǎng)站(例如,視頻編輯網(wǎng)站)在特定的時段(例如,接下來的2小時內(nèi))內(nèi)訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth允許用戶授權(quán)第三方網(wǎng)站訪問他們存儲在另外的服務(wù)提供者上的信息,而不需要分享他們的訪問許可或他們數(shù)據(jù)的所有內(nèi)容。



    認證和授權(quán)過程


    在認證和授權(quán)的過程中涉及的三方包括:
    • 服務(wù)提供方,用戶使用服務(wù)提供方來存儲受保護的資源,如照片,視頻,聯(lián)系人列表。
    • 用戶,存放在服務(wù)提供方的受保護的資源的擁有者。
    • 客戶端,要訪問服務(wù)提供方資源的第三方應(yīng)用,通常是網(wǎng)站,如提供照片打印服務(wù)的網(wǎng)站。在認證過程之前,客戶端要向服務(wù)提供者申請客戶端標識。

    使用OAuth進行認證和授權(quán)的過程如下所示:

    1. 用戶訪問客戶端的網(wǎng)站,想操作用戶存放在服務(wù)提供方的資源。
    2. 客戶端服務(wù)提供方請求一個臨時令牌。
    3. 服務(wù)提供方驗證客戶端的身份后,授予一個臨時令牌。
    4. 客戶端獲得臨時令牌后,將用戶引導(dǎo)至服務(wù)提供方的授權(quán)頁面請求用戶授權(quán)。在這個過程中將臨時令牌和客戶端的回調(diào)連接發(fā)送給服務(wù)提供方
    5. 用戶服務(wù)提供方的網(wǎng)頁上輸入用戶名和密碼,然后授權(quán)該客戶端訪問所請求的資源。
    6. 授權(quán)成功后,服務(wù)提供方引導(dǎo)用戶返回客戶端的網(wǎng)頁。
    7. 客戶端根據(jù)臨時令牌從服務(wù)提供方那里獲取訪問令牌。
    8. 服務(wù)提供方根據(jù)臨時令牌和用戶的授權(quán)情況授予客戶端訪問令牌。
    9. 客戶端使用獲取的訪問令牌訪問存放在服務(wù)提供方上的受保護的資源。


    OAuth 2.0

    OAuth 2.0是OAuth協(xié)議的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0關(guān)注客戶端開發(fā)者的簡易性,同時為Web應(yīng)用,桌面應(yīng)用和手機,和起居室設(shè)備提供專門的認證流程。規(guī)范還在IETF OAuth工作組的開發(fā)中 ,按照Eran Hammer-Lahav的說法,OAuth將于2010年末完成。

    Facebook的新的Graph API只支持OAuth 2.0,Google在2011年3月亦宣佈Google API對OAuth 2.0的支援。

    posted @ 2011-10-27 18:15 lincode 閱讀(323) | 評論 (0)編輯 收藏

    名稱

    REST,即Representational State Transfer的縮寫。我對這個詞組的翻譯是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。

    如果一個架構(gòu)符合REST原則,就稱它為RESTful架構(gòu)。

    要理解RESTful架構(gòu),最好的方法就是去理解Representational State Transfer這個詞組到底是什么意思,它的每一個詞代表了什么涵義。如果你把這個名稱搞懂了,也就不難體會REST是一種什么樣的設(shè)計。

    資源(Resources)

    REST的名稱"表現(xiàn)層狀態(tài)轉(zhuǎn)化"中,省略了主語。"表現(xiàn)層"其實指的是"資源"(Resources)的"表現(xiàn)層"。

    所謂"資源",就是網(wǎng)絡(luò)上的一個實體,或者說是網(wǎng)絡(luò)上的一個具體信息。它可以是一段文本、一張圖片、一首歌曲、一種服務(wù),總之就是一個具體的實在。你可以用一個URI(統(tǒng)一資源定位符)指向它,每種資源對應(yīng)一個特定的URI。要獲取這個資源,訪問它的URI就可以,因此URI就成了每一個資源的地址或獨一無二的識別符。

    所謂"上網(wǎng)",就是與互聯(lián)網(wǎng)上一系列的"資源"互動,調(diào)用它的URI。

    表現(xiàn)層(Representation)

    "資源"是一種信息實體,它可以有多種外在表現(xiàn)形式。我們把"資源"具體呈現(xiàn)出來的形式,叫做它的"表現(xiàn)層"(Representation)。

    比如,文本可以用txt格式表現(xiàn),也可以用HTML格式、XML格式、JSON格式表現(xiàn),甚至可以采用二進制格式;圖片可以用JPG格式表現(xiàn),也可以用PNG格式表現(xiàn)。

    URI只代表資源的實體,不代表它的形式。嚴格地說,有些網(wǎng)址最后的".html"后綴名是不必要的,因為這個后綴名表示格式,屬于"表現(xiàn)層"范疇,而URI應(yīng)該只代表"資源"的位置。它的具體表現(xiàn)形式,應(yīng)該在HTTP請求的頭信息中用Accept和Content-Type字段指定,這兩個字段才是對"表現(xiàn)層"的描述。

    狀態(tài)轉(zhuǎn)化(State Transfer)

    訪問一個網(wǎng)站,就代表了客戶端和服務(wù)器的一個互動過程。在這個過程中,勢必涉及到數(shù)據(jù)和狀態(tài)的變化。

    互聯(lián)網(wǎng)通信協(xié)議HTTP協(xié)議,是一個無狀態(tài)協(xié)議。這意味著,所有的狀態(tài)都保存在服務(wù)器端。因此,如果客戶端想要操作服務(wù)器,必須通過某種手段,讓服務(wù)器端發(fā)生"狀態(tài)轉(zhuǎn)化"(State Transfer)。而這種轉(zhuǎn)化是建立在表現(xiàn)層之上的,所以就是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。

    客戶端用到的手段,只能是HTTP協(xié)議。具體來說,就是HTTP協(xié)議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應(yīng)四種基本操作:GET用來獲取資源,POST用來新建資源(也可以用于更新資源),PUT用來更新資源,DELETE用來刪除資源。

    綜述

    綜合上面的解釋,我們總結(jié)一下什么是RESTful架構(gòu):

     ?。?)每一個URI代表一種資源;

     ?。?)客戶端和服務(wù)器之間,傳遞這種資源的某種表現(xiàn)層;

      (3)客戶端通過四個HTTP動詞,對服務(wù)器端資源進行操作,實現(xiàn)"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。

    誤區(qū)

    RESTful架構(gòu)有一些典型的設(shè)計誤區(qū)。

    最常見的一種設(shè)計錯誤,就是URI包含動詞。因為"資源"表示一種實體,所以應(yīng)該是名詞,URI不應(yīng)該有動詞,動詞應(yīng)該放在HTTP協(xié)議中。

    舉例來說,某個URI是/posts/show/1,其中show是動詞,這個URI就設(shè)計錯了,正確的寫法應(yīng)該是/posts/1,然后用GET方法表示show。

    如果某些動作是HTTP動詞表示不了的,你就應(yīng)該把動作做成一種資源。比如網(wǎng)上匯款,從賬戶1向賬戶2匯款500元,錯誤的URI是:

      POST /accounts/1/transfer/500/to/2

    正確的寫法是把動詞transfer改成名詞transaction,資源不能是動詞,但是可以是一種服務(wù):

      POST /transaction HTTP/1.1
      Host: 127.0.0.1
      
      from=1&to=2&amount=500.00

    另一個設(shè)計誤區(qū),就是在URI中加入版本號

      http://www.example.com/app/1.0/foo

      http://www.example.com/app/1.1/foo

      http://www.example.com/app/2.0/foo

    因為不同的版本,可以理解成同一種資源的不同表現(xiàn)形式,所以應(yīng)該采用同一個URI。版本號可以在HTTP請求頭信息的Accept字段中進行區(qū)分(參見Versioning REST Services):

      Accept: vnd.example-com.foo+json; version=1.0

      Accept: vnd.example-com.foo+json; version=1.1

      Accept: vnd.example-com.foo+json; version=2.0


    原帖:http://www.ruanyifeng.com/blog/2011/09/restful.html
    posted @ 2011-10-27 18:02 lincode 閱讀(302) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 暖暖免费在线中文日本| 亚洲高清有码中文字| 亚洲乱码精品久久久久..| 亚洲乱码国产一区网址| 亚洲精品国产精品国自产观看| 免费无码一区二区三区蜜桃大| 毛片免费观看的视频| 成人无遮挡裸免费视频在线观看 | 亚洲啪啪免费视频| 亚洲国产精品综合福利专区| 亚洲国产高清美女在线观看| 亚洲乱码中文字幕小综合| 亚洲va成无码人在线观看| 亚洲Av无码一区二区二三区| 久久国产亚洲精品| 国产产在线精品亚洲AAVV| 思思久久99热免费精品6| 中文字幕免费在线看电影大全 | 97无码人妻福利免费公开在线视频| 99精品免费视品| 91青青青国产在观免费影视| 18禁美女黄网站色大片免费观看| 69av免费视频| 日本高清免费不卡在线| 亚洲精品成a人在线观看| 国产成人亚洲综合色影视| 精品亚洲A∨无码一区二区三区| 亚洲宅男天堂a在线| 亚洲精品无码你懂的| 一级特级女人18毛片免费视频| 国产一级一毛免费黄片| 最近高清中文字幕免费| 成人五级毛片免费播放| 亚洲国产精品不卡毛片a在线| 亚洲精品乱码久久久久久按摩 | 中文字幕亚洲激情| 亚洲综合图片小说区热久久| 亚洲成在人线aⅴ免费毛片| 一级特级女人18毛片免费视频 | 黄色免费在线网址| 男的把j放进女人下面视频免费|