SlideShare a Scribd company logo
1 of 91
Download to read offline
既存アプリの 
iOS8対応 
Mao Nishi
今日話すこと 
• 今回のiOS8対応範囲 
• ヤフオク!アプリで起きた問題 
• Extension Today対応 
• 掛かった工数 
• ユーザの反響
ヤフオク!アプリについて
ヤフオク!アプリについて 
• iPhone版 
• 2010年10月リリース(当時はiOS4.1) 
• コード上でUI部品を生成している箇所多数 
• iPad版 
• 2013年12月リリース 
• xib、storyboardは当然活用
今回のiOS8対応範囲について
ヤフオク!アプリの 
iOS8対応の範囲 
iOS8での正常動 
作を目指す 
iOS8独自機能 
(Extentionなどを 
搭載) 
iPhone6/iPhone6 
Plus向けにレイア 
ウトする 
iPhone/iPad 対応済み! 対応済み! これから
ヤフオク!アプリの 
iOS8対応の範囲 
iOS8での正常動 
作を目指す 
iOS8独自機能 
(Extentionなどを 
搭載) 
iPhone6/iPhone6 
Plus向けにレイア 
ウトする 
iPhone/iPad 対応済み! 対応済み! これから
iOS8対応時に出会った事象・ 
不具合等を紹介します
これからiOS8対応にあたられる 
方の参考になればと思います
CASE 1 
回転時にレイアウトが崩れる
とりあえずビルドして 
動かしてみた
期待する動き
予期しない動き
回せば回すほど.. 
レイアウトが崩れていく事態に
原因 
[[UIScreen mainScreen] applicationFrame];
原因 
CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 
/* 以下はiOS8からは端末の向きによって返却される値が変わるようになった*/ 
CGFloat height = appFrame.size.height; 
CGFloat width = appFrame.size.width;
iOS7でのheightとwidth 
height 
width 
width height 
長い方がheightという 
前提でも成り立つ
iOS8でのheightとwidth 
height 
height 
width width 
長い方がheightという 
前提でコードを 
書いてしまっていた
端末の向きにってheight、width 
に変化があるメソッド 
• [[UIScreen mainScreen] applicationFrame]; 
• [[UIScreen mainScreen] bounds]; 
• [[UIApplication sharedApplication] statusBarFrame]; 
これらを使っている箇所は見直しましょう
回転検知時に呼ばれる処理も変更 
- (void)willRotateToInterfaceOrientation: 
(UIInterfaceOrientation)toInterfaceOrientatio 
n duration:(NSTimeInterval)duration;
回転検知時に呼ばれる処理も変更 
- (void)willRotateToInterfaceOrientation: 
(UIInterfaceOrientation)toInterfaceOrientatio 
n duration:(NSTimeInterval)duration; 
- (void)viewWillTransitionToSize:(CGSize)size 
withTransitionCoordinator:(id 
<UIViewControllerTransitionCoordinator>)coord 
inator; 
回転検知ではなく、サイズが変更されたと考える
実際の対応内容 
//iOS7以前の画面回転開始時の処理 
- (void)willRotateToInterfaceOrientation: 
(UIInterfaceOrientation)toInterfaceOrientation duration: 
(NSTimeInterval)duration 
{ 
//端末の向き取得 
BOOL isLandscape = 
UIInterfaceOrientationIsLandscape(toInterfaceOrientation); 
//以降width、heightを取得して回転後の座標位置変更処理を行う 
}
実際の対応内容 
//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を取得して回転後の座標位置変更処理を行う 
}
実際の対応内容 
//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を取得して回転後の座標位置変更処理を行う 
}
CASE 2 
罫線の左が切れる
罫線の左側が切れる問題
iOS7対応の時に行った処理 
[UITableViewCell appearance].separatorInset = 
UIEdgeInsetsZero;
iOS8の新しいプロパティlayoutMargins 
によりマージンが設定されている 
(lldb) p (UIEdgeInsets)[self.tableView layoutMargins] 
(UIEdgeInsets) $1 = (top = 0, left = 16, bottom = 0, 
right = 16)
コンテンツのマージン 
設定をオフにする 
-(void)viewDidLayoutSubviews 
{ 
[super viewDidLayoutSubviews]; 
self.tableView.layoutMargins = UIEdgeInsetsZero; 
}
コンテンツのマージン 
設定をオフにする 
-(void)viewDidLayoutSubviews 
{ 
[super viewDidLayoutSubviews]; 
self.tableView.layoutMargins = UIEdgeInsetsZero; 
}
コンテンツのマージン 
設定をオフにする 
-(void)viewDidLayoutSubviews 
{ 
[super viewDidLayoutSubviews]; 
self.tableView.layoutMargins = UIEdgeInsetsZero; 
}
CASE 3 
デバイストークンが 
取得できない
デバイストークン取得処理変更 
[[UIApplication sharedApplication] 
registerForRemoteNotificationTypes: 
(UIRemoteNotificationTypeBadge| 
UIRemoteNotificationTypeSound| 
UIRemoteNotificationTypeAlert)];
デバイストークン取得処理変更 
[[UIApplication sharedApplication] 
registerForRemoteNotificationTypes: 
(UIRemoteNotificationTypeBadge| 
UIRemoteNotificationTypeSound| 
UIRemoteNotificationTypeAlert)];
デバイストークン取得処理変更 
//通知タイプの設定 
UIUserNotificationType types = UIUserNotificationTypeBadge | 
UIUserNotificationTypeSound | UIUserNotificationTypeAlert; 
! 
UIUserNotificationSettings *settings = [UIUserNotificationSettings 
settingsForTypes:types categories:nil]; 
! 
[[UIApplication sharedApplication] 
registerUserNotificationSettings:settings]; 
! 
//Push通知の利用許可をとる 
[[UIApplication sharedApplication] registerForRemoteNotifications]; 
iOSバージョン毎に処理を分岐する必要がある
デバイストークン取得処理変更 
//通知タイプの設定 
UIUserNotificationType types = UIUserNotificationTypeBadge | 
UIUserNotificationTypeSound | UIUserNotificationTypeAlert; 
! 
UIUserNotificationSettings *settings = [UIUserNotificationSettings 
settingsForTypes:types categories:nil]; 
! 
[[UIApplication sharedApplication] 
registerUserNotificationSettings:settings]; 
! 
//Push通知の利用許可をとる 
[[UIApplication sharedApplication] registerForRemoteNotifications];
デバイストークン取得処理変更 
//通知タイプの設定 
UIUserNotificationType types = UIUserNotificationTypeBadge | 
UIUserNotificationTypeSound | UIUserNotificationTypeAlert; 
! 
UIUserNotificationSettings *settings = [UIUserNotificationSettings 
settingsForTypes:types categories:nil]; 
! 
[[UIApplication sharedApplication] 
registerUserNotificationSettings:settings]; 
! 
//Push通知の利用許可をとる 
[[UIApplication sharedApplication] registerForRemoteNotifications];
デバイストークン取得処理変更 
//通知タイプの設定 
UIUserNotificationType types = UIUserNotificationTypeBadge | 
UIUserNotificationTypeSound | UIUserNotificationTypeAlert; 
! 
UIUserNotificationSettings *settings = [UIUserNotificationSettings 
settingsForTypes:types categories:nil]; 
! 
[[UIApplication sharedApplication] 
registerUserNotificationSettings:settings]; 
! 
//Push通知の利用許可をとる 
[[UIApplication sharedApplication] registerForRemoteNotifications];
デバイストークン取得処理変更 
//通知タイプの設定 
UIUserNotificationType types = UIUserNotificationTypeBadge | 
UIUserNotificationTypeSound | UIUserNotificationTypeAlert; 
! 
UIUserNotificationSettings *settings = [UIUserNotificationSettings 
settingsForTypes:types categories:nil]; 
! 
[[UIApplication sharedApplication] 
registerUserNotificationSettings:settings]; 
! 
//Push通知の利用許可をとる 
[[UIApplication sharedApplication] registerForRemoteNotifications];
デバイストークン取得処理変更 
//通知タイプの設定 
UIUserNotificationType types = UIUserNotificationTypeBadge | 
UIUserNotificationTypeSound | UIUserNotificationTypeAlert; 
! 
UIUserNotificationSettings *settings = [UIUserNotificationSettings 
settingsForTypes:types categories:nil]; 
! 
[[UIApplication sharedApplication] 
registerUserNotificationSettings:settings]; 
! 
//Push通知の利用許可をとる 
[[UIApplication sharedApplication] registerForRemoteNotifications]; 
iOSバージョン毎に処理を分岐する必要がある
OSバージョンで分岐させてます 
+ (void)registerNotification 
{ 
//iOS8とそれ以外で設定を変更する必要がある 
if ([YJUtil isIOS8]){ 
[AucNotificationConfigure registerNotificationAfteriOS8]; 
} else { 
[AucNotificationConfigure registerNotificationBeforeiOS7]; 
} 
}
InteractiveなPushにも 
対応しています
+ (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以後の処理
+ (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以後の処理
+ (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以後の処理
CASE 4 
iPadでカメラが反応しない
iPadでカメラ撮影する時 
UIImagePickerController * picker = [[UIImagePickerController alloc] init]; 
picker.delegate = self; 
picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
! 
[self presentViewController:picker animated:YES completion:nil];
iPadでカメラ撮影する時 
UIImagePickerController * picker = [[UIImagePickerController alloc] init]; 
picker.delegate = self; 
picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
! 
[self presentViewController:picker animated:YES completion:nil];
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]; 
非同期で起動しないと固まってしまう 
});
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]; 
非同期で起動しないと固まってしまう 
});
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]; 
} 
非同期で起動しないと固まってしまう
iPadでアルバムから写真を選 
択する際も同様
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]; 
} 
非同期で起動しないと固まってしまう
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]; 
} 
非同期で起動しないと固まってしまう
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]; 
} 
非同期で起動しないと固まってしまう
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]; 
} 
非同期で起動しないと固まってしまう
CASE 5 
タブ画像が表示されない
タブ画像が表示されない問題
- (void)setFinishedSelectedImage:(UIImage *)selectedImage 
withFinishedUnselectedImage:(UIImage *)unselectedImage;
setFinishedSelectedImageはDepricated 
- (void)setFinishedSelectedImage:(UIImage *)selectedImage 
withFinishedUnselectedImage:(UIImage *)unselectedImage;
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];
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];
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と共に生成する
CASE 6 
Extentionの共通ロジックどうする 
問題
アプリ本体とExtentionで 
利用する共通部品クラスにおいて 
[UIApplication sharedApplication] 
が使われているメソッドがある 
色々な事情で共通部品クラスに 
大きな修正を加えることができませんでした
+ (UIApplication *)sharedApplication 
NS_EXTENSION_UNAVAILABLE_IOS("Use view 
controller based solutions where 
appropriate instead."); 
NS_EXTENSION_UNAVAILABLE_IOS 
のメソッドはExtention内では利用できない
どうするべきか 
! 
! 
// 特定のアプリを起動する 
void launchXXXXX(NSString* message) 
{ 
NSString* url = [NSString stringWithFormat: 
@"%@://XXXXX/?message=%@", kXXXXSchemes, message]; 
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]]; 
} 
!
Preprocessor Macroを使う方法 
#ifndef AUC_WIDGET 
! 
// 特定のアプリを起動する 
void launchXXXXX(NSString* message) 
{ 
NSString* url = [NSString stringWithFormat: 
@"%@://XXXXX/?message=%@", kXXXXSchemes, message]; 
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]]; 
} 
#endif
Preprocessor Macroを使う方法 
#ifndef AUC_WIDGET 
! 
// 特定のアプリを起動する 
void launchXXXXX(NSString* message) 
{ 
NSString* url = [NSString stringWithFormat: 
@"%@://XXXXX/?message=%@", kXXXXSchemes, message]; 
[[UIApplication sharedApplication] openURL:[NSURL 
URLWithString:url]]; 
} 
#endif 
できるだけ共通部品から取り除くべきですが、 
一手段として参考にしてください
ExtentionのPreprocessor Macroの設定例
Extention Today対応
Extention Todayについて 
• ガイドライン上、スクロールできるUIはユーザに 
とって好ましくないとの記述がある 
• ヤフオク!では入札中の商品を一覧できるExtention 
Todayを作成したかった 
• 一覧から入札できればなお良い(でもウィジェッ 
トではキーボードは利用できない)
iOS8対応に 
掛かった工数
iOS8対応に掛かった工数(iPhone) 
iOS8での不具合 
修正 
ウィジェット 
作成合計 
制作ー3人日3人日 
開発4人日4人日8人日
iOS8対応に掛かった工数(iPad) 
iOS8での不具合 
修正 
ウィジェット 
作成合計 
制作ー0.5人日0.5人日 
開発3人日1人日4人日
開発工数 
iOS7対応>>>>>iOS8対応>iOS6対応
リリース後の反響
最後に
http://topic.auctions.yahoo.co.jp/promo/hr/p/
http://topic.auctions.yahoo.co.jp/promo/hr/p/

