SlideShare a Scribd company logo
1 of 41
CarPlayの対応方法と
日本での現状
iOSDC Japan 2016
Yuji Hato
About me
Yuji Hato
CyberAgent, Inc. / AbemaTV, Inc.
dekatotoro
@dekatotoro
Contributed service
What is CarPlay
対応状況
対応方法
UI
実装
iOS10 新機能
まとめ
What is CarPlay
• 2014年3月3日にCarPlayが正式発表
• iPhone端末をカーナビ等の車載機器に連動させる
システム
• Maps、Music、Phone、Messages、Podcastsなどの
iOSアプリやSiriを車載ディスプレイで直接操作できる
• サードパーティのAudioアプリも対応可能
• 本体アプリの一部として動作する
http://www.apple.com/jp/ios/carplay/
What is CarPlay
対応状況
対応方法
UI
実装
iOS10 新機能
まとめ
対応 Device
対応 Device
• iPhone5以上
• iPad、iPodには対応していない
http://www.apple.com/jp/ios/carplay/
対応 iOS
対応 iOS
• iOS7.1以上
• iOS8.4、iOS9.0でAPIに少し変更あり
• iOS10でUI、APIに変更が入る
対応 アプリ
対応 アプリ
• Tuneln Radio
• MLB.com At Bat
• NHK WORLD TV ? • Audible
• VOX
• Audio Books
• Spotify
• AWA
日本 海外
etc…
対応 ナビ
対応 ナビ
純正ナビ 対応ナビ 対応車種
トヨタ
-
-
スズキ 多機能メモリーナビゲーション
イグニス、ソリオ、スペーシア、ハス
ラー
日産 プレミアムナビ 選択ナビ次第
ホンダ スタンダードナビ以上 選択ナビ次第、Accord、Legend等は×
マツダ
-
-
三菱
-
欧州向けパジェロ。日本はまだ未対応
スバル 次期インプレッサ
ベンツ A,B,CLA,CLS,GLA,GLE、今後順次
BMW -
Audi - A4, Q7。今後順次
VW Composition-media New Polo,Tiguanなど。今後順次
GM 2016年以降発売の全モデル対応
Ford 2016年発売の全モデル対応
Volvo XC90/2016 S90,V90/2017
サードパーティ 対応ナビ 対応車種
パイオニア SPH-DA700
アルパイン iLX-007 日本では未発売
メーカーホームページなどからの独自調べ 2016/08/14現在
What is CarPlay
対応状況
対応方法
UI
実装
iOS10 新機能
まとめ
対応方法
1. 開発したい旨を申請する
下記から自分のアプリでCarPlayに対応したい旨を申請する
https://developer.apple.com/contact/carplay/
対応方法
2. Agreementの送付
1の申請がOKの場合、Agreementが送られてくるので内容を確認し
て記入・署名して返送
対応方法
3. TeamIDの確認
Agreementが問題なければ、TeamIDを聞かれるのでAppleに伝える
※このタイミングでProgramingガイドも送られてきます
対応方法
4. Provisioning Profileの再作成
AppleによりCarPlay開発の設定が有効にされると、Porvisioning
Profile作成時にCarPlayのEntitlements設定が出てくるようにな
ります。
対応方法
5. Simulator
CarPlay用のSimulatorを使って開発をすることができます
What is CarPlay
対応状況
対応方法
UI
実装
iOS10 新機能
まとめ
UI
• リスト表示
• 階層構造
• 再生表示
• エラー表示
UI
リスト表示/階層構造
第1階層 第2階層 第3階層
UI
再生表示
UI
エラー表示
What is CarPlay
対応状況
対応方法
UI
実装
iOS10 新機能
まとめ
実装
• MPPlayableContentManager
• MPPlayableContentDataSource
• MPPlayableContentDelegate
リスト表示・階層構造
実装
MPPlayableContentManager
class CarPlayDemo: NSObject,
MPPlayableContentDataSource,
MPPlayableContentDelegate {
static let shared = CarPlayDemo()
func setup() {
MPPlayableContentManager.sharedContentManager().delegate = self
MPPlayableContentManager.sharedContentManager().dataSource = self
}
…
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:
AnyObject]?) -> Bool {
…
CarPlayDemo.shared.setup()
…
}
実装
MPPlayableContentDataSource
func numberOfChildItemsAtIndexPath(indexPath: NSIndexPath) -> Int {
// indexPathに応じたリストの件数を返す
return 4
}
func contentItemAtIndexPath(indexPath: NSIndexPath) -> MPContentItem? {
// indexPathに応じたMPContentItemを返す
let contentItem = MPContentItem(identifier: "container1")
contentItem.title = “container1"
contentItem.artwork = CarPlayArtwork.Home.artwork
contentItem.container = true
contentItem.playable = false
return contentItem
}
実装
MPPlayableContentDelegate
func playableContentManager(contentManager: MPPlayableContentManager,
initiatePlaybackOfContentItemAtIndexPath indexPath: NSIndexPath, completionHandler:
(NSError?) -> Void) {
// indexPathに応じたコンテンツを再生
…
completionHandler(nil)
}
実装
補足 NSIndexPath
let indexPath = NSIndexPath(indexes: [1,4,3,2], length: 4)
print(indexPath.length) // 4
print(indexPath.indexAtPosition(0)) // 1
print(indexPath.indexAtPosition(1)) // 4
print(indexPath.indexAtPosition(2)) // 3
print(indexPath.indexAtPosition(3)) // 2
// Get with pointer
var indexesPtr = UnsafeMutablePointer<Int>.alloc(indexPath.length)
indexPath.getIndexes(indexesPtr)
let indexes = [Int](UnsafeBufferPointer(start: indexesPtr, count:
indexPath.length))
indexes.forEach { value in
print(value) // 1 4 3 2
}
実装
• MPNowPlayingInfoCenter
• MPRemoteCommandCenter
再生表示/制御
実装
MPNowPlayingInfoCenter
var trackInfo: [String: AnyObject] = [:]
trackInfo[MPMediaItemPropertyTitle] = "trackName"
trackInfo[MPMediaItemPropertyArtist] = "artistName"
trackInfo[MPMediaItemPropertyAlbumTitle] = "albumName"
trackInfo[MPMediaItemPropertyPlaybackDuration] = 60
trackInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = 10
trackInfo[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1 : 0
trackInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(image: UIImage(asset:
.ArtworkDemo)) MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = trackInfo
実装
MPRemoteCommandCenter
let remoteCommandCenter = MPRemoteCommandCenter.sharedCommandCenter()
remoteCommandCenter.nextTrackCommand.addTarget(self, action:
#selector(RemoteCommand.next))
remoteCommandCenter.previousTrackCommand.addTarget(self, action:
#selector(RemoteCommand.previous))
remoteCommandCenter.playCommand.addTarget(self, action: #selector(RemoteCommand.play))
remoteCommandCenter.pauseCommand.addTarget(self, action:
#selector(RemoteCommand.pause))
remoteCommandCenter.togglePlayPauseCommand.addTarget(self, action:
#selector(RemoteCommand.playOrPause))
…
実装
エラー表示
// MPPlayableContentDataSource
func beginLoadingChildItemsAtIndexPath(indexPath: NSIndexPath, completionHandler:
(NSError?) -> Void) {
// Error
completionHandler(CarPlayErrorType.NoData.error())
}
// MPPlayableContentDelegate
func playableContentManager(contentManager: MPPlayableContentManager,
initiatePlaybackOfContentItemAtIndexPath indexPath: NSIndexPath, completionHandler:
(NSError?) -> Void) {
// Error
completionHandler(CarPlayErrorType.PlaybackError.error())
}
実装
• リストの生成は一度に件数分MPContentItemが生成される
• MPContentItemのidentifierが同じだとitemが再利用される
• dataSource、delegateはメインスレッドでこない
• iOS8.4からはMPPlayableContentManagerContextが利用できる
注意点
What is CarPlay
対応状況
対応方法
UI
実装
iOS10 新機能
まとめ
iOS10 新機能
• タブナビゲーションのサポート
• シャッフルとリピート表示など
• 再生中メディアのマーク表示
Audio apps
• Siriサポート
Automaker apps
Messaging apps
• Siriサポート
What is CarPlay
対応状況
対応方法
UI
実装
iOS10 新機能
まとめ
まとめ
• UIはシンプル
• 開発コストは低い
• 日本での普及はこれから
ナビの付帯機能としてのCarPlay
ナビとしてのCarPlay
CarPlayのナビ精度改善/機能
拡充と対応アプリの増加
Thank you
参考資料
http://www.apple.com/jp/ios/carplay/
https://developer.apple.com/carplay/
https://developer.apple.com/videos/play/wwdc2016/722/
https://developer.apple.com/videos/play/wwdc2016/723/
http://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h26/html/nc141320.html
http://news.mynavi.jp/articles/2016/01/17/carplay_androidauto_ces/

More Related Content

What's hot

SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」akipii Oga
 
データファブリック実現のためのプロジェクトの進め方とは
データファブリック実現のためのプロジェクトの進め方とはデータファブリック実現のためのプロジェクトの進め方とは
データファブリック実現のためのプロジェクトの進め方とはDenodo
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!Nagato Kasaki
 
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)Yoshikazu GOTO
 
OutSystems 新機能紹介: Reactive Web
OutSystems 新機能紹介: Reactive WebOutSystems 新機能紹介: Reactive Web
OutSystems 新機能紹介: Reactive WebTsuyoshi Kawarasaki
 
[Node-RED] ファンクションノードのデバッグどうしてる?
[Node-RED] ファンクションノードのデバッグどうしてる?[Node-RED] ファンクションノードのデバッグどうしてる?
[Node-RED] ファンクションノードのデバッグどうしてる?Makoto SAKAI
 
ゴシッププロトコルによる冗長化と負荷分散の検証
ゴシッププロトコルによる冗長化と負荷分散の検証ゴシッププロトコルによる冗長化と負荷分散の検証
ゴシッププロトコルによる冗長化と負荷分散の検証Sugawara Genki
 
年間1,000万件のアラートを自動処理してみた
年間1,000万件のアラートを自動処理してみた年間1,000万件のアラートを自動処理してみた
年間1,000万件のアラートを自動処理してみたIIJ
 
ヤフーのクラウドネイティブへの取り組みとそれを支えるシステム開発 #CNDT2019 #OSDT2019 #RoomE #1E4
ヤフーのクラウドネイティブへの取り組みとそれを支えるシステム開発 #CNDT2019 #OSDT2019 #RoomE #1E4ヤフーのクラウドネイティブへの取り組みとそれを支えるシステム開発 #CNDT2019 #OSDT2019 #RoomE #1E4
ヤフーのクラウドネイティブへの取り組みとそれを支えるシステム開発 #CNDT2019 #OSDT2019 #RoomE #1E4Yahoo!デベロッパーネットワーク
 
[Cloud OnAir] #01 徹底解剖 GCP のここがすごい
[Cloud OnAir] #01 徹底解剖 GCP のここがすごい[Cloud OnAir] #01 徹底解剖 GCP のここがすごい
[Cloud OnAir] #01 徹底解剖 GCP のここがすごいGoogle Cloud Platform - Japan
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド崇介 藤井
 
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用Keiichi Hikita
 
成功と失敗に学ぶアジャイル受託開発の極意
成功と失敗に学ぶアジャイル受託開発の極意成功と失敗に学ぶアジャイル受託開発の極意
成功と失敗に学ぶアジャイル受託開発の極意Yukio Okajima
 
もしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点などもしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点などKentaro Kitagawa
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 

What's hot (20)

SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
 
データファブリック実現のためのプロジェクトの進め方とは
データファブリック実現のためのプロジェクトの進め方とはデータファブリック実現のためのプロジェクトの進め方とは
データファブリック実現のためのプロジェクトの進め方とは
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
React Native 入門
React Native 入門React Native 入門
React Native 入門
 
ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!
 
Node-RED v1.3新機能紹介
Node-RED v1.3新機能紹介Node-RED v1.3新機能紹介
Node-RED v1.3新機能紹介
 
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
 
OutSystems 新機能紹介: Reactive Web
OutSystems 新機能紹介: Reactive WebOutSystems 新機能紹介: Reactive Web
OutSystems 新機能紹介: Reactive Web
 
[Node-RED] ファンクションノードのデバッグどうしてる?
[Node-RED] ファンクションノードのデバッグどうしてる?[Node-RED] ファンクションノードのデバッグどうしてる?
[Node-RED] ファンクションノードのデバッグどうしてる?
 
ゴシッププロトコルによる冗長化と負荷分散の検証
ゴシッププロトコルによる冗長化と負荷分散の検証ゴシッププロトコルによる冗長化と負荷分散の検証
ゴシッププロトコルによる冗長化と負荷分散の検証
 
年間1,000万件のアラートを自動処理してみた
年間1,000万件のアラートを自動処理してみた年間1,000万件のアラートを自動処理してみた
年間1,000万件のアラートを自動処理してみた
 
Big Data Sunum
Big Data SunumBig Data Sunum
Big Data Sunum
 
ヤフーのクラウドネイティブへの取り組みとそれを支えるシステム開発 #CNDT2019 #OSDT2019 #RoomE #1E4
ヤフーのクラウドネイティブへの取り組みとそれを支えるシステム開発 #CNDT2019 #OSDT2019 #RoomE #1E4ヤフーのクラウドネイティブへの取り組みとそれを支えるシステム開発 #CNDT2019 #OSDT2019 #RoomE #1E4
ヤフーのクラウドネイティブへの取り組みとそれを支えるシステム開発 #CNDT2019 #OSDT2019 #RoomE #1E4
 
Introducao ao Moodle
Introducao ao MoodleIntroducao ao Moodle
Introducao ao Moodle
 
[Cloud OnAir] #01 徹底解剖 GCP のここがすごい
[Cloud OnAir] #01 徹底解剖 GCP のここがすごい[Cloud OnAir] #01 徹底解剖 GCP のここがすごい
[Cloud OnAir] #01 徹底解剖 GCP のここがすごい
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド
 
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
 
成功と失敗に学ぶアジャイル受託開発の極意
成功と失敗に学ぶアジャイル受託開発の極意成功と失敗に学ぶアジャイル受託開発の極意
成功と失敗に学ぶアジャイル受託開発の極意
 
もしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点などもしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点など
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 

Similar to CarPlayの対応方法と日本での現状

Titanium Mobile
Titanium MobileTitanium Mobile
Titanium MobileNaoya Ito
 
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQLハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQLTaisuke Fukuno
 
ぶっとびケータイ+Firefox OS Apps
ぶっとびケータイ+Firefox OS Appsぶっとびケータイ+Firefox OS Apps
ぶっとびケータイ+Firefox OS AppsEnsekiTT
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するTomoki Hasegawa
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSourceMashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSourcecmutoh
 
UnityとBlenderハンズオン第7章
UnityとBlenderハンズオン第7章UnityとBlenderハンズオン第7章
UnityとBlenderハンズオン第7章yaju88
 
10年目の『エブリスタ』を支える技術
10年目の『エブリスタ』を支える技術10年目の『エブリスタ』を支える技術
10年目の『エブリスタ』を支える技術DeNA
 
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会Mori Tetsuya
 
Xcode and iTC submission topics
Xcode and iTC submission topicsXcode and iTC submission topics
Xcode and iTC submission topicsSyo Ikeda
 
Lightweight-Stream-APIのあるAndroidアプリ開発
Lightweight-Stream-APIのあるAndroidアプリ開発Lightweight-Stream-APIのあるAndroidアプリ開発
Lightweight-Stream-APIのあるAndroidアプリ開発Shinobu Okano
 
ACI Stateful APP 作ってみた
ACI Stateful APP 作ってみたACI Stateful APP 作ってみた
ACI Stateful APP 作ってみたyushimaz
 
Embedded framework and so on
Embedded framework and so onEmbedded framework and so on
Embedded framework and so ontoyship
 
PhoneGapの始め方
PhoneGapの始め方PhoneGapの始め方
PhoneGapの始め方akabana
 
How To Build Last Fm For I Phone
How To Build Last Fm For I PhoneHow To Build Last Fm For I Phone
How To Build Last Fm For I PhoneKeisuke Hata
 
Mixiアプリで体験する Open Social
Mixiアプリで体験する Open SocialMixiアプリで体験する Open Social
Mixiアプリで体験する Open Socialngi group.
 
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & CombineFumiya Sakai
 
PWA Beginner(最新版:文字抜けを修正)
PWA Beginner(最新版:文字抜けを修正)PWA Beginner(最新版:文字抜けを修正)
PWA Beginner(最新版:文字抜けを修正)Daisuke Yamazaki
 

Similar to CarPlayの対応方法と日本での現状 (20)

I phone5 ios6
I phone5 ios6I phone5 ios6
I phone5 ios6
 
I phone5・ios6変更点
I phone5・ios6変更点I phone5・ios6変更点
I phone5・ios6変更点
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium Mobile
 
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQLハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
 
ぶっとびケータイ+Firefox OS Apps
ぶっとびケータイ+Firefox OS Appsぶっとびケータイ+Firefox OS Apps
ぶっとびケータイ+Firefox OS Apps
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化する
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSourceMashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
 
UnityとBlenderハンズオン第7章
UnityとBlenderハンズオン第7章UnityとBlenderハンズオン第7章
UnityとBlenderハンズオン第7章
 
10年目の『エブリスタ』を支える技術
10年目の『エブリスタ』を支える技術10年目の『エブリスタ』を支える技術
10年目の『エブリスタ』を支える技術
 
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
 
Xcode and iTC submission topics
Xcode and iTC submission topicsXcode and iTC submission topics
Xcode and iTC submission topics
 
Lightweight-Stream-APIのあるAndroidアプリ開発
Lightweight-Stream-APIのあるAndroidアプリ開発Lightweight-Stream-APIのあるAndroidアプリ開発
Lightweight-Stream-APIのあるAndroidアプリ開発
 
ACI Stateful APP 作ってみた
ACI Stateful APP 作ってみたACI Stateful APP 作ってみた
ACI Stateful APP 作ってみた
 
Embedded framework and so on
Embedded framework and so onEmbedded framework and so on
Embedded framework and so on
 
PhoneGapの始め方
PhoneGapの始め方PhoneGapの始め方
PhoneGapの始め方
 
How To Build Last Fm For I Phone
How To Build Last Fm For I PhoneHow To Build Last Fm For I Phone
How To Build Last Fm For I Phone
 
Mixiアプリで体験する Open Social
Mixiアプリで体験する Open SocialMixiアプリで体験する Open Social
Mixiアプリで体験する Open Social
 
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
 
PWA Beginner(最新版:文字抜けを修正)
PWA Beginner(最新版:文字抜けを修正)PWA Beginner(最新版:文字抜けを修正)
PWA Beginner(最新版:文字抜けを修正)
 

More from Yuji Hato

継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」Yuji Hato
 
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ - Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ - Yuji Hato
 
iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術Yuji Hato
 
5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSources5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSourcesYuji Hato
 
AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話Yuji Hato
 
Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017Yuji Hato
 
AbemaTV on tvOS
AbemaTV on tvOSAbemaTV on tvOS
AbemaTV on tvOSYuji Hato
 
Flux with RxSwift
Flux with RxSwiftFlux with RxSwift
Flux with RxSwiftYuji Hato
 
AWA with Realm
AWA with RealmAWA with Realm
AWA with RealmYuji Hato
 

More from Yuji Hato (9)

継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
 
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ - Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
 
iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術
 
5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSources5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSources
 
AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話
 
Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017
 
AbemaTV on tvOS
AbemaTV on tvOSAbemaTV on tvOS
AbemaTV on tvOS
 
Flux with RxSwift
Flux with RxSwiftFlux with RxSwift
Flux with RxSwift
 
AWA with Realm
AWA with RealmAWA with Realm
AWA with Realm
 

CarPlayの対応方法と日本での現状

Editor's Notes

  1. まず、簡単に自己紹介します。 波戸と申します。ネット上ではだいたいdekatotoroという名前で活動しています。 サイバーエージェントのAbemaTVというサービスのiOSアプリを開発してまして、 これまでは、AmebaアプリやAWAという音楽ストリーミングサービスのアプリを開発してきました。 今回は、AWAでCarPlayの対応を行った時の知見について、お話したいと思います。
  2. はじめに、CarPlayとはなんぞや?ということですが、
  3. ・CarPlayは、2014年の3月に正式発表された、 ・iPhone端末をカーナビなどと連動させるシステムです。 ・Apple純正のマップ、Music、電話などのiOSアプリやSiriを、車載ディスプレイで直接操作できます。 ・サード・パーティのAudioアプリも対応可能となっています。 ・CarPlayはExtension等では無く本体アプリの一部として動作しますので、 本体アプリとターゲットを分けるなどの必要はありません。
  4. はい、こちらCarPlayの画像になります。 車載のディスプレイにiOSのようなホーム画面が表示されているのがわかるかと思います。 タッチパネルで操作するものや、メーカーや車種によっては専用のコントローラーを使うものもあります。
  5. 次に、日本でのCarPlay対応状況です。
  6. まず、対応Deviceは
  7. iPhone5以上で、 iPad、iPodには対応してません。
  8. 次に、対応してるOSは
  9. iOS7.1以上で、 iOS8.4と9.0でAPIに少し変更が入りました。 後ほどお話しますが、iOS10でUI,APIの変更が入るということがWWDCで発表されています。
  10. そして、対応してるアプリですが、
  11. サード・パーティのものだと、 わたしが調べた限りでは、日本企業で開発されているのは、AWAとNHK WORLD TVしか見当たりませんでした。NHK WORLD TVは4月頃対応していたのですが、最新版だと対応してなかったので、おそらく現在だと日本のサービスだとAWAが初ではないかと思います。 また、海外はかなりの数のアプリが対応していて、オーディオ系のアプリは基本対応する、という印象を受けています
  12. はい、で、対応してるナビですが
  13. ざっとこんな感じです。 Appleと主要な自動車メーカーのホームページを見てまとめてみました。 ・国産メーカーはトヨタ、マツダは現状対応していませんが、他の国産メーカーは、2016年になって少しづつ対応車種やナビが出てきました。 ・欧米のメーカーは基本的に積極的に対応しており、今後は標準装備になるところが多そうです。 ・下の図ですが、日本で買えるサード・パーティのナビとしては唯一、パイオニアのSPH-DA700があります。 以上が日本での対応状況になります。
  14. では、ここから開発の話に入ります。
  15. まず、実装前の準備として、CarPlayに対応したい旨を申請します。
  16. 申請がOKであれば、Agreementが送られてくるので、内容を確認して、記入・署名し返送します。
  17. Agreementが問題なければ、TeamIDを聞かれるので、それをAppleに伝えます。
  18. AppleからCarPlay開発の設定が有効にされると、Provisioning Profile作成時にCarPlayのEntitlements設定が出てくるようになるので、CarPlayのEntitlementsを選択してProvisionning Profileを再作成する必要があります。
  19. 開発は、CarPlay用のSimulatorを使ってできます。 XocdeのHardwareのexternalDisplaysからCarPlayを選択することで、CarPlayのシミュレーターを使うことができます。 これで開発の準備は整いました。
  20. ここで、CarPlayのUIを紹介します。
  21. CarPlayのUIは大きく分けて4パターンで、非常にシンプルなものになります。 ・リスト表示 ・階層構造 ・再生表示 ・エラー表示 の4つになります。 順番に説明していきます。
  22. 基本的にCarPlayのUIは、リスト表示と、階層構造でコンテンツを表示する、というシンプルなものです。 下の図は実際のAWAのUIですが、第一階層でHomeをタップ、第二階層でDiscoveryをタップ、第三階層と、リストを表示していくことができます。
  23. 再生表示は、右の図のように コンテンツのtitleやsubtitleなど、決められたフォーマットで表示する形となってます。
  24. エラー表示は、Alertを表示できます。 こちらもUIは決まっていて、textを指定できるのみです。 以上がUIの大枠になります。
  25. はい、では実装の話です。
  26. CarPlayはMedia Player Frameworkのクラスを使うのですが、 リスト表示と階層構造の実装は、主に3つのクラスを使って実装します。 ・MPPlayableContentManager ・MPPlayableContentDataSource ・MPPlayableContentDelegate の3つになります。 順番に説明していきます。
  27. MPPlayableContentManagerはexternal media playerを管理するクラスで、 sharedContentManagerを使って、singletonで扱います。 この例ではCarPlayDemoというクラスのsetupでdataSourceとdelegateを設定していて、AppDelagateのdidFinishLaunchingWithOptionsでsetupします。
  28. 次にMPPlayableContentDataSourceを実装します。 上のnumberOfChildItemsAtIndexPathでは、階層に応じたListの件数を返します。 下のcontentItemAtIndexPathでは、階層とListのpositionに応じたMPContentItemを返します。 MPContentItemは、 identifierはtrackやalbumなどの音源データの一意のidを設定します コンテンツをタップして次の階層に行く場合は、containerをtrueにします。container trueだと>(DisclosureIndicator)が表示されるようになります。 コンテンツをタップしたときに再生する場合は、playableをtrueにします。
  29. 次にMPPlayableContentDelegateですが、このdelegateでは再生の実装を行います。 先ほど言いましたが、MPContentItemでplayableをtrueにしたコンテンツがタップされた時に呼ばれます。 階層とリストのpositionに応じたコンテンツの再生を実装します。 completionHandlerは再生が成功した場合はnil、失敗した場合はerrorを返すようにします。 リスト表示と階層構造の実装は基本的には以上です。
  30. そして補足ですが、NSIndexPathについて少し説明しておきます。 普段TableViewやCollectionViewで使っているsectionやrow,itemは、UIKitで拡張されたものですが、元々のFoundationのNSIndexPathは、配列の階層を表現するクラスになります。 この例でいくと、生成したNSIndexPathが表すものは、全部で4階層で、 で、右の図がわかりやすいと思うのですが、第一階層の1番目の第二階層の4番目の第三階層の3番目の第四階層の2番目を表すindexpathになります。 lengthが階層の深さで、indexAtPositionでそれぞれの階層の配列の位置が取得できます。 一応pointerでも取得できる例を下に書いています。 CarPlayでは、dataSourceとdelegateで渡ってくるNSIndexPathから、階層と配列の場所を特定して、処理を書くことになります。
  31. 次に再生表示・制御ですが、 MPNowPlayingInfoCenterとMPRemoteCommandCenterを使います。 この2つのクラスはCarPlayだけでなくて、ロック画面やコントロールセンター、AirPlayの対応でも同様ですので、ご存知の方も多いかと思います。
  32. MPNowPlayingInfoCenterは、再生中の音源情報を表示するためのクラスです。 trackNameやartistName、再生時間などを設定します。 Dictionaryに、定義されたキーで値を設定して、nowPlayingInfoに設定することで、表示に反映できます。
  33. MPRemoteCommandCenterは 再生画面の再生、曲送り、曲戻しなどの操作のためのイベントハンドラーのクラスです。 他にもlikeCommandやdislikeCommandなどいくつかあります。 それぞれイベントハンドラーを登録して再生・ストップなどの処理を書けばOKです。 //言わない iOS7.1から使えますが、CarPlayはiOS7.1以上なので iOS4からある (void)remoteControlReceivedWithEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(4_0); は使う必要はありません
  34. エラー表示ですが、 dataSourceのデータロード処理を行うbeginLoadingChildItemsAtIndexPath とdelegateの再生処理を行うplayableContentManagerで表示できます。CompletionHandlerにnilを返せば正常表示、errorを返せばエラー表示というふうになります エラーメッセージはNSErrorのlocalizedDescriptionが使われるので、CarPlay用のNSErrorとNSErrorTypeを定義して独自のエラークラスを作成すると綺麗に実装できると思います。
  35. 最後に、実装するときの注意点です。 ・目安として階層は5、リスト件数は12にしておくと良いです。 階層は、超えるとcrashしてしまうので必ず守る必要があります。リスト件数は超えても削除されるだけなので、あくまで目安という形です。 ・iOS8.4からは、MPPlayableContentManagerContextが利用できます。 contextから階層やリスト件数のlimitが取得できるので、それを使って制限のチェックを行うと良いです。 ・リストの生成は、一度に件数分MPContentItemが生成されます。 tableViewなどのように、描画時に表示分呼び出されるわけではなくて、 リストの件数分一度に生成されます。なので、Artworkとして使用する画像サイズは小さくする、リストの件数も制限するなどしてメモリ使用量を考慮する必要があります。 ・MPContentItemのidentifierが同じだと、itemが再利用されるので、意図せぬ表示や動きになる場合があります。その点で、注意が必要です。 ・dataSource、delegateはメインスレッドで来ません。 tableViewのように、メインスレッドでくるわけではなく、また、呼び出されるたびに異なるサブスレッドで来る場合もあるので、スレッド制約があるライブラリを使っている場合は注意が必要です。 以上が実装の説明になります。
  36. では、冒頭でチラっとお話した、iOS10の新機能を紹介します。
  37. WWDCで発表されたiOS10のCarPlay新機能ですが、Audio appsとAutomaker Appsそれぞれにいくつかあります。 まずAudio appsの新機能として、 ・タブナビゲーションのサポート、 ・再生中メディアマークの表示 ・シャッフル、リピート表示などです。 タブナビゲーションやシャッフル・リピートなどは、純正のMusicアプリで使われている機能なので、iOS10になってサード・パーティに公開される、という感じでしょうか。 次にAutomaker appsですが、Audioアプリの他に自動車メーカーのアプリもCarPlayに対応できます。で、そちらにSiriがサポートされるようです。 最後に、CarPlay対応できるアプリのカテゴリとして、Messagingアプリが追加されるようです。おそらくLineのようなメッセージ系のアプリも、CarPlayに対応できるようになるのではないかと思われます。 以上がiOS10の新機能になります。
  38. はい、最後にまとめです。
  39. ・先ほどお話したとおり、UIは、非常にシンプルなものになります。 GoogleのAndroidAutoは、なるべく6タップ以内で再生するなどありますが、 CarPlayでも、決められたUIの中で、情報整理となるべく少ないタップでコンテンツを再生できるようにするなどの工夫が必要だと思います。 ・開発コストは低いということでUIがシンプルでカスタマイズできないこともあり、開発はそんなに大変じゃないです。 Audioアプリを開発してる方は、付加価値としてCarPlayの対応を検討してもよいのではないかと思います。 ・最後に、日本での普及はこれからということで、現状まだまだなのですが、 その背景には,トヨタのT-ConnectやレクサスのG-link、マツダのマツダコネクトなど、独自プラットフォームとのバッティングがあると思います。 日本でCarPlayが普及するかどうかは、マップアプリやSiriの精度が上がる、また、支持されるCarPlay対応のアプリが出てくるかどうかで決まるような気がしています。 特に、iOS10でmessageアプリも対応できるようになるようなので、Lineなどのメジャーなメッセージアプリが対応することや、トヨタ、マツダがCarPlay対応するかどうかも大きな分岐点になるかもしれません。 エンジニアとしては、今後のCarPlayの動向や機能拡大をキャッチアップして、使いやすいアプリを開発していければと思っています。 以上で私のお話を終わります。ご清聴ありがとうございました。