最近做了七牛雲存儲的有關內容,涉及到與后台交互獲取驗證的token,無奈,后台自命清高,不與理會,沒辦法呀,於是自己搞唄。首先呢在在七牛上注冊一個賬號,然后呢添加一個存儲空間這時候空間名是用來識別存儲空間的位置,而地區的選擇則是設置存儲七牛服務器的位置,那么選擇一個公開空間免費試用就可以了~~
創建好賬號就是查看官方文檔編寫demo的流程了,順便附帶一個下載地址:http://developer.qiniu.com/code/v7/sdk/objc.html 下載來看了下七牛關於ios開發的demo 使用cocopod 管理的。天啊,最近的項目一直沒用它,擔心更新的問題會不會造成不能使用了。。。。。。果真,由於軟件的ruby 版本過低,更新不了第三方的庫,只好又升級了一下第三方的庫,具體升級方式請參考http://www.cnblogs.com/gfxxbk/p/5536397.html…這樣很快就會更新好,但是呢里面也有涉及到的一部分升級失敗的情況,一般都會有錯誤提示,對應的查找就能解決。我升級的時候是版本號寫的過高了,導致一直找不到對應的類庫,所以升級的時候不必寫太高,2.2.2版本就好順便附帶一些解決方法http://blog.csdn.net/springjustin/article/details/51836968
終於一切環境需求都准備好了,那就直接引入唄,這時pod導入之后,因為之前的升級,所以一般不會出現文檔中提到的錯誤,很順利的引入了這個類庫。這時候的關鍵是獲得驗證的token 在官方文檔中這個token 是要從自己的后台服務器獲得的,沒辦法,后台不配合也只能自己動手豐衣足食了。
首先這個token 是用作驗證使用的,,官方建議使用后台生成后,客戶端再獲取使用。但客戶端也能獨自生成具體生成方法如下:
-(void)createToken { if (!self.scope.length || !self.accessKey.length || !self.secretKey.length) { return; } // 將上傳策略中的scrop和deadline序列化成json格式 NSMutableDictionary *authInfo = [NSMutableDictionary dictionary]; [authInfo setObject:self.scope forKey:@"scope"]; [authInfo setObject:[NSNumber numberWithLong:[[NSDate date] timeIntervalSince1970] + self.liveTime * 24 * 3600] forKey:@"deadline"]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:authInfo options:NSJSONWritingPrettyPrinted error:nil]; // 對json序列化后的上傳策略進行URL安全的base64編碼 NSString *encodedString = [self urlSafeBase64Encode:jsonData]; // 用secretKey對編碼后的上傳策略進行HMAC-SHA1加密,並且做安全的base64編碼,得到encoded_signed NSString *encodedSignedString = [self HMACSHA1:self.secretKey text:encodedString]; // 將accessKey、encodedSignedString和encodedString拼接,中間用:分開,就是上傳的token NSString *token = [NSString stringWithFormat:@"%@:%@:%@", self.accessKey, encodedSignedString, encodedString]; self.uploadToken = token; }
有關函數的調用為:將進行URL安全的base64編碼:
- (NSString *)urlSafeBase64Encode:(NSData *)text { NSString *base64 = [[NSString alloc] initWithData:[QN_GTM_Base64 encodeData:text] encoding:NSUTF8StringEncoding]; base64 = [base64 stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; base64 = [base64 stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; return base64; }
對上傳策略中進行HMAC-SHA1加密:
- (NSString *)HMACSHA1:(NSString *)key text:(NSString *)text { const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; const char *cData = [text cStringUsingEncoding:NSUTF8StringEncoding]; char cHMAC[CC_SHA1_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC); NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:CC_SHA1_DIGEST_LENGTH]; NSString *hash = [self urlSafeBase64Encode:HMAC]; return hash; }
上面涉及到三個參數,即:Scope、AccessKey、SecretKey,這三個參數是上面我們申請賬號和創建空間的時候得到的,先說第一個參數: Scope : 就是空間的名字,那兩個key就是在個人面板-->個人中心-->秘鑰管理里面能看的到如下所示:
這樣拿到了token 再寫方法就簡單多了,下面是針對上傳圖片做了一個封裝的方法:
-(void)uploadImageToQNFilePath:(NSString *)filePath { QNUploadManager *upManager = [[QNUploadManager alloc] init]; QNUploadOption *uploadOption = [[QNUploadOption alloc] initWithMime:nil progressHandler:^(NSString *key, float percent) { NSLog(@"上傳進度 %.2f", percent); } params:nil checkCrc:NO cancellationSignal:nil]; [upManager putFile:filePath key:nil token:self.uploadToken complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) { // 發送通知用戶獲取圖片使用 NSNotification * notice =[NSNotification notificationWithName:@"downLoad" object:nil userInfo:resp]; [[NSNotificationCenter defaultCenter] postNotification:notice]; } option:uploadOption]; }
這樣就可以將圖片上傳上去了 此時我們可以得打兩個返回值 形式如下:
這個時候我們可以拿着這個返回值,拼接我們從七牛雲后台獲取的文件路徑進行拼接使用SDWebImage就可以得到我們上傳的圖片
順便說一句,當解析通知傳來的字典時要注意解析的方式是否正確,否則會報錯的。