Class Note – Notifications

Presenter : Smart Wang

  • Local
    • iOS 10 以前的作法
      • 要求權限
      • 發送推播
      • didReceiveLocalNotification : App還活著的時候(不論在前景或背景)
      • didFinishLaunchingWithOptions : App死掉的時候用(點選後重新啟動)
      • 取消推播
      • 重複推播
    • iOS 10 使用最新的UserNotifications framework (ref: 結合 iOS 10 的 User Notifications:傳送米花兒的幸福打氣通知)
    • 網路上,Apple有各版本有多少使用者的比例圖 (key word : iOS market share version):

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-20-%e4%b8%8b%e5%8d%882-38-01

  • Remote
    • 推播路徑APNs(Apple Push Notification Service)螢幕快照 2016-10-20 下午2.55.30.png
    • SSL certificate, 可藉助Knuff幫我們完成發推播(as Provider)
    • 把Xcode 內Capabilites的Push Notifications 開起來
      1. upload : 上Apple Developer網站,註冊identifiers(App IDs),上傳CA
      2. download : 下載上傳CA後,Apple給我們的憑證(期限一年,記得到期前要更新)
      3. export : 本次教程用Knuff
      4. upload : 本次教程用Knuff
      5. download : 本次教程用Knuff
      6. install : 本次教程用Knuff
    • Register for remote notification :  As Local & .registerForRemoteNotifications()
    • Confirm register : 註冊完Apple給你Token,再用Knuff推播
    • 實務上,因為log in 跟 get Token 是獨立的,所以log in成功,存完帳戶資料到userDefault,再檢查是否有Token,若有,就將資料上傳到Server,同樣地,如果token拿到,存到userDefault,再檢查是否有log in,若有,就將資料上傳到Server。
    • 接收推播
      • didReceivRemoteNotification : App還活著的時候(不論在前景或背景)
      • didFinishLaunchingWithOptions : App死掉的時候用(點選後重新啟動)
      • 還有一個iOS 7的寫法 for didReceivRemoteNotification,似乎所有情境都通用,需測試確認

螢幕快照 2016-10-20 下午3.07.20.png

Swift 3.0 Class Note – Firebase

Presenter : Smart Wang

Cocoapods 的安裝

  • 固定版本:pod “Firebase/Database’, ‘~> 3.0’  再pod install
  • 如果用pod update 會直接更新到最新版!!

Firebase

螢幕快照 2016-10-18 下午2.41.18.png

  • 採用noSQL,以JSON互傳資料
  • 強制綁定Analytics服務
  • CloudKit無法看到其他用戶上傳的資料
  • Log in Firebase & get plist file,不要修改到plist的檔名
  • Database
    • 定義數據索引:.indexOn,增快搜尋資料速度
      • 每新增一個索引,就需要新增記憶體空間(以空間換取時間)
      • 影響新增、刪除的速度(資料樹需要調整)
    • 若沒有使用Firebase storage,如何藉由base64EncodedString()上傳&下載圖片,檔案大小限制是10MB
  • Storage
    • 若使用storage,將檔案存放在Firebase storage
  • Authentication
    • 以facebook log in為例
    • login developers.facebook & pod ‘FBSDKLoginKit’,再照說明文件走
    • 連結Facebook & Firebase,輸入Facebook應用程式編號&密鑰給Firebase
    • 再從Firebase OAuth 重新導向 URI 新增到 Facebook 應用程式設定中
    • Token get!!
    • 再寫程式碼將使用者用facebook登入資料上傳到Firebase Auth
    • 再寫程式碼將使用者資訊上傳到Firebase Database
  • Facebook
    • share content功能
    • 預設權限:"public_profile", “email", “user_friends"(FB朋友列表只能取得有使⽤這個App的朋友, 並非FB上全部的朋友)
    • 得到大頭照:
      • 利用API
      • 利用FBSDKProfilePictureView
      • 記得打開FBSDKProfile.enableUpdates(onAccessTokenChange: true)

螢幕快照 2016-10-18 下午3.02.48.png

github : git@github.com:dan12411/HelloFirebase.git

Swift 3.0 Class Note – Extension, GCD, WebView, Download Image、JSON

Presenter : Wei Wei

Extension

  • 可幫整數類別(已知類別)加新的屬性或方法

