天天看點

開放平台:StackMob for iOS

引言:

StackMob 是一個輕量級的 Baas 移動後端雲存儲平台. 為移動App提供了強大的背景雲存儲能力,其SDK架接在Core Data身上,在不改變Core

Data API 使用方式的前提下為Core Data 提供雲端存儲的能力,此篇專門介紹了 StackMob 在 iOS環境的使用方式.

參考資料:

1:StackMob 的首頁

<a href="https://www.stackmob.com/" target="_blank">https://www.stackmob.com/</a>

2:StackMob iOS開發文檔

<a href="http://stackmob.github.io/stackmob-ios-sdk/" target="_blank">http://stackmob.github.io/stackmob-ios-sdk/</a>

3:如何為iOS應用及遊戲添加背景網絡服務系列1  前言

<a href="http://blog.sina.com.cn/s/blog_4b55f6860101b991.html" target="_blank">http://blog.sina.com.cn/s/blog_4b55f6860101b991.html</a>

4:StackMob SDK 官方使用教程

<a href="https://developer.stackmob.com/tutorials/ios" target="_blank">https://developer.stackmob.com/tutorials/ios</a>

5:16小時的誘惑大緻的介紹了StackMob從注冊到使用的整個過程:

<a href="http://www.csdn.net/article/2013-03-19/2814542-build-an-airbnb-clone/1" target="_blank">http://www.csdn.net/article/2013-03-19/2814542-build-an-airbnb-clone/1</a>

安裝:

StackMob是開源的,托管位址如下:

<a href="https://github.com/stackmob/stackmob-ios-sdk" target="_blank">https://github.com/stackmob/stackmob-ios-sdk</a>

安裝的首先方式是CocoaPods.

可能遇到的問題:

2:解決 Reachability 類 的沖突問題,代碼如下:

開放平台:StackMob for iOS

3:讓 StackMob 連接配接至 Amazon S3 雲存儲服務

StackMob需要連接配接 Amazon S3 以後才擁有二進制檔案的存儲能力.

本篇博文大緻的介紹了一下S3的注冊流程,可以稍作參考:

<a href="http://www.xieyidian.com/2692" target="_blank">http://www.xieyidian.com/2692</a>

第一步:前往亞馬遜Web Services 注冊一個開發者賬号:

<a href="https://aws.amazon.com/cn/" target="_blank">https://aws.amazon.com/cn/</a>

第二步:注冊并激活 S3 

<a href="https://aws.amazon.com/cn/s3/" target="_blank">https://aws.amazon.com/cn/s3/</a>

注冊并激活S3需要一張支援外币付費的信用卡,建議使用萬事達卡.

在索要卡片的界面填寫如下:

類型選擇:MasterCard

信用卡卡号

持卡人 拼音名稱. (按照信用卡上面填寫)

成功以後會扣費一美元. 并收到開通S3服務的郵件提醒.

此時便已經開通了S3的服務,擁有了使用的權利,如果此時進入S3的控制台依舊提示你需要注冊的話,是浏覽器緩存的問題,清空即可.

第三步:進入 S3的管理控制台 建立一個 Bucket 如下圖:

<a href="https://console.aws.amazon.com/s3" target="_blank">https://console.aws.amazon.com/s3</a>

開放平台:StackMob for iOS

Region 選擇伺服器所在的國家,裡咱越緊越好. 日本吧

第四步:摘用StackMob官方的連接配接教程,基本上就搞定了:

<a href="http://developer.stackmob.com/tutorials/dashboard/Adding-a-Binary-Field-to-Schemas" target="_blank">http://developer.stackmob.com/tutorials/dashboard/Adding-a-Binary-Field-to-Schemas</a>

在配置最後一步的連結時有一個字段要特别注意,如下圖所示:

開放平台:StackMob for iOS

那就是S3 Path Alias  這個字段的值在設定不對的情況下去使用它生成的通路連結,通路的結果始終是下圖中的錯誤:

開放平台:StackMob for iOS

如何才能正确設定S3 Path Alias?

首先要了解S3 Path Alias到底是做什麼用的,它一個連結位址别名

當我們用StackMob上傳一個二進制檔案成功以後,StackMob會自動根據S3 Path Alias所給定的值自動生成一個完整的二進制檔案下載下傳連結.

開放平台:StackMob for iOS

拿圖中的Link和StackMob所生成的連結進行對比,看看有哪裡不一樣了. 如果不一樣,那麼S3 Path Alias的設定肯定有問題.

從上圖來說,正确的S3 Path Alias設定方法應該是:  http://s3-ap-northeast-1.amazonaws.com/musicpushtest/

最後S3的定價情況位址如下:(新使用者注冊免費12個月):

<a href="http://aws.amazon.com/cn/pricing/s3/" target="_blank">http://aws.amazon.com/cn/pricing/s3/</a>

