Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Cloud kitを使った日記アプリで写真をどう扱うか

566 views

Published on

Cloud kitを使った日記アプリで写真をどう扱うか

Published in: Technology
  • Be the first to comment

Cloud kitを使った日記アプリで写真をどう扱うか

  1. 1. CloudKitを使った 日記アプリで 写真をどう扱うか AKIBA.swift 2017.10.27 Bitz Co., Ltd. 村上幸雄
  2. 2. • 埼玉県朝霞市でソフトハウスを起業。 • macOSやiOS、Androidのアプリケーション開発を主に請け負う。 • 自社アプリの製作。 • Twitter: @m_yukio • Facebook: yukio.murakami • GitHub: murakami • http://www.bitz.co.jp/weblog/
  3. 3. • BUKURO.swift Cocoa勉強会とMOSAの合同勉強会。 毎月上旬の月曜日に池袋FORESTで開会。 https://cocoa-kanto.connpass.com/ • Swift Developer's Tech Lab. Cocoa勉強会 関東。 毎月下旬の土曜日に関東で開催。 https://cocoa-kanto.connpass.com/
  4. 4. Day Oneに代わる 日記アプリを作っています
  5. 5. 10 GB Asset storage 100 MB Database storage 2 GB Data transfer 40 Requests per second Overage Fees Asset storage $0.03/GB Database storage $3.00/GB Data transfer $0.10/GB Requests per sec $100 per 10 requests 容量小さい リソース?
  6. 6. 湘南.swiftのおさらい
  7. 7. コンテナ コンテナID デフォルトコンテナ let container: CKContainer = CKContainer.default() カスタムコンテナ let container: CKContainer = CKContainer(identifier: “iCloud.com.example.KeepADiary”)
  8. 8. データベース 公開データベース let publicDatabase: CKDatabase = container.publicCloudDatabase 非公開データベース let privateDatabase: CKDatabase = container.privateCloudDatabase 共有データベース let sharedDatabase: CKDatabase = container.sharedCloudDatabase
  9. 9. アカウントの確認 CKContainer.default().accountStatus(completionHandler: { accountStatus, error in if error != nil { print(error ?? "") } else if accountStatus == .noAccount { let alert = UIAlertController.init(title: "Sign in to iCloud", message: "Sign in to your iCloud account to write records.On the Home screen, launch Settings, tap iCloud, and enter your Apple ID.Turn iCloud Drive on.If you don't have an iCloud account, tap Create a new Apple ID.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Okay", style: .cancel, handler: nil)) self.present(alert, animated: true, completion: nil) } else { print(“Insert your just-in-time schema code here”) } })
  10. 10. 追加 /* レコードIDを生成 */ let uuidString = UUID.init().uuidString let diaryRecordID: CKRecordID = CKRecordID(recordName: uuidString) /* レコード・オブジェクトを生成 */ let diaryRecord: CKRecord = CKRecord(recordType: "Diary", recordID: diaryRecordID) /* レコードのフィールドを設定 */ diaryRecord["UUID"] = uuidString as CKRecordValue diaryRecord.setObject("本文です。" as NSString, forKey: "EntryText") diaryRecord.setObject(Date() as NSDate, forKey: "DiaryDate") /* レコードを保存する */ database.save(diaryRecord, completionHandler: { (record, error) in if error != nil { print(error) } else { print(record) } })
  11. 11. 更新 /* レコードIDからレコードを取得する */ database.fetch(withRecordID: diaryRecordID, completionHandler: { (record, error) in if error != nil { print(error) } else { /* 値を更新する */ record.setObject("本文を更新します。" as NSString, forKey: "EntryText") /* レコードを保存する */ database.save(diaryRecord, completionHandler: { (record, error) in if error != nil { print(error) } else { print(record) } }) } })
  12. 12. 削除 /* 追加で使ったレコードIDで取得 */ database.delete(withRecordID: diaryRecordID, completionHandler: { (recordId, error) in if error != nil { print(error) } else { print(recordId) } })
  13. 13. 検索/* 検索条件 */ let now = Date() var calendar = Calendar.current calendar.locale = Locale(identifier: "ja") var component = calendar.dateComponents([.year, .month, .day], from: now) component.hour = 0 component.minute = 0 component.second = 0 let beginDate: NSDate = calendar.date(from:component)! as NSDate let endDate: NSDate = NSDate(timeInterval: (60.0 * 60.0 * 24.0), since: beginDate as Date) let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "ja_JP") dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" let beginDateString = dateFormatter.string(from: beginDate as Date) let endDateString = dateFormatter.string(from: endDate as Date) let predicate = NSPredicate(format: "DiaryDate != %@", NSDate()) let query : CKQuery = CKQuery(recordType: "Diary", predicate: predicate) /* 検索する */ database.perform(query, inZoneWith: nil, completionHandler: { results, error in if error != nil { print(error) } else { print(results) /* 検索した結果 */ for record in results! { /* 削除する */ database.delete(withRecordID: record.recordID, completionHandler: { (recordId, error) in if error != nil { print(error) } else { print(recordId) } }) } } })
  14. 14. サブスクリプション保存 /* 条件 */ let predicate = NSPredicate(format: "TRUEPREDICATE") let subscription = CKSubscription(recordType: "Diary", predicate: predicate, options: [CKSubscriptionOptions.firesOnRecordCreation, CKSubscriptionOptions.firesOnRecordUpdate]) /* 通知 */ subscription.notificationInfo = CKNotificationInfo() subscription.notificationInfo?.alertBody = "Item has been added." subscription.notificationInfo?.alertLocalizationKey = "Diary record has changed!" subscription.notificationInfo?.shouldBadge = true /* 保存 */ database.save(subscription, completionHandler: { subscription, error in if error != nil { print(error) } else { print(subscription) } })
  15. 15. 大容量ファイルをCloudKit に格納する
  16. 16. アセットを使う database.fetch(withRecordID: diaryRecordID, completionHandler: { (diaryRecord, error) in print(#function) if error != nil { print(error) } else { let asset = CKAsset(fileURL: fileUrl) diaryRecord!["photo"] = asset database.save(diaryRecord!, completionHandler: { (record, error) in if error != nil { print(error) } else { print(record) } }) } })
  17. 17. Assetフィールドにファイルを設定 レコードを保存するとファイルがアップロードさ れる Assetを操作するとダウンロードされる
  18. 18. demo
  19. 19. ありがとうございますありがとうございます

×