More Related Content

What's hot

Css nite(2010.09.23)
Css nite(2010.09.23)Css nite(2010.09.23)
Css nite(2010.09.23)
Yoshiki Ushida
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
 

What's hot (20)

NSNotification in Swift #cocoa_kansai
NSNotification in Swift #cocoa_kansaiNSNotification in Swift #cocoa_kansai
NSNotification in Swift #cocoa_kansai
 
Swift 3 その基本ルールを眺める #cswift
Swift 3 その基本ルールを眺める #cswiftSwift 3 その基本ルールを眺める #cswift
Swift 3 その基本ルールを眺める #cswift
 
Swift ドキュメントコメント
Swift ドキュメントコメントSwift ドキュメントコメント
Swift ドキュメントコメント
 
Swift入門
Swift入門Swift入門
Swift入門
 
Study Swift
Study Swift Study Swift
Study Swift
 
Swift 構造体の時代 #yidev
Swift 構造体の時代 #yidevSwift 構造体の時代 #yidev
Swift 構造体の時代 #yidev
 
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidevSwift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
 
Xcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhiosXcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhios
 
iOS豆知識ver0.0.5
iOS豆知識ver0.0.5iOS豆知識ver0.0.5
iOS豆知識ver0.0.5
 
Android カスタムROMの作り方
Android カスタムROMの作り方Android カスタムROMの作り方
Android カスタムROMの作り方
 
