基於iCloud構建獨立項目用戶體系

2022-01-12 LabLawliet
一、前言

這個md文檔一月份就創建了,一直沒填坑。

雖然應用本身不是什麼成功的應用,但是自己感覺在做的過程中還是有挺多收穫的。

注意: 本文不會非常詳細的說明具體類的使用方法,代碼具體怎麼寫,這些官方文檔比任何人都說的清楚。

目的在於對於個人開發者提供一個思路。

大多個人開發者,比如我自己,資源時間精力有限,但是想法很多。

而iCloud是我遇到最合適用來構建起用戶體系,以及拓展功能需求的工具了。

自己已經獨立做了兩款應用,都是基於iCloud建立起來的,歡迎體驗反饋,要是再來個五星好評是對我最大的鼓勵~

記帳:夢見帳本(長按識別)

遊戲:掃雷Elic-無盡天梯(長按識別)

哎,沒有設計師自己整UI終究還是不太好看啊~TAT~

下面會以掃雷項目中的例子來做一些說明

二、獨立項目用戶體系技術方案選型2.1 自己開發

也不是沒考慮過,但不是自己所擅長的。而且需要考慮的問題太多,技術、運維、安全都是需要考慮的。

當然如果有大佬這些都能搞定的話,這是最好的方案了。

2.2 LeanCloud

早期有用這家的服務寫過Demo,所以選型的時候也有考慮他家的服務,畢竟後期拓展到不同的平臺沒有障礙。

但是收費限制多,具體可以自行去查看。Pass

2.3 GameCenter

很早以前有研究過一下,就如其名蘋果系統內部的一套遊戲用戶體系。

包含了用戶、排行榜、成就點之類的比較基礎的功能。

雖然很多遊戲都有接入,但是存在感實在不高。

就我對GameCenter淺薄的了解來說,要拓展功能業務的話,只依靠CameCenter的話是很難支撐起來的,依舊需要另一套東西來承載。

所以Pass掉了。

2.4 iCloud

大家初步對iCloud的認識可能停留在可以備份同步照片文件的基礎上。

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

官方文檔:CloudKit: https://developer.apple.com/documentation/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.

上面是官方文檔中對CloudKit的說明,比較重要的一句 You can also store data in a public area where all users can access it.。

數據可共享是建立起用戶體系的核心。

推薦蘋果的官方文章,根據自身場景,選擇合適的接入方案「Determining If CloudKit Is Right for Your App」: https://developer.apple.com/documentation/cloudkit/determining_if_cloudkit_is_right_for_your_app

四、CloudKit存儲數據的方式

CloudKit控制面板: https://icloud.developer.apple.com/dashboard/

進入DataBase,對核心的幾塊內容做一下說明:

4.1 基礎數據單元:CKRecord

所有數據都是由CKRecord承載,存儲在容器中的。

值得注意的是,只要用戶開啟啦iCloud及iCloudDrive服務。

支持的數據類型如下,這是官方注釋裡面的:

/// 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本身包含了一些基礎欄位比如創建者id、創建時間、修改時間、記錄id等。

當然我們也可以自定義欄位,讀寫起來就和使用字典類似。具體可以點進CKRecord文件查看,這裡就不再多說了。

4.2 數據存儲空間:Zone

這裡就是三個不同訪問權限的資料庫,通過CKContainer訪問。

a.Public

掃雷用的是這個資料庫,因為包含了排行榜,需要所有用戶都可以訪問。

下面是相關的兩段官方說明:

* 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

默認只有所有者可讀寫

開發者在後臺也無法訪問

佔用所有者的iCloud存儲空間

這個適合做一些私密性較強的應用,比如密碼管理應用。

* 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

只對通過CKShare授權的合作者可見

開發者在後臺也無法訪問

佔用組織者的iCloud儲存空間

這個沒具體用過,先不深入探討。

* 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 數據表結構:RecordTypes

