SlideShare una empresa de Scribd logo
1 de 19
CloudKitを使った
日記アプリで
写真をどう扱うか
AKIBA.swift 2017.10.27
Bitz Co., Ltd. 村上幸雄
• 埼玉県朝霞市でソフトハウスを起業。
• macOSやiOS、Androidのアプリケーション開発を主に請け負う。
• 自社アプリの製作。
• Twitter: @m_yukio
• Facebook: yukio.murakami
• GitHub: murakami
• http://www.bitz.co.jp/weblog/
• BUKURO.swift
Cocoa勉強会とMOSAの合同勉強会。
毎月上旬の月曜日に池袋FORESTで開会。
https://cocoa-kanto.connpass.com/
• Swift Developer's Tech Lab.
Cocoa勉強会 関東。
毎月下旬の土曜日に関東で開催。
https://cocoa-kanto.connpass.com/
Day Oneに代わる
日記アプリを作っています
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
容量小さい
リソース?
湘南.swiftのおさらい
コンテナ
コンテナID
デフォルトコンテナ
let container: CKContainer = CKContainer.default()
カスタムコンテナ
let container: CKContainer = CKContainer(identifier:
“iCloud.com.example.KeepADiary”)
データベース
公開データベース
let publicDatabase: CKDatabase = container.publicCloudDatabase
非公開データベース
let privateDatabase: CKDatabase = container.privateCloudDatabase
共有データベース
let sharedDatabase: CKDatabase = container.sharedCloudDatabase
アカウントの確認
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”)
}
})
追加
/* レコード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)
}
})
更新
/* レコード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)
}
})
}
})
削除
/* 追加で使ったレコードIDで取得 */
database.delete(withRecordID: diaryRecordID, completionHandler: { (recordId, error) in
if error != nil {
print(error)
}
else {
print(recordId)
}
})
検索/* 検索条件 */
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)
}
})
}
}
})
サブスクリプション保存
/* 条件 */
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)
}
})
大容量ファイルをCloudKit
に格納する
アセットを使う
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)
}
})
}
})
Assetフィールドにファイルを設定
レコードを保存するとファイルがアップロードさ
れる
Assetを操作するとダウンロードされる
demo
ありがとうございますありがとうございます

Más contenido relacionado

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

Similar a Cloud kitを使った日記アプリで写真をどう扱うか (20)

RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
Document based application
Document based applicationDocument based application
Document based application
 
Power Appsで Excel関数を利用する3つの方法
Power Appsで Excel関数を利用する3つの方法Power Appsで Excel関数を利用する3つの方法
Power Appsで Excel関数を利用する3つの方法
 
RUDP
RUDPRUDP
RUDP
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Go
 
キーチェーン・アクセスのバックアップと同期
キーチェーン・アクセスのバックアップと同期キーチェーン・アクセスのバックアップと同期
キーチェーン・アクセスのバックアップと同期
 
ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
Keep a diary
Keep a diaryKeep a diary
Keep a diary
 
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
 
Introduce Toaster (Toasterのご紹介)
Introduce Toaster (Toasterのご紹介)Introduce Toaster (Toasterのご紹介)
Introduce Toaster (Toasterのご紹介)
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
 
Bukuro.makers
Bukuro.makersBukuro.makers
Bukuro.makers
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
 
Remote-Containersでnext.js環境を 作った話
Remote-Containersでnext.js環境を作った話Remote-Containersでnext.js環境を作った話
Remote-Containersでnext.js環境を 作った話
 
デザインパターン
デザインパターンデザインパターン
デザインパターン
 
Mulvery技術詳細
Mulvery技術詳細Mulvery技術詳細
Mulvery技術詳細
 
The Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKitThe Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKit
 
jQuery Mobile ハンズオン 資料
jQuery Mobile ハンズオン 資料jQuery Mobile ハンズオン 資料
jQuery Mobile ハンズオン 資料
 
Endo kitura on_bluemix
Endo kitura on_bluemixEndo kitura on_bluemix
Endo kitura on_bluemix
 

Más de 幸雄 村上

Más de 幸雄 村上 (19)

アプリケーション識別子.pdf
アプリケーション識別子.pdfアプリケーション識別子.pdf
アプリケーション識別子.pdf
 
圧縮ネイティブ・ライブラリについて.pdf
圧縮ネイティブ・ライブラリについて.pdf圧縮ネイティブ・ライブラリについて.pdf
圧縮ネイティブ・ライブラリについて.pdf
 
分散環境におけるジャストインタイム設定の試み
分散環境におけるジャストインタイム設定の試み分散環境におけるジャストインタイム設定の試み
分散環境におけるジャストインタイム設定の試み
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
 
え!それって参照渡し?
え!それって参照渡し?え!それって参照渡し?
え!それって参照渡し?
 
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
 
AppleScriptなど
AppleScriptなどAppleScriptなど
AppleScriptなど
 
MojaveのDark Mode
MojaveのDark ModeMojaveのDark Mode
MojaveのDark Mode
 
AppleScriptとは何ぞや
AppleScriptとは何ぞやAppleScriptとは何ぞや
AppleScriptとは何ぞや
 
Web API 通信の符号化について
Web API 通信の符号化についてWeb API 通信の符号化について
Web API 通信の符号化について
 
Master-Detail App を実装する
Master-Detail App を実装するMaster-Detail App を実装する
Master-Detail App を実装する
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
 
Getting a packet trace
Getting a packet traceGetting a packet trace
Getting a packet trace
 
Swiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装するSwiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装する
 
ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦
 
IBM Watson Services for Core ML
IBM Watson Services for Core MLIBM Watson Services for Core ML
IBM Watson Services for Core ML
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
 
サーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでますサーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでます
 
神経回路網の計算
神経回路網の計算神経回路網の計算
神経回路網の計算
 

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