【iOS獨(dú)立開發(fā)】基于iCloud構(gòu)建用戶體系

Hi ??

我的個(gè)人項(xiàng)目 掃雷Elic 無(wú)盡天梯 夢(mèng)見賬本
類型 游戲 財(cái)務(wù)
AppStore Elic Umemi

一秦叛、前言

注意: 本文不會(huì)非常詳細(xì)的說(shuō)明具體類的使用方法孕暇,代碼具體怎么寫,這些官方文檔比任何人都說(shuō)的清楚菩鲜。

目的在于對(duì)于個(gè)人開發(fā)者提供一個(gè)思路。

大多個(gè)人開發(fā)者,比如我自己嵌器,資源時(shí)間精力有限,但是想法很多谐丢。

而iCloud是我遇到最合適用來(lái)構(gòu)建起用戶體系嘴秸,以及拓展功能需求的工具了。

自己已經(jīng)獨(dú)立做了兩款應(yīng)用庇谆,都是基于iCloud建立起來(lái)的岳掐,歡迎體驗(yàn)反饋,要是再來(lái)個(gè)五星好評(píng)是對(duì)我最大的鼓勵(lì)~

哎饭耳,沒有設(shè)計(jì)師自己整UI終究還是不太好看啊

二串述、獨(dú)立項(xiàng)目用戶體系技術(shù)方案選型

2.1 自己開發(fā)

也不是沒考慮過,但不是自己所擅長(zhǎng)的寞肖。而且需要考慮的問題太多纲酗,技術(shù)匿值、運(yùn)維、安全都是需要考慮的饰及。

當(dāng)然如果有大佬這些都能搞定的話捉邢,這是最好的方案了。

2.2 LeanCloud

早期有用這家的服務(wù)寫過Demo吮螺,所以選型的時(shí)候也有考慮他家的服務(wù)饶囚,畢竟后期拓展到不同的平臺(tái)沒有障礙。

但是收費(fèi)限制多鸠补,具體可以自行去查看萝风。Pass

2.3 GameCenter

很早以前有研究過一下,就如其名蘋果系統(tǒng)內(nèi)部的一套游戲用戶體系紫岩。

包含了用戶规惰、排行榜、成就點(diǎn)之類的比較基礎(chǔ)的功能泉蝌。

雖然很多游戲都有接入歇万,但是存在感實(shí)在不高。

就我對(duì)GameCenter淺薄的了解來(lái)說(shuō)勋陪,要拓展功能業(yè)務(wù)的話贪磺,只依靠CameCenter的話是很難支撐起來(lái)的,依舊需要另一套東西來(lái)承載粥鞋。

所以Pass掉了缘挽。

2.4 iCloud

大家初步對(duì)iCloud的認(rèn)識(shí)可能停留在可以備份同步照片文件的基礎(chǔ)上。

這里建立用戶體系依靠的是CloudKit呻粹,建議直接閱讀官方文檔壕曼,想知道的都有。

官方文檔:CloudKit

三等浊、什么是CloudKit

Store structured app and user data in iCloud containers that all users of your app can share.

The CloudKit framework provides interfaces for moving data between your app and your iCloud containers. You use CloudKit to store your app’s existing data in the cloud so that the user can access it on multiple devices. You can also store data in a public area where all users can access it.

上面是官方文檔中對(duì)CloudKit的說(shuō)明腮郊,比較重要的一句 You can also store data in a public area where all users can access it.

數(shù)據(jù)可共享是建立起用戶體系的核心筹燕。

推薦蘋果的官方文章轧飞,根據(jù)自身場(chǎng)景,選擇合適的接入方案「Determining If CloudKit Is Right for Your App」

四撒踪、CloudKit存儲(chǔ)數(shù)據(jù)的方式

CloudKit控制面板

CloudKit01.png

進(jìn)入DataBase过咬,對(duì)核心的幾塊內(nèi)容做一下說(shuō)明:

