2017年10月30日 星期一


2017年10月25日 星期三

iOS 串接 Firebase 的 Database 無網路狀況

會同步
畫面在app內,斷線又恢復網路
跳回桌面(短時間過後),有網路會直接同步
跳回桌面(長時間過後),回到app(不從應用程式佇列滑掉)

同步失敗
從應用程式佇列滑掉,離線時做的事情就會不見


假裝依然有網路
將資料寫入手機,沒網路依然可以動作,且將app從應用程式佇列滑掉,重開app又有網路後,依然會把斷線做的事同步。
Database.database().isPersistenceEnabled = true

2017年10月17日 星期二


iOS 串接 Firebase 的 Database

Firebase 官方網站:https://firebase.google.com/
要實作分為兩個部分:
第一部分:為專案加入 Firebase
第二部分:實作 Database 基礎功能

第一部分:

  1. 先創專案
  2. 為專案安裝 Firebase,並在專案中實現

  • 官方講解如何安裝 Firebase,示範CocoaPods步驟如下 
    • CocoaPods
    • SDK
1.開啟終端機

2.進入你的專案位置
 cd 你的專案位置 
cd 是進入後面位置的指令
ls 看現在的資料夾底下有什麼(就 ls ,後面不需接其他字)

*可以從 Finder 到專案底下,對檔案按右鍵 -> 取得資訊
把位置直接複製貼上終端機

終端機進入資料夾後:

3.創建 Podfile
已經有就不用創,創過再創一次也不會怎樣
 pod init 
4. Podfile 這時候會出現在你的專案底下,把下面這行加入你的 Podfile
 pod 'Firebase/Core' 
 我自己多加了 Database 進來,但我沒有試過沒打會怎樣~

5.最後要安裝你的 Podfile裡面的東西
 pod install 
這時 Firebase 就在你的專案裡了
要開專案要點 . xcworkspace
不是上面的 .xcodeproj


要在專案中實現:
在 AppDelegate.swift 中實現

 import Firebase 

application:didFinishLaunchingWithOptions:函式底下

 FirebaseApp.configure() 


第二部分:

Firebase的設定:
!記得要把 Firebase 創出的 GoogleService-Info.plist 放到專案裡

權限預設:
不需登入就開放讀寫權限:

我範例的 JSON 格式:


Get a FIRDatabaseReference

var ref: DatabaseReference!
ref = Database.database().reference()


 修改 

修改時會先判斷現在資料庫有沒有這個 key 的值,
沒有的話會變成新增,
所以修改可以當新增用。

self.ref.child("users/(user.uid)/username").setValue(username)
更新內容:

let key = ref.child("posts").childByAutoId().key
let post = ["uid": userID,
            "author": username,
            "title": title,
            "body": body]
let childUpdates = ["/posts/\(key)": post,
                    "/user-posts/\(userID)/\(key)/": post]
ref.updateChildValues(childUpdates)

 新增 

self.ref.child("users").child(user.uid).setValue(["username": username])
可以把不需要的拿掉,驗證身份、child...等

會把原本其他的全部蓋掉

 查詢 

let userID = Auth.auth().currentUser?.uidref.child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
  // Get user value
  let value = snapshot.value as? NSDictionary
  let username = value?["username"] as? String ?? ""
  let user = User.init(username: username)

  // ...
  }) { (error) in
    print(error.localizedDescription)
}
取出的是 snapshot

監聽 Database 是否有異動:
// Listen for new comments in the Firebase database
commentsRef.observe(.childAdded, with: { (snapshot) -> Void in
  self.comments.append(snapshot)
  self.tableView.insertRows(at: [IndexPath(row: self.comments.count-1, section: self.kSectionComments)], with: UITableViewRowAnimation.automatic)
})
異動分類:

 刪除 

把值改成 nil 或是 remove 都可以刪除。


 DEMO 

我的範例專案:Github