GCD

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-14-%e4%b8%8b%e5%8d%885-02-48

圖片來源:Wei Wei

  •  主執行緒處理UI的工作
  • 兩種方式工作模式
    • sync同步(做完再做下一個)
    • async不同步(同時多工)
  • 所以主執行緒不能放同步的工作,因為會阻擋UI的進行
  • Serial Queue vs. Concurrent Queue

more : Grand Central Dispatch Tutorial for Swift: Part 1/2

github : git@github.com:dan12411/HelloGCD.git

WebView

  • 顯示網頁的四種方法:Safari / UIWebView / WKWebView / SFSafariViewController
  • UIWebView / WKWebView 連網的順序:web address -> URL -> request -> WebView
  • 連到非蘋果的網頁,要設定開起權限 
    1. UIWebView:直接拉WebView到storyboard
    2. WKWebView:用程式碼寫WebView,需匯入WebKit,效率比UIWebView好
    3. Safari:連網順序 URL -> 打開Safari
      • iOS 10以上版本:UIApplication.shared.open(url, options: [:], completionHandler: nil)
      • 以前版本:UIApplication.shared.openURL(url)
    4. SFController:需匯入SafariService,連網順序 URL -> 產生Controller -> 推出 Controller
  • 介紹UIWebViewDelegate,並使用Activity Indicator
  • Load Html 或 已經寫好的網頁
  • 介紹用連結打開其他APP(之後似乎其他老師會在教到)

more: iOS 9 快速上手:搜尋 API 與 SFSafariViewController

github : git@github.com:dan12411/HelloWebView.git

Download Image

  •  第一種方法(用Data, 記得要設定背景下載)
  1. 一樣用網址產生URL
  2. 共時佇列去下載

  3. Data 類別,content of url 下載,下載成為資料(Data)"

  4. 回到主佇列去更新 imageView

  5. 用資料產生圖片

  6. 設定給myImageView來顯示

  • 第二種方法(用URLSession, 預設就是背景下載)
  1. 生出URLSession
  2. 一樣用網址產生URL
  3. 用dataTask & resumeTask下載
  4. 記得回到主序列來顯示圖片
  5. 其他:加關鍵字"lazy"的方式 : 一种可以避免无用初始化的有效且简单的方法,而且在没有使用中间私有变量的情况下提供缺省值
  6. 其他功能
    1. 利用新的類別來下載
    2. 用程式碼產生並加上 activity indicator
    3. 利用快取,將圖片存進快取資料夾,並判斷是否下載過圖片,避免重複下載,增快顯示圖片速度

ref : Swift中的延迟加载

github : git@github.com:dan12411/HelloDownloadImage.git

Download JSON

  • 流程:
    1. 確定要用什麼資料
    2. 先用假資料試試看
    3. URLSession下載
  • 以random user generator為範例
    • 生出要用來下載資料的 URLSession
    • 連結API網址
    • 執行downloadTask
    • 如果沒錯誤,就開始解析資料(JSON)
    • 開始下載並更新資料
    • 檢查網路:Reachability
      • 用官方給的code (object-C)
      • Xcode import Reachability.h & Reachability.m 檔案
      • 在HelloJSON-Bridging-Header.h import “Reachability.h"
  • 其他教學:flat design color, static tableView by add container, change Navigation Bar color

more :  Swift JSON教學:如何利用 Data Taipei 公開資料庫建立 App

github : git@github.com:dan12411/HelloJSON.git

Swift 3.0 Class Note – To Do List APP實作 、Struct、用程式碼產生UI物件

Presenter: Wei Wei

To Do List APP實作

  • 利用一個有closure為參數的func,內含警告控制器,當按下新增或修改按鈕時,判斷是否使用者是否有輸入文字,並新增或修改,還有刪除功能
  • 利用UserDefaults將資料儲存
  • 用到escaping的觀念
  • 用到typealias取小名

f2d1cc3e-e7d1-4852-a42a-9b43313a2bdb-4127-00000e9d0e94a7a6

ref. : Escaping and Nonescaping Closures in Swift 3

git@github.com:dan12411/HelloToDoList.git

Struct

  • 可給初始值或不給
  • 可加方法
  • 可加init

螢幕快照 2016-10-12 下午4.47.54.png

ref. :

  1. 第一章 – Class, Struct and Enum 的抉擇
  2. Swift – Struct 與 Class 的差異性