4.1 基礎(chǔ)數(shù)據(jù)單元:CKRecord

CloudKit02.png

所有數(shù)據(jù)都是由CKRecord承載,存儲(chǔ)在容器中的制妄。

值得注意的是掸绞,只要用戶開啟啦iCloud及iCloudDrive服務(wù)。

支持的數(shù)據(jù)類型如下耕捞,這是官方注釋里面的:

/// Acceptable value object classes are:
/// - `String`
/// - `Date`
/// - `Data`
/// - `Bool`
/// - `Int`
/// - `UInt`
/// - `Float`
/// - `Double`
/// - `[U]Int8 et al`
/// - `CKReference / CKRecord.Reference`
/// - `CKAsset`
/// - `CLLocation`
/// - `NSData`
/// - `NSDate`
/// - `NSNumber`
/// - `NSString`
/// - `Array` and/or `NSArray` containing objects of any of the types above
///
/// Any other classes will result in an exception with name `NSInvalidArgumentException`.
///
/// Field keys starting with `_` are reserved. Attempting to set a key prefixed with a `_` will result in an error.
///
/// Key names roughly match C variable name restrictions. They must begin with an ASCII letter and can contain ASCII letters and numbers and the underscore character.
/// The maximum key length is 255 characters.

CKRecord本身包含了一些基礎(chǔ)字段比如創(chuàng)建者id衔掸、創(chuàng)建時(shí)間烫幕、修改時(shí)間記錄id等敞映。

當(dāng)然我們也可以自定義字段较曼,讀寫起來(lái)就和使用字典類似。具體可以點(diǎn)進(jìn)CKRecord文件查看振愿,這里就不再多說(shuō)了捷犹。

4.2 數(shù)據(jù)存儲(chǔ)空間:Zone

CloudKit03.png

這里就是三個(gè)不同訪問權(quán)限的數(shù)據(jù)庫(kù),通過CKContainer訪問埃疫。

CloudKit11.png

a.Public

  • 默認(rèn)所有用戶可讀伏恐,所有者可修改
  • 可設(shè)置權(quán)限孩哑,只能在后臺(tái)進(jìn)行調(diào)整栓霜,不可通過API修改
  • 開發(fā)者可以通過后臺(tái)查看
  • 不占用所有者的iCloud儲(chǔ)存空間
  • 占用App的iCloud存儲(chǔ)空間

掃雷用的是這個(gè)數(shù)據(jù)庫(kù),因?yàn)榘伺判邪窈嵫眩枰杏脩舳伎梢栽L問胳蛮。

下面是相關(guān)的兩段官方說(shuō)明:

 *  Records in a public database
 *  - By default are world readable, owner writable.
 *  - Can be locked down by Roles, a process done in the Developer Portal, a web interface.  Roles are not present in the client API.
 *  - Are visible to the application developer via the Developer Portal.
 *  - Do not contribute to the owner's iCloud account storage quota.

This database is available regardless of whether the user’s device has an iCloud account. The contents of the public database are readable by all users of the app, and users have write access to the records, and other objects, they create. The public database’s contents are visible in the developer portal, where you can assign roles to users and restrict access as necessary.
Data in the public database counts toward your app’s iCloud storage quota.

b.Private

  • 默認(rèn)只有所有者可讀寫
  • 開發(fā)者在后臺(tái)也無(wú)法訪問
  • 占用所有者的iCloud存儲(chǔ)空間

這個(gè)適合做一些私密性較強(qiáng)的應(yīng)用,比如密碼管理應(yīng)用丛晌。

 *  Records in a private database
 *  - By default are only owner readable and owner writable.
 *  - Are not visible to the application developer via the Developer Portal.
 *  - Are counted towards the owner's iCloud account storage quota.

c.Shared

  • 只對(duì)通過CKShare授權(quán)的合作者可見
  • 開發(fā)者在后臺(tái)也無(wú)法訪問
  • 占用組織者的iCloud儲(chǔ)存空間