はじめてのiOSアプリ開発 ①
はじめてのiOSアプリ開発 ①はじめてのiOSアプリ開発 ①
はじめてのiOSアプリ開発 ①
 
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftSwift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswift
 
Core Image Tips & Tricks in iOS 9
Core Image Tips & Tricks in iOS 9Core Image Tips & Tricks in iOS 9
Core Image Tips & Tricks in iOS 9
 
【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
iPhoneアプリ開発の歩き方〜Swift編〜
iPhoneアプリ開発の歩き方〜Swift編〜iPhoneアプリ開発の歩き方〜Swift編〜
iPhoneアプリ開発の歩き方〜Swift編〜
 
Swiftアプリ制作入門 かんたんシューティングゲーム
Swiftアプリ制作入門 かんたんシューティングゲームSwiftアプリ制作入門 かんたんシューティングゲーム
Swiftアプリ制作入門 かんたんシューティングゲーム
 
はじめてのAndroid開発
はじめてのAndroid開発はじめてのAndroid開発
はじめてのAndroid開発
 
Css nite(2010.09.23)
Css nite(2010.09.23)Css nite(2010.09.23)
Css nite(2010.09.23)
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 

Viewers also liked (6)

虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
 
iOS8勉強会@Yahoo! JAPAN "Document Provider"
iOS8勉強会@Yahoo! JAPAN "Document Provider"iOS8勉強会@Yahoo! JAPAN "Document Provider"
iOS8勉強会@Yahoo! JAPAN "Document Provider"
 
