Submit Search
Upload
既存アプリのiOS8対応 #ios8yahoo
•
23 likes
•
25,942 views
Yahoo!デベロッパーネットワーク
Follow
http://connpass.com/event/8629/
Read less
Read more
Report
Share
Report
Share
1 of 91
Download now
Download to read offline
Recommended
Xcode 6の新機能
Xcode 6の新機能
Shingo Sato
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
niwatako
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips まで
Yuki Tanabe
iOS 8/Swift 概要 #ios8yahoo
iOS 8/Swift 概要 #ios8yahoo
Hiramatsu Ryosuke
Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm
Hiramatsu Ryosuke
Swift勉強会
Swift勉強会
Nagamine Hiromasa
SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記
yohei sugigami
Xcode 7 の新しいところ #cm_ios9
Xcode 7 の新しいところ #cm_ios9
Tomohiro Kumagai
Recommended
Xcode 6の新機能
Xcode 6の新機能
Shingo Sato
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
niwatako
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips まで
Yuki Tanabe
iOS 8/Swift 概要 #ios8yahoo
iOS 8/Swift 概要 #ios8yahoo
Hiramatsu Ryosuke
Xcodeを便利に使って爆速開発する #yxcm
Xcodeを便利に使って爆速開発する #yxcm
Hiramatsu Ryosuke
Swift勉強会
Swift勉強会
Nagamine Hiromasa
SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記
yohei sugigami
Xcode 7 の新しいところ #cm_ios9
Xcode 7 の新しいところ #cm_ios9
Tomohiro Kumagai
NSNotification in Swift #cocoa_kansai
NSNotification in Swift #cocoa_kansai
Tomohiro Kumagai
Swift 3 その基本ルールを眺める #cswift
Swift 3 その基本ルールを眺める #cswift
Tomohiro Kumagai
Swift ドキュメントコメント
Swift ドキュメントコメント
Tomohiro Kumagai
Swift入門
Swift入門
聡 中川
Study Swift
Study Swift
Akihiro Urushihara
Swift 構造体の時代 #yidev
Swift 構造体の時代 #yidev
Tomohiro Kumagai
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Tomohiro Kumagai
Xcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhios
Tomohiro Kumagai
iOS豆知識ver0.0.5
iOS豆知識ver0.0.5
ppengotsu Name
Android カスタムROMの作り方
Android カスタムROMの作り方
Masahiro Hidaka
はじめてのiOSアプリ開発 ①
はじめてのiOSアプリ開発 ①
Nagamine Hiromasa
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswift
Tomohiro Kumagai
Core Image Tips & Tricks in iOS 9
Core Image Tips & Tricks in iOS 9
Shuichi Tsutsumi
【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!
Yu Tanaka
はじめてのCodeIgniter
はじめてのCodeIgniter
Yuya Matsushima
iPhoneアプリ開発の歩き方〜Swift編〜
iPhoneアプリ開発の歩き方〜Swift編〜
Yusuke SAITO
Swiftアプリ制作入門 かんたんシューティングゲーム
Swiftアプリ制作入門 かんたんシューティングゲーム
聡 中川
はじめてのAndroid開発
はじめてのAndroid開発
Katsumi Honda
Css nite(2010.09.23)
Css nite(2010.09.23)
Yoshiki Ushida
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
Taketo Sano
iOS8勉強会@Yahoo! JAPAN "Document Provider"
iOS8勉強会@Yahoo! JAPAN "Document Provider"
智也 大西
More Related Content
What's hot
NSNotification in Swift #cocoa_kansai
NSNotification in Swift #cocoa_kansai
Tomohiro Kumagai
Swift 3 その基本ルールを眺める #cswift
Swift 3 その基本ルールを眺める #cswift
Tomohiro Kumagai
Swift ドキュメントコメント
Swift ドキュメントコメント
Tomohiro Kumagai
Swift入門
Swift入門
聡 中川
Study Swift
Study Swift
Akihiro Urushihara
Swift 構造体の時代 #yidev
Swift 構造体の時代 #yidev
Tomohiro Kumagai
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Tomohiro Kumagai
Xcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhios
Tomohiro Kumagai
iOS豆知識ver0.0.5
iOS豆知識ver0.0.5
ppengotsu Name
Android カスタムROMの作り方
Android カスタムROMの作り方
Masahiro Hidaka
はじめてのiOSアプリ開発 ①
はじめてのiOSアプリ開発 ①
Nagamine Hiromasa
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswift
Tomohiro Kumagai
Core Image Tips & Tricks in iOS 9
Core Image Tips & Tricks in iOS 9
Shuichi Tsutsumi
【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!
Yu Tanaka
はじめてのCodeIgniter
はじめてのCodeIgniter
Yuya Matsushima
iPhoneアプリ開発の歩き方〜Swift編〜
iPhoneアプリ開発の歩き方〜Swift編〜
Yusuke SAITO
Swiftアプリ制作入門 かんたんシューティングゲーム
Swiftアプリ制作入門 かんたんシューティングゲーム
聡 中川
はじめてのAndroid開発
はじめてのAndroid開発
Katsumi Honda
Css nite(2010.09.23)
Css nite(2010.09.23)
Yoshiki Ushida
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
What's hot
(20)
NSNotification in Swift #cocoa_kansai
NSNotification in Swift #cocoa_kansai
Swift 3 その基本ルールを眺める #cswift
Swift 3 その基本ルールを眺める #cswift
Swift ドキュメントコメント
Swift ドキュメントコメント
Swift入門
Swift入門
Study Swift
Study Swift
Swift 構造体の時代 #yidev
Swift 構造体の時代 #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Xcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhios
iOS豆知識ver0.0.5
iOS豆知識ver0.0.5
Android カスタムROMの作り方
Android カスタムROMの作り方
はじめてのiOSアプリ開発 ①
はじめてのiOSアプリ開発 ①
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswift
Core Image Tips & Tricks in iOS 9
Core Image Tips & Tricks in iOS 9
【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!
はじめてのCodeIgniter
はじめてのCodeIgniter
iPhoneアプリ開発の歩き方〜Swift編〜
iPhoneアプリ開発の歩き方〜Swift編〜
Swiftアプリ制作入門 かんたんシューティングゲーム
Swiftアプリ制作入門 かんたんシューティングゲーム
はじめてのAndroid開発
はじめてのAndroid開発
Css nite(2010.09.23)
Css nite(2010.09.23)
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Viewers also liked
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
Taketo Sano
iOS8勉強会@Yahoo! JAPAN "Document Provider"
iOS8勉強会@Yahoo! JAPAN "Document Provider"
智也 大西
Ios8yahoo swift-json
Ios8yahoo swift-json
dankogai
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
Tomoki Hasegawa
iOS 8/Swift エンジニア勉強会@ヤフー
iOS 8/Swift エンジニア勉強会@ヤフー
大介 束田
大人のHomekit
大人のHomekit
Ken Haneda
Viewers also liked
(6)
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
iOS8勉強会@Yahoo! JAPAN "Document Provider"
iOS8勉強会@Yahoo! JAPAN "Document Provider"
Ios8yahoo swift-json
Ios8yahoo swift-json
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
iOS 8/Swift エンジニア勉強会@ヤフー
iOS 8/Swift エンジニア勉強会@ヤフー
大人のHomekit
大人のHomekit
Similar to 既存アプリのiOS8対応 #ios8yahoo
きちんと理解できるiOS開発〜Auto Layout編
きちんと理解できるiOS開発〜Auto Layout編
mission:beGeek
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
cmutoh
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
Fumiya Sakai
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
Fumiya Sakai
20121201yidev hirobe iPad miniでRetina
20121201yidev hirobe iPad miniでRetina
Kazuya Hirobe
20151130 Apple Pencilを使う
20151130 Apple Pencilを使う
Kei Ito
iOS 6 のAuto Rotation
iOS 6 のAuto Rotation
Yuichi Fujishige
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
Nobuhiro Sue
iOS 7 対応事例 FastCheckin
iOS 7 対応事例 FastCheckin
Kosuke Ogawa
Ncmb勉強会 #8 cocos2d x 資料「Cocos2d-xとNCMBを組み合わせるには」
Ncmb勉強会 #8 cocos2d x 資料「Cocos2d-xとNCMBを組み合わせるには」
Atsushi Nakatsugawa
やはりお前らのiOS7対応は間違っている
やはりお前らのiOS7対応は間違っている
今城 善矩
iOS13 SDK による 全機能置き換え Part1
iOS13 SDK による 全機能置き換え Part1
Kaname Noto
App extension for iOS
App extension for iOS
toyship
Mapkitframework io9week
Mapkitframework io9week
Yuki Hirai
多分わかりやすいDurable functions
多分わかりやすいDurable functions
宜行 武井
JqueryMobile
JqueryMobile
Hazuki Wakabayashi
だいすきStoryboard - #potatotips (iOS/Android開発Tips共有会) 第7回
だいすきStoryboard - #potatotips (iOS/Android開発Tips共有会) 第7回
Kentaro Matsumae
第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会
codeal
Xamarin.Forms概要
Xamarin.Forms概要
Hironov OKUYAMA
BaseViewControllerは作りたくない
BaseViewControllerは作りたくない
今城 善矩
Similar to 既存アプリのiOS8対応 #ios8yahoo
(20)
きちんと理解できるiOS開発〜Auto Layout編
きちんと理解できるiOS開発〜Auto Layout編
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
20121201yidev hirobe iPad miniでRetina
20121201yidev hirobe iPad miniでRetina
20151130 Apple Pencilを使う
20151130 Apple Pencilを使う
iOS 6 のAuto Rotation
iOS 6 のAuto Rotation
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
iOS 7 対応事例 FastCheckin
iOS 7 対応事例 FastCheckin
Ncmb勉強会 #8 cocos2d x 資料「Cocos2d-xとNCMBを組み合わせるには」
Ncmb勉強会 #8 cocos2d x 資料「Cocos2d-xとNCMBを組み合わせるには」
やはりお前らのiOS7対応は間違っている
やはりお前らのiOS7対応は間違っている
iOS13 SDK による 全機能置き換え Part1
iOS13 SDK による 全機能置き換え Part1
App extension for iOS
App extension for iOS
Mapkitframework io9week
Mapkitframework io9week
多分わかりやすいDurable functions
多分わかりやすいDurable functions
JqueryMobile
JqueryMobile
だいすきStoryboard - #potatotips (iOS/Android開発Tips共有会) 第7回
だいすきStoryboard - #potatotips (iOS/Android開発Tips共有会) 第7回
第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会
Xamarin.Forms概要
Xamarin.Forms概要
BaseViewControllerは作りたくない
BaseViewControllerは作りたくない
More from Yahoo!デベロッパーネットワーク
ゼロから始める転移学習
ゼロから始める転移学習
Yahoo!デベロッパーネットワーク
継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator
Yahoo!デベロッパーネットワーク
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
Yahoo!デベロッパーネットワーク
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッション
Yahoo!デベロッパーネットワーク
LakeTahoe
LakeTahoe
Yahoo!デベロッパーネットワーク
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Yahoo!デベロッパーネットワーク
Persistent-memory-native Database High-availability Feature
Persistent-memory-native Database High-availability Feature
Yahoo!デベロッパーネットワーク
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
Yahoo!デベロッパーネットワーク
eコマースと実店舗の相互利益を目指したデザイン #yjtc
eコマースと実店舗の相互利益を目指したデザイン #yjtc
Yahoo!デベロッパーネットワーク
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo!デベロッパーネットワーク
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
ビッグデータから人々のムードを捉える #yjtc
ビッグデータから人々のムードを捉える #yjtc
Yahoo!デベロッパーネットワーク
サイエンス領域におけるMLOpsの取り組み #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
Yahoo!デベロッパーネットワーク
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo!デベロッパーネットワーク
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo!デベロッパーネットワーク
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
Yahoo!デベロッパーネットワーク
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
Yahoo!デベロッパーネットワーク
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
Yahoo!デベロッパーネットワーク
「新しいおうち探し」のためのAIアシスト検索 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
Yahoo!デベロッパーネットワーク
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
Yahoo!デベロッパーネットワーク
More from Yahoo!デベロッパーネットワーク
(20)
ゼロから始める転移学習
ゼロから始める転移学習
継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッション
LakeTahoe
LakeTahoe
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Persistent-memory-native Database High-availability Feature
Persistent-memory-native Database High-availability Feature
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
eコマースと実店舗の相互利益を目指したデザイン #yjtc
eコマースと実店舗の相互利益を目指したデザイン #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
ビッグデータから人々のムードを捉える #yjtc
ビッグデータから人々のムードを捉える #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
既存アプリのiOS8対応 #ios8yahoo
1.
既存アプリの iOS8対応 Mao
Nishi
2.
今日話すこと • 今回のiOS8対応範囲
• ヤフオク!アプリで起きた問題 • Extension Today対応 • 掛かった工数 • ユーザの反響
3.
ヤフオク!アプリについて
4.
5.
ヤフオク!アプリについて • iPhone版
• 2010年10月リリース(当時はiOS4.1) • コード上でUI部品を生成している箇所多数 • iPad版 • 2013年12月リリース • xib、storyboardは当然活用
6.
今回のiOS8対応範囲について
7.
ヤフオク!アプリの iOS8対応の範囲 iOS8での正常動
作を目指す iOS8独自機能 (Extentionなどを 搭載) iPhone6/iPhone6 Plus向けにレイア ウトする iPhone/iPad 対応済み! 対応済み! これから
8.
ヤフオク!アプリの iOS8対応の範囲 iOS8での正常動
作を目指す iOS8独自機能 (Extentionなどを 搭載) iPhone6/iPhone6 Plus向けにレイア ウトする iPhone/iPad 対応済み! 対応済み! これから
9.
iOS8対応時に出会った事象・ 不具合等を紹介します
10.
これからiOS8対応にあたられる 方の参考になればと思います
11.
CASE 1 回転時にレイアウトが崩れる
12.
とりあえずビルドして 動かしてみた
13.
期待する動き
14.
予期しない動き
15.
回せば回すほど.. レイアウトが崩れていく事態に
16.
原因 [[UIScreen mainScreen]
applicationFrame];
17.
原因 CGRect appFrame
= [[UIScreen mainScreen] applicationFrame]; /* 以下はiOS8からは端末の向きによって返却される値が変わるようになった*/ CGFloat height = appFrame.size.height; CGFloat width = appFrame.size.width;
18.
iOS7でのheightとwidth height width
width height 長い方がheightという 前提でも成り立つ
19.
iOS8でのheightとwidth height height
width width 長い方がheightという 前提でコードを 書いてしまっていた
20.
端末の向きにってheight、width に変化があるメソッド •
[[UIScreen mainScreen] applicationFrame]; • [[UIScreen mainScreen] bounds]; • [[UIApplication sharedApplication] statusBarFrame]; これらを使っている箇所は見直しましょう
21.
回転検知時に呼ばれる処理も変更 - (void)willRotateToInterfaceOrientation:
(UIInterfaceOrientation)toInterfaceOrientatio n duration:(NSTimeInterval)duration;
22.
回転検知時に呼ばれる処理も変更 - (void)willRotateToInterfaceOrientation:
(UIInterfaceOrientation)toInterfaceOrientatio n duration:(NSTimeInterval)duration; - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coord inator; 回転検知ではなく、サイズが変更されたと考える
23.
実際の対応内容 //iOS7以前の画面回転開始時の処理 -
(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation duration: (NSTimeInterval)duration { //端末の向き取得 BOOL isLandscape = UIInterfaceOrientationIsLandscape(toInterfaceOrientation); //以降width、heightを取得して回転後の座標位置変更処理を行う }
24.
実際の対応内容 //iOS7以前の画面回転開始時の処理 -
(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation duration: (NSTimeInterval)duration { //端末の向き取得 BOOL isLandscape = UIInterfaceOrientationIsLandscape(toInterfaceOrientation); //以降width、heightを取得して回転後の座標位置変更処理を行う } ! //iOS8以降のサイズ変更時(回転時)の処理 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator: (id<UIViewControllerTransitionCoordinator>)coordinator { //端末の向き取得 BOOL isLandscape = (size.height <= size.width); //以降width、heightを取得して回転後の座標位置変更処理を行う }
25.
実際の対応内容 //iOS7以前の画面回転開始時の処理 -
(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation duration: (NSTimeInterval)duration { //端末の向き取得 BOOL isLandscape = UIInterfaceOrientationIsLandscape(toInterfaceOrientation); //以降width、heightを取得して回転後の座標位置変更処理を行う } ! //iOS8以降のサイズ変更時(回転時)の処理 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator: (id<UIViewControllerTransitionCoordinator>)coordinator { //端末の向き取得 BOOL isLandscape = (size.height <= size.width); //以降width、heightを取得して回転後の座標位置変更処理を行う }
26.
CASE 2 罫線の左が切れる
27.
罫線の左側が切れる問題
28.
iOS7対応の時に行った処理 [UITableViewCell appearance].separatorInset
= UIEdgeInsetsZero;
29.
iOS8の新しいプロパティlayoutMargins によりマージンが設定されている (lldb)
p (UIEdgeInsets)[self.tableView layoutMargins] (UIEdgeInsets) $1 = (top = 0, left = 16, bottom = 0, right = 16)
30.
コンテンツのマージン 設定をオフにする -(void)viewDidLayoutSubviews
{ [super viewDidLayoutSubviews]; self.tableView.layoutMargins = UIEdgeInsetsZero; }
31.
コンテンツのマージン 設定をオフにする -(void)viewDidLayoutSubviews
{ [super viewDidLayoutSubviews]; self.tableView.layoutMargins = UIEdgeInsetsZero; }
32.
コンテンツのマージン 設定をオフにする -(void)viewDidLayoutSubviews
{ [super viewDidLayoutSubviews]; self.tableView.layoutMargins = UIEdgeInsetsZero; }
33.
CASE 3 デバイストークンが
取得できない
34.
デバイストークン取得処理変更 [[UIApplication sharedApplication]
registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound| UIRemoteNotificationTypeAlert)];
35.
デバイストークン取得処理変更 [[UIApplication sharedApplication]
registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound| UIRemoteNotificationTypeAlert)];
36.
デバイストークン取得処理変更 //通知タイプの設定 UIUserNotificationType
types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; ! UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; ! [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; ! //Push通知の利用許可をとる [[UIApplication sharedApplication] registerForRemoteNotifications]; iOSバージョン毎に処理を分岐する必要がある
37.
デバイストークン取得処理変更 //通知タイプの設定 UIUserNotificationType
types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; ! UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; ! [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; ! //Push通知の利用許可をとる [[UIApplication sharedApplication] registerForRemoteNotifications];
38.
デバイストークン取得処理変更 //通知タイプの設定 UIUserNotificationType
types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; ! UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; ! [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; ! //Push通知の利用許可をとる [[UIApplication sharedApplication] registerForRemoteNotifications];
39.
デバイストークン取得処理変更 //通知タイプの設定 UIUserNotificationType
types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; ! UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; ! [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; ! //Push通知の利用許可をとる [[UIApplication sharedApplication] registerForRemoteNotifications];
40.
デバイストークン取得処理変更 //通知タイプの設定 UIUserNotificationType
types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; ! UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; ! [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; ! //Push通知の利用許可をとる [[UIApplication sharedApplication] registerForRemoteNotifications];
41.
デバイストークン取得処理変更 //通知タイプの設定 UIUserNotificationType
types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; ! UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; ! [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; ! //Push通知の利用許可をとる [[UIApplication sharedApplication] registerForRemoteNotifications]; iOSバージョン毎に処理を分岐する必要がある
42.
OSバージョンで分岐させてます + (void)registerNotification
{ //iOS8とそれ以外で設定を変更する必要がある if ([YJUtil isIOS8]){ [AucNotificationConfigure registerNotificationAfteriOS8]; } else { [AucNotificationConfigure registerNotificationBeforeiOS7]; } }
43.
InteractiveなPushにも 対応しています
44.
+ (void)registerNotificationAfteriOS8 {
UIMutableUserNotificationAction *bidAction = [[UIMutableUserNotificationAction alloc] init]; bidAction.identifier = XXXXXXX; bidAction.title = @"入札する"; bidAction.activationMode = UIUserNotificationActivationModeForeground; bidAction.destructive = NO; bidAction.authenticationRequired = NO; UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init]; inviteCategory.identifier = XXXXXXX; [inviteCategory setActions:@[bidAction] forContext:UIUserNotificationActionContextMinimal]; //通知タイプの設定 UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; NSSet *categories = [NSSet setWithObject:inviteCategory]; UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:categories]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; //Push通知の利用許可をとる [[UIApplication sharedApplication] registerForRemoteNotifications]; } iOS8以後の処理
45.
+ (void)registerNotificationAfteriOS8 {
UIMutableUserNotificationAction *bidAction = [[UIMutableUserNotificationAction alloc] init]; bidAction.identifier = XXXXXXX; bidAction.title = @"入札する"; bidAction.activationMode = UIUserNotificationActivationModeForeground; bidAction.destructive = NO; bidAction.authenticationRequired = NO; UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init]; inviteCategory.identifier = XXXXXXX; [inviteCategory setActions:@[bidAction] forContext:UIUserNotificationActionContextMinimal]; //通知タイプの設定 UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; NSSet *categories = [NSSet setWithObject:inviteCategory]; UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:categories]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; //Push通知の利用許可をとる [[UIApplication sharedApplication] registerForRemoteNotifications]; } iOS8以後の処理
46.
+ (void)registerNotificationAfteriOS8 {
UIMutableUserNotificationAction *bidAction = [[UIMutableUserNotificationAction alloc] init]; bidAction.identifier = XXXXXXX; bidAction.title = @"入札する"; bidAction.activationMode = UIUserNotificationActivationModeForeground; bidAction.destructive = NO; bidAction.authenticationRequired = NO; UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init]; inviteCategory.identifier = XXXXXXX; [inviteCategory setActions:@[bidAction] forContext:UIUserNotificationActionContextMinimal]; //通知タイプの設定 UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; NSSet *categories = [NSSet setWithObject:inviteCategory]; UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:categories]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; //Push通知の利用許可をとる [[UIApplication sharedApplication] registerForRemoteNotifications]; } iOS8以後の処理
47.
CASE 4 iPadでカメラが反応しない
48.
iPadでカメラ撮影する時 UIImagePickerController *
picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeCamera; ! [self presentViewController:picker animated:YES completion:nil];
49.
iPadでカメラ撮影する時 UIImagePickerController *
picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeCamera; ! [self presentViewController:picker animated:YES completion:nil];
50.
iPadでカメラ撮影する時 UIImagePickerController *
picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeCamera; ! dispatch_async(dispatch_get_main_queue(), ^ { [self presentViewController:picker animated:YES completion:nil]; 非同期で起動しないと固まってしまう });
51.
iPadでカメラ撮影する時 UIImagePickerController *
picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeCamera; ! dispatch_async(dispatch_get_main_queue(), ^ { [self presentViewController:picker animated:YES completion:nil]; 非同期で起動しないと固まってしまう });
52.
iPadでカメラ撮影する時 UIImagePickerController *
picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeCamera; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { dispatch_async(dispatch_get_main_queue(), ^ { [self presentViewController:picker animated:YES completion:nil]; }); } else { [self presentViewController:picker animated:YES completion:nil]; } 非同期で起動しないと固まってしまう
53.
iPadでアルバムから写真を選 択する際も同様
54.
iPadでアルバムから写真を選択する際も同様 UIImagePickerController *imagePickerController
= [[UIImagePickerController alloc]init]; imagePickerController.delegate = self; imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; ! self.popover = [[UIPopoverController alloc] initWithContentViewController: imagePickerController]; self.popover.delegate = self; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { dispatch_async(dispatch_get_main_queue(), ^ { [self.popover presentPopoverFromRect:cell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; }); } else { [self.popover presentPopoverFromRect:cell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } 非同期で起動しないと固まってしまう
55.
iPadでアルバムから写真を選択する際も同様 UIImagePickerController *imagePickerController
= [[UIImagePickerController alloc]init]; imagePickerController.delegate = self; imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; ! self.popover = [[UIPopoverController alloc] initWithContentViewController: imagePickerController]; self.popover.delegate = self; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { dispatch_async(dispatch_get_main_queue(), ^ { [self.popover presentPopoverFromRect:cell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; }); } else { [self.popover presentPopoverFromRect:cell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } 非同期で起動しないと固まってしまう
56.
iPadでアルバムから写真を選択する際も同様 UIImagePickerController *imagePickerController
= [[UIImagePickerController alloc]init]; imagePickerController.delegate = self; imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; ! self.popover = [[UIPopoverController alloc] initWithContentViewController: imagePickerController]; self.popover.delegate = self; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { dispatch_async(dispatch_get_main_queue(), ^ { [self.popover presentPopoverFromRect:cell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; }); } else { [self.popover presentPopoverFromRect:cell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } 非同期で起動しないと固まってしまう
57.
iPadでアルバムから写真を選択する際も同様 UIImagePickerController *imagePickerController
= [[UIImagePickerController alloc]init]; imagePickerController.delegate = self; imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; ! self.popover = [[UIPopoverController alloc] initWithContentViewController: imagePickerController]; self.popover.delegate = self; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { dispatch_async(dispatch_get_main_queue(), ^ { [self.popover presentPopoverFromRect:cell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; }); } else { [self.popover presentPopoverFromRect:cell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } 非同期で起動しないと固まってしまう
58.
CASE 5 タブ画像が表示されない
59.
タブ画像が表示されない問題
60.
- (void)setFinishedSelectedImage:(UIImage *)selectedImage
withFinishedUnselectedImage:(UIImage *)unselectedImage;
61.
setFinishedSelectedImageはDepricated - (void)setFinishedSelectedImage:(UIImage
*)selectedImage withFinishedUnselectedImage:(UIImage *)unselectedImage;
62.
setFinishedSelectedImageはDepricated UIImage *m1
= [[UIImage imageNamed:@"m1.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; ! UIImage *m2 = [[UIImage imageNamed:@"m2.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; ! UITabBarItem *tab = [[UITabBarItem alloc] initWithTitle:@"" image:m1 selectedImage:m2];
63.
setFinishedSelectedImageはDepricated UIImage *m1
= [[UIImage imageNamed:@"m1.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; ! UIImage *m2 = [[UIImage imageNamed:@"m2.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; ! UITabBarItem *tab = [[UITabBarItem alloc] initWithTitle:@"" image:m1 selectedImage:m2];
64.
setFinishedSelectedImageはDepricated UIImage *m1
= [[UIImage imageNamed:@"m1.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; ! UIImage *m2 = [[UIImage imageNamed:@"m2.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; ! UITabBarItem *tab = [[UITabBarItem alloc] initWithTitle:@"" image:m1 selectedImage:m2]; UIImageRenderingModeAlwaysOriginalと共に生成する
65.
CASE 6 Extentionの共通ロジックどうする
問題
66.
アプリ本体とExtentionで 利用する共通部品クラスにおいて [UIApplication
sharedApplication] が使われているメソッドがある 色々な事情で共通部品クラスに 大きな修正を加えることができませんでした
67.
+ (UIApplication *)sharedApplication
NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead."); NS_EXTENSION_UNAVAILABLE_IOS のメソッドはExtention内では利用できない
68.
どうするべきか ! !
// 特定のアプリを起動する void launchXXXXX(NSString* message) { NSString* url = [NSString stringWithFormat: @"%@://XXXXX/?message=%@", kXXXXSchemes, message]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]]; } !
69.
Preprocessor Macroを使う方法 #ifndef
AUC_WIDGET ! // 特定のアプリを起動する void launchXXXXX(NSString* message) { NSString* url = [NSString stringWithFormat: @"%@://XXXXX/?message=%@", kXXXXSchemes, message]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]]; } #endif
70.
Preprocessor Macroを使う方法 #ifndef
AUC_WIDGET ! // 特定のアプリを起動する void launchXXXXX(NSString* message) { NSString* url = [NSString stringWithFormat: @"%@://XXXXX/?message=%@", kXXXXSchemes, message]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]]; } #endif できるだけ共通部品から取り除くべきですが、 一手段として参考にしてください
71.
ExtentionのPreprocessor Macroの設定例
72.
Extention Today対応
73.
74.
Extention Todayについて •
ガイドライン上、スクロールできるUIはユーザに とって好ましくないとの記述がある • ヤフオク!では入札中の商品を一覧できるExtention Todayを作成したかった • 一覧から入札できればなお良い(でもウィジェッ トではキーボードは利用できない)
75.
76.
77.
78.
79.
80.
81.
iOS8対応に 掛かった工数
82.
iOS8対応に掛かった工数(iPhone) iOS8での不具合 修正
ウィジェット 作成合計 制作ー3人日3人日 開発4人日4人日8人日
83.
iOS8対応に掛かった工数(iPad) iOS8での不具合 修正
ウィジェット 作成合計 制作ー0.5人日0.5人日 開発3人日1人日4人日
84.
開発工数 iOS7対応>>>>>iOS8対応>iOS6対応
85.
リリース後の反響
86.
87.
88.
89.
最後に
90.
http://topic.auctions.yahoo.co.jp/promo/hr/p/
91.
http://topic.auctions.yahoo.co.jp/promo/hr/p/
Download now