User是默認就存在的一張表,無須自己創建。如果用戶安裝了你的應用,你去獲取用戶對象的時候CloudKit後臺會自動生成一條記錄。是不是很方便?

根據掃雷Elic的需求場景,我創建了這些表

User(default):用戶

AvatarSpace:頭像

EndLessRank:無盡模式排行榜

GameHistory:遊戲記錄

AppConfig:應用配置

ZenRank:「禪」模式排行榜

添加自定義欄位

點進對應Type後就可以看到表結構了,上面一半是默認的數據結構。在下方點+可以添加自定義的欄位,並選擇數據類型。

需要注意的是:在測試環境下,新增的欄位可以刪除掉。一旦發布線上後,就不能刪除了。只能新增。

4.4 數據索引:Indexs

QUERYABLE

SORTABLE

SEARCHABLE

根據需求進行設置,不設置的話會讀不到數據的。

效果:

五、QA5.1 存在iCloud安全麼?

雖然沒有絕對的安全,但對比市面上的雲存儲服務。蘋果的還是相對讓我放心的。

關鍵是便宜啊!

5.2 要是用戶抓包改數據呢?

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

5.3 破解?

寫到這裡了我掏出了我的越獄機。。。說幹就幹,砸一個出來重籤。

好傢夥,直接崩了,挺安全的了吧?

當然我並沒有深究能不能跳過系統這一步的驗證,等薩爾有下了再來研究下。

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

5.4 訪問速度

說不上非常快,但是夠用。主要還是要合理設計表結構,要是在列表的數據結構裡直接包含資源文件的話,那請求速度和用戶體驗就慘不忍睹了。

5.5 運維成本

幾乎談不上運維,咱也做不了什麼。作為開發者能做的就是把應用邏輯和數據結構設計得合理一些。

一些基礎的運維數據在後臺也是可以看到的。

5.6 跨平臺

只做iOS平臺還好,要是以後想拓展到不同平臺的話,是不是就用不成了?難道還要單獨搞一套,甚至遷移用戶?