這個(gè)沒具體用過仅炊,先不深入探討。

 *  Records in a shared database
 *  - Are available to share participants based on the permissions of the enclosing CKShare
 *  - Are not visible to the application developer via the Developer Portal.
 *  - Are counted towards the originating owner's iCloud account storage quota.

4.3 數(shù)據(jù)表結(jié)構(gòu):RecordTypes

CloudKit04.png

User是默認(rèn)就存在的一張表澎蛛,無(wú)須自己創(chuàng)建抚垄。如果用戶安裝了你的應(yīng)用,你去獲取用戶對(duì)象的時(shí)候CloudKit后臺(tái)會(huì)自動(dòng)生成一條記錄谋逻。是不是很方便呆馁?

根據(jù)掃雷Elic的需求場(chǎng)景,我創(chuàng)建了這些表

CloudKit06.png
  • User(default):用戶
  • AvatarSpace:頭像
  • EndLessRank:無(wú)盡模式排行榜
  • GameHistory:游戲記錄
  • AppConfig:應(yīng)用配置
  • ZenRank:“禪”模式排行榜

添加自定義字段

CloudKit07.png

點(diǎn)進(jìn)對(duì)應(yīng)Type后就可以看到表結(jié)構(gòu)了毁兆,上面一半是默認(rèn)的數(shù)據(jù)結(jié)構(gòu)浙滤。在下方點(diǎn)+可以添加自定義的字段,并選擇數(shù)據(jù)類型气堕。

需要注意的是:在測(cè)試環(huán)境下纺腊,新增的字段可以刪除掉。一旦發(fā)布線上后茎芭,就不能刪除了揖膜。只能新增。

4.4 數(shù)據(jù)索引:Indexs

CloudKit05.png
  • QUERYABLE
    • 可查詢
  • SORTABLE
    • 可排序
  • SEARCHABLE
    • 可搜索

根據(jù)需求進(jìn)行設(shè)置梅桩,不設(shè)置的話會(huì)讀不到數(shù)據(jù)的壹粟。

  • 比如無(wú)盡模式排行榜,需要根據(jù)時(shí)間和等級(jí)進(jìn)行的排序摘投,就把level & duration 設(shè)置了SORTABLE
CloudKit08.png

效果:


CloudKit09.png

五煮寡、QA

5.1 存在iCloud安全么虹蓄?

雖然沒有絕對(duì)的安全,但對(duì)比市面上的云存儲(chǔ)服務(wù)幸撕。蘋果的還是相對(duì)讓我放心的薇组。

關(guān)鍵是便宜啊坐儿!

5.2 要是用戶抓包改數(shù)據(jù)呢律胀?

我試過抓包,直接連不上容器了貌矿。感興趣的可以嘗試一下炭菌。

5.3 破解?

寫到這里了我掏出了我的越獄機(jī)逛漫。黑低。。說(shuō)干就干酌毡,砸一個(gè)出來(lái)重簽克握。

好家伙,直接崩了枷踏,挺安全的了吧菩暗?

當(dāng)然我并沒有深究能不能跳過系統(tǒng)這一步的驗(yàn)證,等薩爾有下了再來(lái)研究下旭蠕。

我也還沒做防Hook停团,有興趣破解一下的也可以找我交流哈,十分歡迎掏熬。

CloudKit10.png

5.4 訪問速度

說(shuō)不上非秤映恚快,但是夠用孽江。主要還是要合理設(shè)計(jì)表結(jié)構(gòu)讶坯,要是在列表的數(shù)據(jù)結(jié)構(gòu)里直接包含資源文件的話,那請(qǐng)求速度和用戶體驗(yàn)就慘不忍睹了岗屏。

5.5 運(yùn)維成本

幾乎談不上運(yùn)維辆琅,咱也做不了什么。作為開發(fā)者能做的就是把應(yīng)用邏輯和數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)得合理一些这刷。