使用:

不足之處:

1:沒有二進制檔案上傳進度

原因:求解決

2:多次發起查詢請求和儲存請求,都有可能産生Crash, 

3:查詢和儲存請求發起後,無法立刻撤銷,必須等待整個請求完成

4:分頁查詢起始索引預設必需設定值大于0 才有效果:

原因:我估計代碼内部BUG,注釋掉 判斷大于0 即可修正

5:查詢一對多的對象以後在緩存到本地時,寫入指定Plist檔案時Crash

原因:NSDictionary的key 不是 NSString 所緻,   修改了源代碼 替換鍵值對的方法.

6:利用對象層級展開以後,卻無法擷取子對象資料

功能要點:

一:關于二進制檔案上傳

1.設定Core Data 資料模型的字段為字元串類型.

2.手動設定StackMob 的 Schema 裡對應的字段為二進制類型. 

3.本地資料模型的字段名稱和StackMob 的

Schema 的字段名稱 關系如下:本地Core Data: userIcon  Schema :user_icon

4.如果本地某個字段 對應着伺服器的某個二進制字段時,就在上傳伺服器時必須通過如下代碼指派:

注:任何其他方式的指派都不允許,否則會出現讓人無法了解的BUG.(特别注意)

上傳成功的二進制檔案字段需要通過執行以下代碼才能擷取二進制檔案的下載下傳連結

但是這個隻對新增的對象啟效果,如果你是更新對象使用上面的代碼重新整理的話,會變回你之前修改的值.那又怎麼解決呢?

二:資料緩存機制

StackMob的緩存機制預設是關閉的,如果要開啟,需要對以下全局變量指派:

設定以後,StackMob會自動建立一個本地Core Data資料庫自動管理和緩存來自伺服器的資料.

針對查詢資料機制有一個枚舉來決定其取數方式:

如果使用者更改了裝置的網絡環境,可以通過以下Block去修改查詢資料機制:

那麼在App啟動的時候,判斷一下目前的網絡環境,設定好查詢資料機制:

三:關于儲存(saveOnSuccess)

對Object的任何增删改都通過saveOnSuccess 來保持雲端的資料同步.

用起來蠻簡單,不過也有些小細節要注意,否則也非常糾結.

1.saveOnSuccess因為一些網絡原因或者儲存重複主鍵等問題導緻儲存失敗,會進入失敗的Block.

如果連續進入三,四次左右的失敗Block,它~~~~~ 它~丫的~  App就Crash了.   卧槽... 什麼@try @catch 全都擋不住這個崩潰.

解決辦法是在失敗的Block裡面執行Core Data上下文删除剛剛需要儲存的對象的操作.

這樣不管你點多少次都不會Crash了,我覺得這是StackMob設計上的一些不足,不夠我也是菜鳥,不能夠做多評論.

2.Updating passwords via this API is disabled for security reasons. Use the resetPassword API instead

這個提示通過控制台列印過來,大意是說你目前的儲存資料請求被雲端給限制了. 

我是怎麼觸發這個Error的?

當我發起建立一個新User對象的同時,再多儲存了一個File對象.File對象依賴于User對象,也就是說File對象的所有權是User對象的,但是你建立User對象的時候,你并沒有登入.

處于授權安全機制,本次儲存請求就算是失敗,(即使資料已經儲存到了雲端).

解決辦法是不要急着一起次儲存到雲端,隻有等登入成功以後,再去發起File對象的儲存請求即可.

四:關于查詢(executeFetchRequest)

對Object的查詢就靠這個函數了,基本雷同CoreData的查詢函數,StackMob提供兩種發起查詢請求的方式.

一種是内部建構多線程運作工作,不會卡住主線程和影響界面,完成後通過主線程告知:

但是,連續多次發起這種請求方式, 有極高的幾率導緻整個SDK停止工作. 這是個比較嚴重的問題,應該是StackMob 的BUG,

另外一種則是不建構多線程,如果直接執行,在沒傳回結果之前會卡住主線程,影響界面體驗,但是我們可以自己使用GCD來避免主線程阻塞的這個問題

用這種方式似乎可以避免多次發起請求所産生的BUG,至少暫時沒發現. 

在發起查詢請求之前有一個參數類要特别的注意一下,這個類也是實作個性化查詢的一個重要途徑之一,

它是SMRequestOptions

它有什麼用:

1:是否要求重新整理Token?   tryRefreshToken

2:以HTPPS加密的方式安全擷取資料?   isSecure

3:當請求網絡逾時時,重試幾次呢? numberOfRetries

4:傳回的資料結構需要展開幾個層次?(最多三級)  setExpandDepth

開放平台:StackMob for iOS

5:隻是想傳回某幾個字段的資料而已  restrictReturnedFieldsTo

總結: