Swift4 Day93:APP 製作從0到1全記錄(下)

Swift4 / iOS11 / 2018.12.17/ Moving

Alice
Daily Swift

--

上一集在這☝️,講述了開始過程、APP 資料設計與儲存、運動動畫建置。

運動評分頁面

運動結束之後就會跳轉到, CollectionView 所做的評分頁面。左右滑就能評分,也會將你的評分存到下一頁。

這邊有個微小的設計,在拉動 CollectionView 時 Cell 永遠會是置中的。

運動記錄頁面

兩個Xib組成的畫面

因為在第一個專案就用過Core data,這次我學習使用 Realm 存取資料。

但 Realm 跟 Core data 相比,缺點是 Realm 畢竟不是原生的, iOS 系統每年大更新之後如果不支援會比較麻煩。

Realm 還有支援跨平台的特性(雖然 local database 跨平台的特性好像沒差 😂)

因為原始資料從 local資料 改從 Firebase 抓,在圖片讀取、存取的部分也有在新版做修正。

設定頁面

關於 Moving:

有註明作者與使用的是 Youtube API 還有目前的版本號。

意見回饋:

可以直接從 App 寄信給我跟我說一些關於 App 的想法。

評分鼓勵:

if #available( iOS 10.3, *) {SKStoreReviewController.requestReview()}

優點:可以累積 AppStore 評論且不離開 App
缺點: Apple 提供的 SKStoreReviewController ,但這在第一次點擊時 loading 需要一點時間,評分過後的狀態要再自己去做處理。

每日運動推播

只有 NotificationVC 的狀況:因為 Apple 系統的推播權限只會有一次,第一次拒絕開放推播權限的人,第二次想開啟時就永遠不知道怎麼打開。

因此設計了 BeforeNotificationVC,如果第二次想開啟時就會帶 User 到Setting 頁面教導如何開啟。

推播的邏輯設計是:

  1. 一開始確認 authorizationStatus 是否為 authorized,決定跳轉到 BeforeNotificationVC 或是 NotificationVC
  2. 在 BeforeNotificationVC 的地方,放開放權限的按鈕,開放就到 NotificationVC,不開放就回到 Setting 頁面。
  3. 如果第一次不給權限的狀況,第二次在按下 BeforeNotificationVC 的按鈕將導到 Setting頁面

當紀錄頁沒有任何記錄時,會有「去運動」與「明天再運動」的兩個選項,去運動會導到第一個 TAB 運動頁,明天再運動這個按鈕則是會導到推播頁面。

因為點選「明天再運動」與設定頁的「每日運動推播」都是做一樣的事,所以我選擇用 Protocol extension去設計,會需要用到這個功能的兩個 ViewController confirm protocol,再實作 notificationVCSwitch (),就不用寫重複的程式碼了,未來要維護也只需要修改這。

protocol NotificationAuthProtocol: AnyObject {func notificationVCSwitch()}extension NotificationAuthProtocol where Self: UIViewController {func notificationVCSwitch() {    ~~~檢查authorizationStatus判斷是要跳哪個viewcontroller~~~}

提示音設定

開關會用 Notification 的方式通知 ActionVC ,然後將現在的狀態記錄在 UserDefault ,讀取畫面的時候檢查 UserDefault 的值並更新。

如果開啟的話,運動的時候,進入休息與運動時都會用 AVAudioPlayer 播放提示音,在進入新的動作時會用 AVSpeechUtterance 念運動的名稱。

這樣就不用一直看著螢幕了,如果已經做了很多次運動計畫,只要聽聲音就可以換動作。

Apple Health

設定上請愛用官方文件,前置任務很長🙋‍

介紹一下我所使用的部分,我只有將我的資料存入 health,使用的是 traditionalStrengthTraining 的健身類別,再輸入時間與運動長度等資料。

面試的時候被問到為什麼會有 totalEnergyBurned 跟 totalDistance,結果發現自己修改的時候忘記改回來,面試結束馬上 hotfix 🤣

廣告

原本也是直接寫在 Controller,被建議之後就用 Manager 的方式寫,集中管理,如果廣告很多之後也比較好修改。

參考:之前寫的廣告教學

全螢幕推滑:17 直播與 mediumApp 都有的功能

在 ListVC 頁面我做了全螢幕推滑的功能,一開始我也是寫在 Controller 裡,後來改寫成一個 全螢幕的 SuperClass 未來想要實現這個功能只要繼承就好。

應該有 framework ,但我是手刻的心很累。之後有空再寫詳細一點,簡單來說就是偵測 contentOffset 修改 frame。

進入沒有tutorial的世界,在這裡我寫了很久吃了很多零食 ==

App統計數據工具

Google analytics

可以看到 User 看了你的哪些頁面或是按哪些 button,有很多詳細的數據

Crashlytics

當你 App crash 的時候就會收到 Crashlytics 報告,跟你說哪一行讓App crash了,然後讓你進入 debug 的時間精神屋。

Github repo:

其實還有很多東西我都沒寫進去 😂

感謝

感謝 Luke 在我 debug 很痛苦時引誘我喝更多珍奶

感謝 Annie 每次說完我的解法 妳都會給我更多分析更多想法嗚嗚嗚

感謝 Nia 當我有UI 選擇障礙時 你都幫我挑 UI 不嫌棄我

感謝水晶 一起 debug 的時候覺得學到更多 就像看女兒長大的感覺 QQ

感謝Frank 你的小彩蛋讓 School 生活多彩多姿讓我每天ㄏㄏ笑

感謝泰鑫 每天都一起寫十點才回家,邊走邊討論 code、討論旅遊的日子

感謝Spock 讓我深深記得 struct 不能繼承

感謝喬治 每次講話明明很正經卻都很好笑,不管歷史跟程式都很有熱情的你

感謝Ling 想念那些一起解 conflict 與咒罵 framework 的小日子

感謝 School 讓我與這些人相遇,讓我變成想要成為的人。

👉實體化在 AppWorks School 的快樂生活,還把大家做成 LINE 貼圖🤣

--

--