一些基礎(chǔ)的運(yùn)維數(shù)據(jù)在后臺(tái)也是可以看到的婉烟。

5.6 跨平臺(tái)

只做iOS平臺(tái)還好,要是以后想拓展到不同平臺(tái)的話暇屋,是不是就用不成了似袁?難道還要單獨(dú)搞一套,甚至遷移用戶?

放心昙衅,蘋果貼心的提供了APICloudKit JS

具體沒研究扬霜,看起來(lái)是可以做跨平臺(tái)的。

5.7 容量

1PB夠用不而涉?

抱歉著瓶,我剛看到這個(gè)單位的第一時(shí)間沒反應(yīng)過來(lái)。

就是1024TB啼县,真沒想到材原。

不是一下子就有1P,隨著你用戶的量級(jí)來(lái)的季眷。

開發(fā)者需要關(guān)心的只有Public database所占用的大小余蟹。

Build Apps Using CloudKit

5.8 資源存儲(chǔ) CKAsset

CloudKit提供了CKAsset這個(gè)數(shù)據(jù)類型用來(lái)保存一些資源文件,可以放在CKRecord中進(jìn)行保存子刮。

看起來(lái)挺方便威酒。

問題

如掃雷的排行榜功能,是需要顯示頭像的话告。

這里如果將頭像直接添加為User表中兼搏,那么實(shí)際拉取用戶的時(shí)候會(huì)很慢卵慰,因?yàn)檫@里會(huì)把圖片資源一起帶下來(lái)沙郭。而不是我們平時(shí)的Url的形式。

如果將圖片傳到圖床上然后添加圖片Url的字段也是ok的裳朋,但近年來(lái)感覺圖床限制越來(lái)越多了病线,不方便使用。

這里我后面單獨(dú)鍵了張表用來(lái)存頭像資源鲤嫡,然后封裝了一個(gè)加載送挑、緩存CKAsset圖片資源的工具,方便在排行版中使用暖眼。

七惕耕、總結(jié)

iCloud對(duì)于個(gè)人開發(fā)者來(lái)說(shuō)是個(gè)好東西,可以低成本的構(gòu)建用戶體系诫肠。

只要發(fā)揮想象力司澎,很多功能都是可以可以做的。

這里我用到的只是CloudKit的一部分栋豫,還有很多沒用過挤安。也許還存在很多的發(fā)掘空間。

八丧鸯、參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛤铜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌围肥,老刑警劉巖剿干,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異穆刻,居然都是意外死亡怨愤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門蛹批,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)撰洗,“玉大人,你說(shuō)我怎么就攤上這事腐芍〔畹迹” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵猪勇,是天一觀的道長(zhǎng)设褐。 經(jīng)常有香客問我,道長(zhǎng)泣刹,這世上最難降的妖魔是什么助析? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮椅您,結(jié)果婚禮上外冀,老公的妹妹穿的比我還像新娘。我一直安慰自己掀泳,他們只是感情好雪隧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著员舵,像睡著了一般脑沿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上马僻,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天庄拇,我揣著相機(jī)與錄音,去河邊找鬼韭邓。 笑死措近,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仍秤。 我是一名探鬼主播熄诡,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼诗力!你這毒婦竟也來(lái)了凰浮?” 一聲冷哼從身側(cè)響起我抠,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袜茧,沒想到半個(gè)月后菜拓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笛厦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年纳鼎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裳凸。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贱鄙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姨谷,到底是詐尸還是另有隱情逗宁,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布梦湘,位于F島的核電站瞎颗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捌议。R本人自食惡果不足惜哼拔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓣颅。 院中可真熱鬧倦逐,春花似錦、人聲如沸弄捕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)守谓。三九已至,卻和暖如春您单,著一層夾襖步出監(jiān)牢的瞬間斋荞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工虐秦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留平酿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓悦陋,卻偏偏與公主長(zhǎng)得像蜈彼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俺驶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容