>100 Views
April 15, 16
スライド概要
http://yahoo-ds-event.connpass.com/event/24511/
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
変化と戦うロガー開発 (iOS App Extensions編) ヤフー株式会社 D&S本部ソリューション本部 手塚 賢太郎
自己紹介 てづか けんたろう 手塚 賢太郎
自己紹介 入社3年目 iOSエンジニア
本日ご紹介するのは iOSアプリ向け 汎用クラス作成時のTips
背景
主な担当業務 ロガー開発 (iOSアプリ用)
主な担当業務 ロガー開発 = ログを取得するための ライブラリ作り
ロガーの機能 データを取得して
ロガーの機能 データを送信する
ロガーの機能 データを送信する (だけ)
ロガー開発 It's so simple !
ロガー開発 but …
ロガー開発 「良いロガー」 には条件がありそう
見えてきた「良いロガー」 価値あるデータを見極められる 導入が「とても」簡単である て そし 変化に対応できる!
アプリをとりまく環境は 劇的に変化する
アプリ環境は劇的に変化する
アプリ事情は急激に変化する 知りたい指標 重要なデータ アプリが動作する環境 どんどん変化!
アプリ事情は急激に変化する 変化への対応が 大切そう!
最近大変だったのが
App Extensions
コレとか
コレとか コレとか
new! コレとか コレとか コ レ
Extensionsは大変! ※いちライブラリ開発者の感想です
ここが大変!App Extensions! 本体と同じコードだと 動かない
ここが大変!App Extensions! 種類がたくさん 微妙に仕様が違う (そしてどんどん増える)
最初に見た時
最近
ちょっとしたノウハウ 共有します 汎用クラスの作成時にぜひ!
Tips
Extension対応のコツ ビルドエラーを回避 Extensionの種類で条件分岐
Extension対応のコツ ビルドエラーを回避 Extensionの種類で条件分岐
ビルドエラーを回避 UIApplication *app = [UIApplication sharedApplication]; 本体アプリでよく書くコード
ビルドエラーを回避 UIApplication *app = [UIApplication sharedApplication]; NS̲EXTENSION̲UNAVAILABLE̲IOS()
ビルドエラーを回避 UIApplication *app = [UIApplication sharedApplication]; NS̲EXTENSION̲UNAVAILABLE̲IOS() Extensionではビルドエラー
ビルドエラーを回避 UIApplicationクラス と明示的に書かなければよいので…
ビルドエラーを回避 Class class = NSClassFromString(@“UIApplication"); if (class) { UIApplication *app = [class sharedApplication]; } NSClassFromString() で書く!
ビルドエラーを回避 Class class = NSClassFromString(@“UIApplication"); if (class) { UIApplication *app = [class sharedApplication]; } NSClassFromString() で書く!
Extension対応のコツ ビルドエラーを回避 Extensionの種類で条件分岐
Extensionの種類で条件分岐 Extensionは種類が沢山 処理を分けたい
Extensionの種類で条件分岐 Info.plistの参照が Good!
Extensionの種類で条件分岐 <key>NSExtension</key> <dict> <key>NSExtensionPointIdentifier</key> <string>ここに種類が書いてある</string> </dict>
Extensionの種類で条件分岐
NSString* extid = [[[[NSBundle mainBundle] infoDictionary]
valueForKey:@"NSExtension"]
valueForKey:@"NSExtensionPointIdentifier"];
if ([extid length] == 0) {
// 本体アプリです
} else if ([extid isEqualToString:@"com.apple.widget-extension"]) {
// Today Extensionです
} else if ([extid isEqualToString:@"com.apple.watchkit"]) {
// WatchKit Extensionです
}
Extensionの種類で条件分岐
NSString* extid = [[[[NSBundle mainBundle] infoDictionary]
valueForKey:@"NSExtension"]
valueForKey:@"NSExtensionPointIdentifier"];
if ([extid length] == 0) {
// 本体アプリです
} else if ([extid isEqualToString:@"com.apple.widget-extension"]) {
// Today Extensionです
} else if ([extid isEqualToString:@"com.apple.watchkit"]) {
// WatchKit Extensionです
}
まとめ NSClassFromString()でエラー回避 Info.plist見て条件分岐 Extension対応はバッチリ!
眼鏡Extension が来ても
ロボット Extension が来ても
楽 勝
汎用クラスをExtension対応して 来たるべき変化に備えよう! キイテクレテ アリガトォォォ