Ios8yahoo swift-json
Ios8yahoo swift-jsonIos8yahoo swift-json
Ios8yahoo swift-json
 
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
 
iOS 8/Swift エンジニア勉強会@ヤフー
iOS 8/Swift エンジニア勉強会@ヤフーiOS 8/Swift エンジニア勉強会@ヤフー
iOS 8/Swift エンジニア勉強会@ヤフー
 
大人のHomekit
大人のHomekit大人のHomekit
大人のHomekit
 

Similar to 既存アプリのiOS8対応 #ios8yahoo

20121201yidev hirobe iPad miniでRetina
20121201yidev hirobe iPad miniでRetina20121201yidev hirobe iPad miniでRetina
20121201yidev hirobe iPad miniでRetina
Kazuya Hirobe
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
Nobuhiro Sue
 
App extension for iOS
App extension for iOSApp extension for iOS
App extension for iOS
toyship
 
第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会
codeal
 

Similar to 既存アプリのiOS8対応 #ios8yahoo (20)

きちんと理解できるiOS開発〜Auto Layout編
きちんと理解できるiOS開発〜Auto Layout編きちんと理解できるiOS開発〜Auto Layout編
きちんと理解できるiOS開発〜Auto Layout編
 
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
 
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
20121201yidev hirobe iPad miniでRetina
20121201yidev hirobe iPad miniでRetina20121201yidev hirobe iPad miniでRetina
20121201yidev hirobe iPad miniでRetina
 
