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.
RealmとApp Extensionの
ガイダンス
星野佑太
Yuta Hoshino
1 2015-8-25 Realm Meetup #6
このプレゼンのメリット
• iOSアプリとApple Watchアプリ(watchOS1)の間で、同一のRealm
ファイルを共有するための手順を確認できる。
• 他のApp Extension(TodayやActionなど)も本質は同じ
• ...
自己紹介
• 星野佑太 iPhone3GSの頃〜、自社開発が
メインの株式会社ジーニー
• メモ電卓(ge-calc) 累計64万DL。iPad総合
Top100入り。200万DL目指す。
CoreDataベース。
• Realmの製品導入はQ...
• AppStoreで無料配布中。
• URLからQRコードを生成、スキャンす
るiOS/Watchアプリ。Glance、Action、
Handoff済。
• Realm Swiftを採用している。
• iOSアプリとWatchアプリが同一の...
なぜRealmを採用したか?
5
セット
アップ
の速さ
データ
構造の
定義し
やすさ
操作の
記述の
簡易さ
データ
更新の
通知
iCloud
対応
Android
対応
総合
CoreDa
ta
△ △ △ ◎ ◎ × △
Realm ...
最新版UIの動き
必要な作業
7
Realm導入済
iOSアプリ
AppGroup
Embedded
Framework
UIの挙動調
整
WatchKit
Extension
プロジェクト
CocoaPods
App Groupの意義
• 同一の.realmファイルをiOS/Watch(AppExtension)の
いずれからもアクセスできるようにするため。
8
Realm
App Group
• Member CenterにApp Groupを登録する。
• Certificates, Identifiers & Profiles > iOS Apps > Identifiers > App Groups
• i...
より詳しい手順の解説
• WatchKitでiPhone Appとデータ共有する方法(_tid_著)
10
http://qiita.com/_tid_/items/dfff60ec8e93fefe1af4
Embedded Frameworkの利点
• 親と子で重複してしまうコードを1本化して使
いまわす。
• RealmObjectモデルを記述したファイルを使い
まわせる。
• 二度手間をカットできる。整合性のトラブルを
回避できる。
• Em...
Embedded Framework
1. Targetsに追加する。CocoaTouchFrameworkを選択→ProductNameにFrameworkの名前
として使う任意の名前を入れる
2. AppExtensionで利用できないAP...
より詳しい手順の解説
• [iOS 8] App Extension #2 – Embedded Framework を利
用して共有コードを Framework 化する(クラスメソッ
ド株式会社 著)
13
http://dev.classm...
必要な作業
14
Realm導入済
iOSアプリ
AppGroup
Embedded
Framework
UIの挙動調
整
WatchKit
Extension
プロジェクト
CocoaPods
Cocoa Podsの利点
• 導入が楽。
• バージョンアップ時のアップデート作業(◎)が圧倒的に楽。
• Podfileを一度書いておけば基本的にOK。
15
Podfile
platform :ios,'8.0'
use_frameworks!
link_with 'QReate_Framework'
pod 'RealmSwift'
end
Targets Podfile
• Watch Exte...
より詳しい手順の解説
17
• App ExtensionでCocoaPods管理しているライブラリ
を使用する2つの方法(tmnb 著)
http://qiita.com/tmnb/items/15377f03498ca0b53592
UIとRealm
• リスト画面から
contextForSegueWithIdentifier(
)で遷移先のQRコード表示画面
にcurrentRowのインデックス
を受け渡す。
• そのインデックスを見て、
Realmファイルからレコード...
データ変更時の原則
• データ変更が起きた場合にどう処理しているか。
• Realmの変更通知を受けたときに、currentRowから現在のレコード内容を参照して再表
示する原則をとっている。
• NotificationTokenにRealm...
要素不足でクラッシュ
20
クラッシュする場合: iOS側が削除した要素をwatch側で参照した
index 1
index 0
index 1
index 0
index 1
index 0
💥
t
index 1
🔃
👀 ???
• ソート...
要素不足時の例外
21
対策: 要素不足ならpopさせてReload
index 0
index 1
index 0
index 1
index 0
index 1
index 0
🔃
↩︎
👀
t
index 1
• Realmの変更通知は、...
watch側のコード
22
2層目のQRコード表示用
InterfaceController.swift
iOS側で.realmファイルの変更
☺︎thank you,
• ご静聴ありがとうございました。
• watchOS2対応については改めてまとめて
別の機会に発表したいと思います。
• 質問があれば ythshn@gmail.com までお
願いします。
• Facebookリク...
AED💨Registers(仮)
• 年間7万人位が心臓停止で死亡。誰もが突然、遭遇する。
• 心臓マッサージとAEDの処置で救命率は4倍高まる。
• AED使用で救命できたのは、目撃ケースの3.7% 近くのAEDを速く持ってくる
ことが大事。...
Upcoming SlideShare
Loading in …5
×

