iOSとAndroidのtipsを語り合う #potatotips 第16回に行ってきた時のまとめ
16回目は渋谷のCyberAgent様の会場にて開催となりました。
今夜も様々な役に立つtipsが飛び交う勉強会となりました。
Glide信者から見たfacebook/fresco [Android]
- facebookが出したライブラリ
- FrescoはMVCのviewをライブラリに組み込んでいる
- ImageViewと同じ感じに使える
- コンセプト
- ImageViewを継承しているDraweeView
- コードを使うときはDraweeHierarchyを使う
- キャッシュの設定や、ディスクキャッシュの場所はImagePipelineを使う
- Drawee
- 角丸、左だけ角丸、右だけ角丸などXMLだけでできます。
- Animated Images
- GIFやWebPなども動く
- 画像のリサイズをして読み込むのも可能
- ControllerListenerが用意されていて、各イベントを受け取れる
- transformationに相当するのがPostprocessorになる
- ImagePipeline
- Jpegは精査的に読み込むが、ぼやけた状態から読み込むことができる
- キャッシュがどこにヒットしたかも見れる
- okhttpにも対応してます
- volleyのイメージローダー機能も合わせてサポートされてます
今からでも間に合うApple Watch用アプリ申請で気をつけること [iOS]
- apple watchはapple storeってというアプリで予約できると早い
- 本体アプリとWathのdataをどうわたすか
- openParentApplication:reply:とapplication:handleWatchKitExtensionRequest:を使う
- 本体アプリが死んでてもバックグラウンドで必ず使える
- 問題としては、何回も早く叩き続けると遅延したり、応答が帰ってこなかったりする。またWatchKitを必ず介さないといけない
- Darwin Notification Center -> MMWormholeというラッパーしたライブラリあります
- AppGroupsにデータ書いたので通知してるだけ
- 問題はAppleWatchがスクリーンONになってないと使えない
- リアルタイム制を重視してないと使えない
- open parantをやったほうがいいかも?
- HandOff
- 位置情報使うときはwatchkitを使う
- 本体用アプリよりも先にWatchが立ち上がったら許可を取らないといけないのでHandOffを使って誘導して下さい
- 現在地が表示されないので画像を作らないといけない
- viewにかんしてはgroupにしてhiddenを切り替える
- notificationは音とバイブしかならさない
- 手首を回すと通知が見れる
- 腕につけてないと通知来ません
- BundleNameとBundle display nameは用途が違うのでどっちも設定すること
- xcode 6.3で証明書をつけれるようになったが6.3で作ったほうがよさげ
- RealmはWatchKitと相性がいいです
リリース前の動作チェックってしてます?少しだけでも楽にしたい今日このごろ [Android]
- 昔良くあったパターンはdeploygateで配ったんで変更点ここで〜すとなげて、適当にざっくりチェックする。
- みんなまばらで、品質保証もバラバラ
- 改善したこと
- 隔週月曜に1回リリース
- リリース全集の水溶にコードフリーズ
- リリース前チェックシート
- 月曜10~20%, 火曜50%、水曜100%
- しかしチェックシートはめんどくさいが、ここで発覚する問題もある
- そこでらくするためにSpoonというライブラリを使う
- 接続済みデバイスのスクリーンショットをとってHTMLでいい感じに出力してくれます
- square性
- しかし非同期処理がうまくできないので5秒待ってスクショをとるようにしてみた
- まとめ
- リリース前チェックは大事
- スクショテストもあり
- 雑に書いて雑に捨てられるのでいいかも
Lazy Evaluation in Swift [iOS]
- 必要時のみ評価したい時や評価タイミングを変更するときはcall-by-nameを使う
- クロージャを使って必要なときに評価する
- @autocloasureを使うと気持ちよく書けます
- 再評価を避けたいときはcall-by-needを使う
- lazy propertyを使うといい
- 2回呼ばれてるけど初期化は1回だけなど
- Fibonacciなども計算をキャッシュして早く実行することが出来る
ユーザーを待たせないためにできること [Android]
- TwitCalというアプリを作りました
- 課題として初回起動時のロードタイムが長い(25秒以上)
- 対策1:高速DBに乗り換え
- Realmを採用
- 計測してみた: 3200件 Releam inertは16906ms
- 対策2:ロード途中でviewを描画
- 400件受信した時点でviewを描画するようにした
- 対策3:CoachMarkを活用した
- CoachMarkでユーザに操作を慣れてもらう
- その間に裏でデータをとってくる
アプリにおける人力ぽちぽちテストの効率化 [iOS]
- テストを自動化しても人力での確認は必要
- ぽちぽち問題点は、時間がかかる、手間がかかる、属人性が高い
- 集まって対面でやる
- エンジニア以外を巻き込む
- 時間を区切って短時間で行う
- 全員同じ所をテストする
- 何度も繰り返す
- DesignSprintというプロトタイピング手法を取り入れたらうまくいきました
- バグが直されなかった場合はテスターはやるきをなくしてしまいます
Model View Presenter [Android]
shinnosuke_kugimiya様 (@kgmyshin)
- MVPとはviewがユーザからのイベントを処理せず、Presenterに処理を異常する。ModelもPresenterに。
- AndroidのMVC問題点
- Activityをviewかcontrollerに綺麗に分けられない
- 多積債務なところをMVPを使えば解決できる
- Activityからcontrollerの要素を排除できるため
- MVPにすると、Activityの処理がviewにもっていけるので明確的にviewとして扱える
Facebook PaperのTop画面かっこいいなあと思っていたらいつの間にか男坂を登っていた [iOS]
当日発表されていたデモ
- Paperというアプリケーションをマネてつくろうとしてみたお話
- 実装のやりかたとしてはUICollectionViewのLayoutTransitionだよね
- しかしスワイプすると動かないことが頻繁に起こった
- 小さいセルをタップしてスライド、して離した時にfinishInteractiveTransitionがよばれるが、ここではインタラクションをはじめることができない
- しかも終わるのが長い
- 解決策としてアニメーションがおわったところで自分でfinishInteractiveTransitionを呼ぶようにした
- 横も動かせるようにした
- しかし、横移動させると画像のロードが遅い
- AsyncDisplayKit Ver1.1からASCollectionViewが使える!!
- 右から左にスクロールした時に、ある程度先読みしてロードしてくれる
- 横よみできたとおもったら、下から上に動かすのができなくなってしまった
- GPaperTransでまだ作り途中です
初めてのAndroidStudioプラグイン [Android]
- Taptrioのアプリサイズを半分にしたら新規ユーザーが1日10%増加しました
- MaterialDesignIconGeneratorというのを作りました
- マテリアル遺恨を簡単に配置できる
- 単語でインクリメンタルサーチが出来る
- アイコンの色を自由に変更できる
- IntelliJベースのJava6でプラグインは作れます
- ActionGroupに苦戦しました
- コード公開するといろんな人がいろいろなおすために話し合ってくれたりして楽しいです
WKWebViewをシュッと使う [iOS]
- WKWebViewを使えばUIWebViewを使うと早いがいくつか問題がある
- target=”_blank”問題
- createWebViewWithConfigurationにてnilを返してもそのWebViewではロードしない
- alertの表示
- jsからに合わせてアラートを表示できるが、ほとんど定形
- R.I.P. KVO
- KVOできるプロパティが増えた事自体は嬉しいが、KVOは書きたくないのでclosureでやりたい
- storyboardにWKWebViewは置けない!
- これらの問題を解決するためにWebKitPlusというライブラリを作った
- WKUIDelegatePlus
- target=”_blank”の問題を解決できる
- WebViewObserでclosureできます
- ZenWebViewController
- storyboardを置けます
- IBActionをいくつかもってて繋げられます
- WKUIDelegatePlus
Dagger 2.0 has been released! [Android]
- Daggerが2.0発表されたので移行してみたお話
- 2.0にて
- ゼロリフレクション、パフォーマンス向上
- AppComponentという概念が加わりました
- @SingletonはComponent単位でインスタンスを管理している
- Dagger2ではScopeを独自に定義して使う
- Dagger1ではデバッグ時に使いたいときはoverrideというアノテーションを使っていたが、2から使えなくなりました
- かわりにAppModuleを拡張してoverrideして読み込んで下さい
最新iOSアプリ開発超必殺技 [iOS]
- アンラップハリケーン
- flatMapを使うことで少数からある配列を整数だけを取り出せます
- 真空オペレーション斬り
- NSOperationのinternalExecutingを中で通知してあげている
- waitUntilFinishedキューで作って返す
- イニュメレイトバスター
- NSFileManagerのenumeratorAtPathは再帰的に返してくれるが、whileでたどる必要がある
- そこで、シーケンスタイプを実装したものを作るとfor inでまわせるようになるが、1.2で普通にenumeratorAtPathはfor inを使えるようになりました
- シャドウ・アクティビティー
- UIActivityControllerで、webページを共有した時にタイトルとURLを渡してあげられる
- UIActivityItemSourceというのを実装すると、中で勝手にUIActivityItemSourceをよんでくれて、twitterとfacebookのときだけtitleを返したりとかできる
- オーサムファンクションコール
- swiftでクラスを作ってメソッドを作った時に、クラスに対してインスタンスメソッドを呼ぶことができる
- 役に立つ場面はひらめきません
- 必殺技を使って明日からやっつけましょう!(何を?
CustomViewTips [Android]
- 一つのlayout.xmlを複数回incluideしてる時に子供layout.xmlにどうやってアクセスするか
- findViewByIdを複数回実行してViewを取得できる
- CustomViewのonSave/RestoreInstanceStateを完結に実装する
- よくみるのはBaseSavedStateを継承してやるが、実装量が多くてめんどくさい
- Bundleを作って、状態をつっこみ、Restoreのほうで状態をとってきて処理すると簡潔に書ける
- CustomViewを複数並べると画面を切り替えて戻ってきた時や、onRestoreInstanceStateが実行された時に同じ状態になる
- android:id属性を削除して、android:tagをつけて、findViewWithTagを使用しましょう
Android
Shigeki Yamato様
残念ながらご欠席されておりました。
ObjC→Swift自動変換の野望 [iOS]
- 最初は正規表現で頑張ろうと思ったが、ANTLR v4というのが便利そうなので使ってみた
- 文法ファイルをいれるとParserができる
- objective-cの文法もある!
- Lexerがinterfaceを作り出し、文法がParserになる
- 変換器(objc2swift)を作ってみました
- InteliJとScalaで作ってみた
- まだ、classとprotocolにしか対応してないです
- visitorパターンで作りました
- デモ: protocolもちゃんと実装されてます
Trying Kotlin + Rx + Anko [Android]
- sampleを1日で作ってみた
- KotlinはAlt Java言語
- RxAndroidはReactive eXtentionをAndroidに適合したもの
- RxCotlinはなんかいろいろ便利関数がありそう
- AnkoはXMLとか使わなくてもlayoutがかける
- Kotlin用のDSL
- KotolinはAnnotaionが互換性がなさそう
- AnkoはListAdapterと使う方法がよくわからない
GoogleTAGManagerを触ってみた iOS
- GTMはGA、Adwarodsなどを一元管理するツール
- 設定の仕方
- コンテナを作り、タグ、ルール、マクロを設定していく