20151130 Apple Pencilを使う
20151130 Apple Pencilを使う20151130 Apple Pencilを使う
20151130 Apple Pencilを使う
 
iOS 6 のAuto Rotation
iOS 6 のAuto RotationiOS 6 のAuto Rotation
iOS 6 のAuto Rotation
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
 
iOS 7 対応事例 FastCheckin
iOS 7 対応事例 FastCheckiniOS 7 対応事例 FastCheckin
iOS 7 対応事例 FastCheckin
 
Ncmb勉強会 #8 cocos2d x 資料「Cocos2d-xとNCMBを組み合わせるには」
Ncmb勉強会 #8 cocos2d x 資料「Cocos2d-xとNCMBを組み合わせるには」Ncmb勉強会 #8 cocos2d x 資料「Cocos2d-xとNCMBを組み合わせるには」
Ncmb勉強会 #8 cocos2d x 資料「Cocos2d-xとNCMBを組み合わせるには」
 
やはりお前らのiOS7対応は間違っている
やはりお前らのiOS7対応は間違っているやはりお前らのiOS7対応は間違っている
やはりお前らのiOS7対応は間違っている
 
iOS13 SDK による 全機能置き換え Part1
iOS13 SDK による 全機能置き換え Part1iOS13 SDK による 全機能置き換え Part1
iOS13 SDK による 全機能置き換え Part1
 
App extension for iOS
App extension for iOSApp extension for iOS
App extension for iOS
 
Mapkitframework io9week
Mapkitframework io9weekMapkitframework io9week
Mapkitframework io9week
 
多分わかりやすいDurable functions
多分わかりやすいDurable functions多分わかりやすいDurable functions
多分わかりやすいDurable functions
 
JqueryMobile
JqueryMobileJqueryMobile
JqueryMobile
 
だいすきStoryboard - #potatotips (iOS/Android開発Tips共有会) 第7回
だいすきStoryboard - #potatotips (iOS/Android開発Tips共有会) 第7回だいすきStoryboard - #potatotips (iOS/Android開発Tips共有会) 第7回
だいすきStoryboard - #potatotips (iOS/Android開発Tips共有会) 第7回
 
第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会
 
Xamarin.Forms概要
Xamarin.Forms概要Xamarin.Forms概要
Xamarin.Forms概要
 
BaseViewControllerは作りたくない
BaseViewControllerは作りたくないBaseViewControllerは作りたくない
BaseViewControllerは作りたくない
 

More from Yahoo!デベロッパーネットワーク

More from Yahoo!デベロッパーネットワーク (20)

ゼロから始める転移学習
ゼロから始める転移学習ゼロから始める転移学習
ゼロから始める転移学習
 
継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator
 
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるかヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
 
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッションオンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッション
 
LakeTahoe
LakeTahoeLakeTahoe
LakeTahoe
 
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜オンプレ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 FeaturePersistent-memory-native Database High-availability Feature
Persistent-memory-native Database High-availability Feature
 
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
 
eコマースと実店舗の相互利益を目指したデザイン #yjtc
eコマースと実店舗の相互利益を目指したデザイン #yjtceコマースと実店舗の相互利益を目指したデザイン #yjtc
eコマースと実店舗の相互利益を目指したデザイン #yjtc
 
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtcヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
 
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtcYahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
 
ビッグデータから人々のムードを捉える #yjtc
ビッグデータから人々のムードを捉える #yjtcビッグデータから人々のムードを捉える #yjtc
ビッグデータから人々のムードを捉える #yjtc
 
サイエンス領域におけるMLOpsの取り組み #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtcサイエンス領域におけるMLOpsの取り組み #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
 
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtcヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
 
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtcYahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
 
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
 
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtcPC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
 
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtcモブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
 
「新しいおうち探し」のためのAIアシスト検索 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc「新しいおうち探し」のためのAIアシスト検索 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
 
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtcユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
 

既存アプリのiOS8対応 #ios8yahoo