用程式碼產生UI物件

  • 除了中間的Play Button 是用storyboard拉出來的,其他UI物件,都是用程式碼產生。

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-12-%e4%b8%8b%e5%8d%885-22-43

git@github.com:dan12411/HelloButton.git

Swift 3.0 Class Note – 檔案系統架構

Presenter : Wei Wei

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-11-%e4%b8%8b%e5%8d%886-24-58

圖片來源:Wei Wei

  • 找出路徑& URL (Documents, Caches, Tmp)
    • 教兩種找出URL的方法
    • 找出路徑(ex,NSHomeDirectory() + “/Documents") -> 產生URL
    • 或是FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0])
  • 寫入資料(String, Array, Dictionary, image)
    • 找到存檔路徑(ex., NSHomeDirectory() + “Text.txt"
      ) -> 用.write存檔
    • Array 要轉換成 NSArray 才能存檔
    • Dictionary 要轉換成 NSDictionary才能存檔
    • UIImage要先轉成Data
    • atomically: 選true的話,會先存在一個暫存檔,等確定後再存入,避免錯誤
  • 讀出資料(String, Array, Dictionary, image)
    • 找到存檔路徑 ->用 NSString(contentsOfFile) load (or NSArray…etc)
  • 開新的資料夾
    • 先確定要產生的路徑 ->   FileManager 來產生資料夾(.createDirectory)

  • 檢視資料夾內容
    • 先確定要檢視的資料夾路徑 -> 用FileManager 找出有什麼檔案(.contentsOfDirectory)
  • 確認路徑是否為資料夾
    • 用isExist & isDirectory
  • 拷貝、移動、刪除檔案或資料夾
    • 找出原來檔案路徑
    • 給要拷貝檔案的路徑(拷貝資料夾前不加斜線!) or 要移動檔案的路徑
    • FileManager 來移動或拷貝檔案(.copyItem or .moveItem、removeItem)

git@github.com:dan12411/HelloFileSystem.git

Swift 3.0 Class Note – Video (影片相關)、資料儲存

Presenter : Wei Wei

播放APP內的影片

  • 函式庫:AVFoundation, AVKit
  • 物件:AVPlayer, AVPlayerViewController
  • 設定AVPlayerViewController的屬性
  • 和音樂一樣:
    • 丟入影片檔 -> 找到檔案位置 -> 產生url -> 產生AVPlayer
  • 和音樂不一樣,無法設定循環播放,介紹用Notifiaction,來設定重新播放:videoPlayer?.currentItem?.seek(to: kCMTimeZero)

2016-10-07-14-39-54

git@github.com:dan12411/PlayVideo.git

錄製短片

  • 函式庫:MobileCoreServices, Photos
  • 需加上Privacy : Camera Usage Description, Microphone Usage Description, Photo Library Usage Description
  • 物件:UIImagePickerController
  • Protocol:UIImagePickerControllerDelegate, UINavigationControllerDelegate
  • func :
    • didFinishPickingMediaWithInfo (使用者錄影完後做的事)
    • imagePickerControllerDidCancel (使用者按下Cancel後做的事)

git@github.com:dan12411/HelloRecordVideo.git

拍照

  • 函式庫:MobileCoreServices, Photos
  • 物件:UIImagePickerController
  • Protocol : UIImagePickerControllerDelegate, UINavigationControllerDelegate
  • func :
    • didFinishPickingMediaWithInfo (使用者拍完照後做的事)

ref : AppCoDa

git@github.com:dan12411/HelloTakePhoto.git

資料儲存

  • UserDefaults
    • UserDefaults.standard.set(87, forKey: “yeah") -> 存檔 step1

    • UserDefaults.standard.synchronize() -> 存檔 step2

    • UserDefaults.standard.integer(forKey: “yeah") -> 取檔

    • 如果怕拼錯Key static 變數!!!!!! -> static let myKey = “yeah"

git@github.com:dan12411/HelloUserDefault.git

  • Plist(Property)
    • 產生一Plist檔
    • Set Type : Array or Dictionary
    • Bundle.main.path(forResource: “Score", ofType: “plist") 找路徑
    • 用路徑檔案生出Array(optional) : NSArray

    • more…: Excel to plist 將excel transfer to plist tool

git@github.com:dan12411/HelloPlist.git