RealmとApp Extensionのガイダンス/Realm meetup vol.6

3,433 views

Published on

iOSアプリとApple Watchアプリ(watchOS1)の間で、同一のRealmファイルを共有するための手順を確認できる。

Published in: Software
  • Be the first to comment

RealmとApp Extensionのガイダンス/Realm meetup vol.6

  1. 1. RealmとApp Extensionの ガイダンス 星野佑太 Yuta Hoshino 1 2015-8-25 Realm Meetup #6
  2. 2. このプレゼンのメリット • iOSアプリとApple Watchアプリ(watchOS1)の間で、同一のRealm ファイルを共有するための手順を確認できる。 • 他のApp Extension(TodayやActionなど)も本質は同じ • Watchをビュワーにするアプリ、キャッシュをWatchやToday Extensionで再利用するアプリなどを開発するときに役立つ。 Realm 2
  3. 3. 自己紹介 • 星野佑太 iPhone3GSの頃〜、自社開発が メインの株式会社ジーニー • メモ電卓(ge-calc) 累計64万DL。iPad総合 Top100入り。200万DL目指す。 CoreDataベース。 • Realmの製品導入はQReationが初。 • Apple Watchの受託案件として、Akerun のモックアップ段階のUIプログラミング 3 Yuta Hoshino @hsylife
  4. 4. • AppStoreで無料配布中。 • URLからQRコードを生成、スキャンす るiOS/Watchアプリ。Glance、Action、 Handoff済。 • Realm Swiftを採用している。 • iOSアプリとWatchアプリが同一の Realmファイルを共用している (watchOS1)。 • 勉強会で相手方にURLを渡すのが大変だ ったので開発した。 QReation (クリエーション) 4 https://appsto.re/jp/mtMw7.i
  5. 5. なぜRealmを採用したか? 5 セット アップ の速さ データ 構造の 定義し やすさ 操作の 記述の 簡易さ データ 更新の 通知 iCloud 対応 Android 対応 総合 CoreDa ta △ △ △ ◎ ◎ × △ Realm ◎ ◎ ◎ △ × ◎ ◎
  6. 6. 最新版UIの動き
  7. 7. 必要な作業 7 Realm導入済 iOSアプリ AppGroup Embedded Framework UIの挙動調 整 WatchKit Extension プロジェクト CocoaPods
  8. 8. App Groupの意義 • 同一の.realmファイルをiOS/Watch(AppExtension)の いずれからもアクセスできるようにするため。 8 Realm
  9. 9. App Group • Member CenterにApp Groupを登録する。 • Certificates, Identifiers & Profiles > iOS Apps > Identifiers > App Groups • identifierは”group.com.ge-nie.QReate.Documents”のような形 • iOS/Extensionの各ターゲットの設定をONに。 • Project > Capabilities > AppGroupsをON → identifierを選択 • ファイルのパスを与える。 9
  10. 10. より詳しい手順の解説 • WatchKitでiPhone Appとデータ共有する方法(_tid_著) 10 http://qiita.com/_tid_/items/dfff60ec8e93fefe1af4
  11. 11. Embedded Frameworkの利点 • 親と子で重複してしまうコードを1本化して使 いまわす。 • RealmObjectモデルを記述したファイルを使い まわせる。 • 二度手間をカットできる。整合性のトラブルを 回避できる。 • Embedded FrameworkなしでもFrameworkを作 成できる。しかし実装手順がより簡易で済む。 • Xcode6から利用可。 Embedded Framework 11
  12. 12. Embedded Framework 1. Targetsに追加する。CocoaTouchFrameworkを選択→ProductNameにFrameworkの名前 として使う任意の名前を入れる 2. AppExtensionで利用できないAPIを弾くマクロを有効化す る。Allow app extension API onlyにチェック 3. Extensionにリンクさせる。本体アプリがEmbedded binaryとして追加されている かを確認→Extensionのターゲットに切り替えて、+を押してリンクさせる。 4. アクセスレベルをpublicに。 5. importする。iOS/Watchの両方で。 12
  13. 13. より詳しい手順の解説 • [iOS 8] App Extension #2 – Embedded Framework を利 用して共有コードを Framework 化する(クラスメソッ ド株式会社 著) 13 http://dev.classmethod.jp/references/ios-8-embedded-framework/
  14. 14. 必要な作業 14 Realm導入済 iOSアプリ AppGroup Embedded Framework UIの挙動調 整 WatchKit Extension プロジェクト CocoaPods
  15. 15. Cocoa Podsの利点 • 導入が楽。 • バージョンアップ時のアップデート作業(◎)が圧倒的に楽。 • Podfileを一度書いておけば基本的にOK。 15
  16. 16. Podfile platform :ios,'8.0' use_frameworks! link_with 'QReate_Framework' pod 'RealmSwift' end Targets Podfile • Watch Extentionなどのターゲットを全部リンクする必要はなく、 Embedded FrameworkをLink withでリンクさせればよい • ターゲット名の誤記、スペースの有無、シングルクォーテーションに注意
  17. 17. より詳しい手順の解説 17 • App ExtensionでCocoaPods管理しているライブラリ を使用する2つの方法(tmnb 著) http://qiita.com/tmnb/items/15377f03498ca0b53592
  18. 18. UIとRealm • リスト画面から contextForSegueWithIdentifier( )で遷移先のQRコード表示画面 にcurrentRowのインデックス を受け渡す。 • そのインデックスを見て、 Realmファイルからレコードを 取り出してQRコードを表示し ている。 18 currentRow =1index 0 index 1 index 1 0 1 index 00 index 11 Realm
  19. 19. データ変更時の原則 • データ変更が起きた場合にどう処理しているか。 • Realmの変更通知を受けたときに、currentRowから現在のレコード内容を参照して再表 示する原則をとっている。 • NotificationTokenにRealm().addNotificationBlockを追加して再表示処理をさせる。 19 index 1 index 0 index 1 index 0 index 1 index 0 t 🔃 👀 changedchanged
  20. 20. 要素不足でクラッシュ 20 クラッシュする場合: iOS側が削除した要素をwatch側で参照した index 1 index 0 index 1 index 0 index 1 index 0 💥 t index 1 🔃 👀 ??? • ソートされたレコードはArray型。 • watchで末尾のrowのQRコードを表示している場合に、iOS側 でそのデータソースを削除すると、要素の数が不足する。 ??? 🐛
  21. 21. 要素不足時の例外 21 対策: 要素不足ならpopさせてReload index 0 index 1 index 0 index 1 index 0 index 1 index 0 🔃 ↩︎ 👀 t index 1 • Realmの変更通知は、追加・修正・削除などを区別していない。 「変更」という通知が来るのみ。 • 要素不足を判定して、ルートに戻す。 👀
  22. 22. watch側のコード 22 2層目のQRコード表示用 InterfaceController.swift iOS側で.realmファイルの変更
  23. 23. ☺︎thank you, • ご静聴ありがとうございました。 • watchOS2対応については改めてまとめて 別の機会に発表したいと思います。 • 質問があれば ythshn@gmail.com までお 願いします。 • Facebookリクエストを歓迎しています。 • 告知があります。 23 Yuta Hoshino @hsylife
  24. 24. AED💨Registers(仮) • 年間7万人位が心臓停止で死亡。誰もが突然、遭遇する。 • 心臓マッサージとAEDの処置で救命率は4倍高まる。 • AED使用で救命できたのは、目撃ケースの3.7% 近くのAEDを速く持ってくる ことが大事。 • AEDを配達するアプリなどを発想する上で、設置場所のデータが10倍ほしい。 • AEDの販売台数は世界一で60万弱あるが、設置場所のオープンデータは3.5万 件分。 • AEDの設置場所でイングレスみたいな国取りゲームを作って、結果的にAED の全国マップを作るアイデア。(AED💨) • 人口密集地ほど配点が高い。 • オレンジチームと白チームに分かれる?(要は対戦) • 個人の点数ランキングもある。 • 先取した人が点数ゲット+100。一定期間経つとまたリセットされる。 • AEDの設置データはオープンデータプラットホームに転送する。そこからサー ドパーティーのAED検索などのアプリと連携して、緊急時などに活用される。 • → 良いアイディアがあれば教えてください。ythshn@gmail.com 24 96. 3 % 3.7 %

×