放心,蘋果貼心的提供了APICloudKit JS(https://developer.apple.com/documentation/cloudkitjs)

具體沒研究,看起來是可以做跨平臺的。

5.7 容量

1PB夠用不?

抱歉,我剛看到這個單位的第一時間沒反應過來。

就是1024TB,真沒想到。

不是一下子就有1P,隨著你用戶的量級來的。

開發者需要關心的只有Public database所佔用的大小。

Build Apps Using CloudKit  https://developer.apple.com/icloud/cloudkit/

5.8 資源存儲 CKAsset

CloudKit提供了CKAsset這個數據類型用來保存一些資源文件,可以放在CKRecord中進行保存。

看起來挺方便。

問題

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

這裡如果將頭像直接添加為User表中,那麼實際拉取用戶的時候會很慢,因為這裡會把圖片資源一起帶下來。而不是我們平時的Url的形式。

如果將圖片傳到圖床上然後添加圖片Url的欄位也是ok的,但近年來感覺圖床限制越來越多了,不方便使用。

這裡我後面單獨鍵了張表用來存頭像資源,然後封裝了一個加載、緩存CKAsset圖片資源的工具,方便在排行版中使用。

七、總結

iCloud對於個人開發者來說是個好東西,可以低成本的構建用戶體系。

只要發揮想像力,很多功能都是可以可以做的。

這裡我用到的只是CloudKit的一部分,還有很多沒用過。也許還存在很多的發掘空間。

八、參考

CloudKit: https://developer.apple.com/documentation/cloudkit

Designing apps using CloudKit.: https://developer.apple.com/icloud/cloudkit/designing/

Build Apps Using CloudKit: https://developer.apple.com/icloud/cloudkit/

CloudKit JS

Determining If CloudKit Is Right for Your App: https://developer.apple.com/documentation/cloudkit/determining_if_cloudkit_is_right_for_your_app




相關焦點

  • 基於流程制度、數據、人的3D運營決策管理體系構建
    1、一個運行良好的企業必然是一個具備抗打擊能力的自組織系統;2、組織必須時刻圍繞企業高效運營為目標,實現運營效益的最大化(利潤與規模)和管理效率(「風險可控、規範化管理」與「流程的簡單易行、管理成本儘可能低」的平衡)的同步提升;3、人是企業系統中最核心的組成要素之一,系統的涉及要充分考慮人的複雜性,降低人對系統的負面影響(規則和紀律),提高人對系統的積極影響(獨立核算
  • 【可信之體系】基於國產自主密碼構建可信計算創新體系
    一、以自主密碼為基礎構建可信計算標準體系從密碼的角度來看,實際上可信計算晶片就是一個集成了多種密碼算法的密碼晶片
  • 基於Docker搭建輕量的私有構建環境
    我們的分享將解釋如何基於Docker搭建一套輕量級的私有構建環境並及集成到持續集成系統中。Docker技術的應用談的比較多的是改變伺服器管理和運維模式,在日常開發工作中如何使用Docker看到的實踐比較少。最近在團隊中嘗試著基於Docker改進開發團隊的私有構建設置,取得了不錯的效率改進。
  • 什麼是遊戲用戶成長體系? 構建的原則又是什麼?
    用戶成長體系是一種被廣泛應用於網際網路軟體、社區以及遊戲中的運營手段,下圖是關於它的一個大致介紹。
  • 企業反舞弊 | 02篇:基於「舞弊三角理論」,構建企業舞弊防控合規管理體系
    亞馬遜整個體系看起來都在行賄,這絕非最佳的商業行為。有印度媒體稱,受僱於亞馬遜印度分公司的獨立律師將一部分費用「流向政府官員」。亞馬遜在收到舉報後,已在內部對一些法律代表展開調查。該公司駐新德裡的高級法律顧問據稱已在調查期間離崗休假。亞馬遜方面尚未確認或否認該指控,但也稱將對「腐敗零容忍」。據亞馬遜管理人員透露,被調查的事件年代久遠。但若指控為真,則違反美國《反海外腐敗法》。
  • 基於容器技術構建一站式業務支撐平臺
    2.3 基於容器平臺構建DevOps體系業務市場競爭加劇,業務部門要求業務快速交付,業務系統就要充分復用其它業務應用系統服務:◎ 作為業務部門,綜合著眼關注業務進度,不關注需求之外的其它交付內容。◎ 運維部門,期待支撐所有交付均考慮運維體系完備性,基於主機和服務兩個維度、不同對象目標的運維體系完備;所有運維數據均可以共享互訪並使用。關注在業務場景下,對於容器平臺及DevOps要求的需求上,還包括彈性要求、高可用要求、快速交付、需求變化要求等。
  • 構建自己的Android知識體系
    背景構建一個屬於自己的知識體系
  • 博物館個性化用戶畫像的構建及其應用
    本論文是中國國家博物館2019年館級科研項目《基於館藏銅鏡研究的微信小程序展示互動設計方案研究》(項目編號:GBKX2019Y44)階段性研究成果。博物館兼具知識傳播與公眾服務雙重屬性,因此基於客觀事實的多維標籤體系和基於情感偏向的用戶體驗體系在博物館用戶畫像中可以共同發揮作用。
  • 基於Java構建微服務
    基於微服務的架構給架構師和開發者帶來了新的挑戰。隨著語言和工具數量的增加,從而使開發者和架構師完全有能力企業應對這樣的挑戰。Java也不例外,本文探討了在Java生態系統內構建微服務的不同方法。介紹本文不會探討微服務是好是壞,也不會建議你應該事先使用微服務設計你的App,或者當他們在作為單體應用出現時,就應該提取這些服務。
  • 桑德國際羅立洋:技術創新內生驅動,構建共生型價值體系
    3月22日,在「2019(第十七屆)水業戰略論壇」上,桑德國際有限公司總裁羅立洋與與會嘉賓分享了桑德利用技術創新內生驅動,構建共生型價值體系的經驗。羅立洋介紹,每個企業都在建立自己的產業鏈、生態鏈,桑德也不例外,今年桑德提出了更大的、外向型的平臺。2018年,我國經濟已由高速增長階段轉向高質量發展階段,經濟進入新常態。
  • 構建 Netflix 分布式追蹤(tracing)體系
    通過 Edgar 排查一個會話4 年前,當開始構建 Edgar 時,能夠滿足我們需求的開源分布式追蹤系統非常少。我們的策略是,在開源 trace 庫成熟之前,使用 Netflix 專用工具來收集基於 Java 的流媒體服務的 trace 信息。
  • icloud是什麼意思,icloud的主要功能介紹
    對於使用蘋果手機的用戶來說icloud並不陌生,因為它是蘋果手機中的一個雲端服務,不過有些人第一次用蘋果手機,對iCloud還是比較好奇。
  • 基於用戶畫像的實時異步化視頻推薦系統
    標題有點長,其實是為了突出該推薦系統的三個亮點,一個是實時,一個是基於用戶畫像去做的,一個是異步化。實時主要體現在三個層面:1.  用戶畫像中的的短期興趣模型實時構建。      也就是你看完一個視頻,這個視頻幾秒內就影響了你的短期興趣模型,並且反應到你下次的推薦中。2. 候選集實時變更。
  • 基於Hybrid App混合模式的 跨平臺移動互聯醫患服務平臺構建研究
    整體架構分為用戶前端架構和服務後端架構,前端架構中Sencha Touch是專為智能行動裝置應用開發的JavaScript框架,用於展現前臺頁面框架的開發界面,其全面兼容Android和Apple iOS設備,具有豐富的全面基於最新HTML5和CSS3 WEB標準的數據管理組件和用戶界面。
  • 浙江農信全網部署亞信安全防病毒系統,構建智能化深度防禦體系
    浙江省農信科技部網絡安全工程師表示:「浙江農信通過構建智能化深度防禦體系,在病毒爆發生命周期各個階段對病毒進行有效控制,全面覆蓋了對網絡系統病毒發生
  • 如何構建基於 DDD 領域驅動的微服務?
    當團隊轉向基於微服務的架構 時,他們旨在提高敏捷性以及自主且頻繁地部署功能。很難確定這種架構風格的簡單定義。我喜歡Adrian Cockcroft的關於微服務的簡短定義:「 面向服務的體系結構,它由鬆散耦合的、具有上下文邊界的元素組成。」
  • B端產品經理,如何構建企業用戶畫像?
    關注並將「人人都是產品經理」設為星標每天早 07 : 45 按時送達用戶畫像是產品經理技能之一,我們可通過構建用戶畫像分析客戶、了解客戶、挖掘需求,提高轉化率和復購率。那麼該如何構建企業用戶畫像呢?本文筆者結合相關例子與圖表介紹了構建企業用戶畫像的三大步驟。
  • 波場幣TRON(TRX)構建一個全球範圍內的自由內容娛樂體系
    波場(TRON)的實現路徑對于波場(TRON)來說,其整個體系的實現預計將會是一個為期8-10年的工程,涉及6個步驟的龐大工程,具體來說,實現路徑如下:1.       Exudos,出埃及記,數據自由-基於點對點的分布式的內容上傳、存儲和分發機制。
  • 國內iCloud伺服器遭遇中間人攻擊,中國蘋果用戶隱私不保
    我也去驗證了一下 iCloud伺服器遭遇SSL中間人劫持,中國蘋果用戶隱私不保iCloud.com 有多個IP, https://23.48.140.239 和 https://23.13.186.46 這兩個
  • 用戶畫像系統構建實踐
    用戶畫像更多被運營和數據分析師使用,它是各類描述用戶數據的變量集合。個性化推薦、廣告系統、活動營銷、內容推薦、興趣偏好都是基於用戶畫像的應用。