SlideShare a Scribd company logo
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

ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
Kohei Kadowaki
 
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
OpenCVとRGB-Dセンサで作ろう壁面タッチパネルOpenCVとRGB-Dセンサで作ろう壁面タッチパネル
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
Takashi Yoshinaga
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
torisoup
 
NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020
gree_tech
 
IoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache FlinkIoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache Flink
Takanori Suzuki
 
UIPageViewControllerとContainerViewでこんな見た目を実現するTips
UIPageViewControllerとContainerViewでこんな見た目を実現するTipsUIPageViewControllerとContainerViewでこんな見た目を実現するTips
UIPageViewControllerとContainerViewでこんな見た目を実現するTips
Fumiya Sakai
 
iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測
Toshiyuki Hirata
 
Einsteinvision - object detection を試してみよう
Einsteinvision - object detection を試してみようEinsteinvision - object detection を試してみよう
Einsteinvision - object detection を試してみよう
Salesforce Developers Japan
 
[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門
Google Cloud Platform - Japan
 
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
de:code 2017
 
公共交通オープンデータ第2幕:「静的データは出来た、次はリアルタイム」と決めつける前に考えること
公共交通オープンデータ第2幕:「静的データは出来た、次はリアルタイム」と決めつける前に考えること公共交通オープンデータ第2幕:「静的データは出来た、次はリアルタイム」と決めつける前に考えること
公共交通オープンデータ第2幕:「静的データは出来た、次はリアルタイム」と決めつける前に考えること
Masaki Ito
 
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
Fumiya Sakai
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
gree_tech
 
利他的UX研究の成果と課題
利他的UX研究の成果と課題利他的UX研究の成果と課題
利他的UX研究の成果と課題
Masaya Ando
 
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
NAVER D2
 
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
Naoya Kishimoto
 
GOの機械学習システムを支えるMLOps事例紹介
GOの機械学習システムを支えるMLOps事例紹介GOの機械学習システムを支えるMLOps事例紹介
GOの機械学習システムを支えるMLOps事例紹介
Takashi Suzuki
 
ユーザーエクスペリエンスは計測可能なのか? 〜UX計測に関する論文レビュー
ユーザーエクスペリエンスは計測可能なのか? 〜UX計測に関する論文レビューユーザーエクスペリエンスは計測可能なのか? 〜UX計測に関する論文レビュー
ユーザーエクスペリエンスは計測可能なのか? 〜UX計測に関する論文レビュー
Masaya Ando
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
Shigenori Sagawa
 
Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -
Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -
Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -
Tier_IV
 

What's hot (20)

ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
 
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
OpenCVとRGB-Dセンサで作ろう壁面タッチパネルOpenCVとRGB-Dセンサで作ろう壁面タッチパネル
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020
 
IoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache FlinkIoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache Flink
 
UIPageViewControllerとContainerViewでこんな見た目を実現するTips
UIPageViewControllerとContainerViewでこんな見た目を実現するTipsUIPageViewControllerとContainerViewでこんな見た目を実現するTips
UIPageViewControllerとContainerViewでこんな見た目を実現するTips
 
iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測iOSにおけるパフォーマンス計測
iOSにおけるパフォーマンス計測
 
Einsteinvision - object detection を試してみよう
Einsteinvision - object detection を試してみようEinsteinvision - object detection を試してみよう
Einsteinvision - object detection を試してみよう
 
[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門
 
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
 
公共交通オープンデータ第2幕:「静的データは出来た、次はリアルタイム」と決めつける前に考えること
公共交通オープンデータ第2幕:「静的データは出来た、次はリアルタイム」と決めつける前に考えること公共交通オープンデータ第2幕:「静的データは出来た、次はリアルタイム」と決めつける前に考えること
公共交通オープンデータ第2幕:「静的データは出来た、次はリアルタイム」と決めつける前に考えること
 
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
 
利他的UX研究の成果と課題
利他的UX研究の成果と課題利他的UX研究の成果と課題
利他的UX研究の成果と課題
 
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
 
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
 
GOの機械学習システムを支えるMLOps事例紹介
GOの機械学習システムを支えるMLOps事例紹介GOの機械学習システムを支えるMLOps事例紹介
GOの機械学習システムを支えるMLOps事例紹介
 
ユーザーエクスペリエンスは計測可能なのか? 〜UX計測に関する論文レビュー
ユーザーエクスペリエンスは計測可能なのか? 〜UX計測に関する論文レビューユーザーエクスペリエンスは計測可能なのか? 〜UX計測に関する論文レビュー
ユーザーエクスペリエンスは計測可能なのか? 〜UX計測に関する論文レビュー
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -
Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -
Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -
 

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

Titanium Mobile
Titanium MobileTitanium Mobile
Titanium MobileNaoya Ito
 
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQLハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
Taisuke Fukuno
 
ぶっとびケータイ+Firefox OS Apps
ぶっとびケータイ+Firefox OS Appsぶっとびケータイ+Firefox OS Apps
ぶっとびケータイ+Firefox OS Apps
EnsekiTT
 
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 OpenSource
cmutoh
 
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 topics
Syo 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 on
toyship
 
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 & Combine
Fumiya 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分で学ぶ差分更新とRxDataSources
Yuji Hato
 
AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話
Yuji Hato
 
Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017
Yuji Hato
 
AbemaTV on tvOS
AbemaTV on tvOSAbemaTV on tvOS
AbemaTV on tvOS
Yuji Hato
 
Flux with RxSwift
Flux with RxSwiftFlux with RxSwift
Flux with RxSwift
Yuji Hato
 
AWA with Realm
AWA with RealmAWA with Realm
AWA with Realm
Yuji 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
 

Recently uploaded

20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf
Ayachika Kitazaki
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
fisuda
 
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
ooishi1
 
Grokking Simplicity探訪
Grokking Simplicity探訪Grokking Simplicity探訪
Grokking Simplicity探訪
Yoshitaka Kawashima
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
You&I
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
You&I
 

Recently uploaded (6)

20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
 
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
 
Grokking Simplicity探訪
Grokking Simplicity探訪Grokking Simplicity探訪
Grokking Simplicity探訪
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
 

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の動向や機能拡大をキャッチアップして、使いやすいアプリを開発していければと思っています。 以上で私のお話を終わります。ご清聴ありがとうございました。