Categories: 勉強会

#potatotips 18は芝生が豊富なリゾート風会場のBizReachで開催!iOS/Android開発Tipsのまとめ!

iOS/Android開発のTipsを出し合う勉強会のpotatotips 19に参加してきたのでその時のメモです。

今月はgoogle I/Oや、WWDCがあったばかりで新技術について早速発表されてる方もちらほらいらっしゃいました。

[iOS] カレンダーイベントの扱いtips

デキるエンジニアを目指すOkogekiのブログ
Okogeki'sブログ - Okogeki'sブログ

日付周りについてのtipsです。

  • カレンダー周りのお話
  • setLocal忘れると、和暦設定になると0025年とかになる
    
    [dateFOrmatter setDateFormat:@"yyy年MM月"];
    
  • カレンダー生成時もカレンダー形式の指定に気をつける
    [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    
  • ローカルソースの取得先がiCloud連携してるか否かで違うので処理を分ける必要がある
  • 開始曜日指定機能は必須レベル
    • きのこたけのこ戦争並に人によってはこだわりがあるくらいなので、カレンダーアプリを作るときは月曜開始か、日曜開始なのかを設定できるように作っておく

[Android] Alternative WebView

標準WebViewの代替になりうるXWalkViewの紹介です。

  • WebViewはただのブラウザではなく、Androidの闇
    • JSが動かなかったり、表示崩れしたり、videoがぬるぽしたり…
  • WebViewの種類は4.3以前はWebKit WebViewだが、4.4以降はChrome WebViewが使われる
  • CROSSWALKを導入してみよう!
    • HTMLアプリケーションの実行環境として開発されている
    • 標準のwebviewよりもHTML5 scoreは高め
  • 導入はgradleで1行で簡単に導入できるので、HTML5対応でお困りの方は導入を検討してみるのもいいかもしれない

[iOS] 現在のAppCode事情あれこれ

@kouchi67様

Obj-cを書くときはAppCodeがいいというお話です。

  • AppCodeの便利なところ
  • JetBrains社製の有償IDE
  • swift書くのはつらい
  • obj-cで書くならAppCodeのほうが補完機能がきいて便利
  • 比較
    • IBあるが、機能不足
    • 補完機能が頭いい(Camel caseの補完など)
    • 自動import, リファクタリング、関数外出し、Multiple Selectionなど
    • 余分なimportを削除したり、設定したルールに従って自動設計したりと、code formatterがすごく便利
    • snippetも細かくPlaceholderの設定ができて便利
  • swiftとの比較
    • IBあるが、機能不足
    • メソッド名は保管してくれるが、ラベルまで補完してくれない
    • リファクタリング、CodeFormatterはできる
    • なんだか重たい
  • まとめ
    • swift -> Xcode
    • obj-c -> AppCode
    • IB -> どちらの言語でもXcode
    • swift対応はまだかかりそう
    • obj-cのメンテには役立つ

[iOS] ReactiveCocoaをswiftでめちゃライトに導入してみたおはなし

FunctionReactiveProgram的には使わず、ライブラリ的にReactiveを使ってみたお話です

  • 通信処理をプロミス風に
    • AFNetworkingをラップして、callbackスタイルからプロミス風に
    • SignalProducerを使ってみた
  • when的なものを作ってみた
    • 複数の処理が終わった後に一度だけ処理をする
    • SignalProducer#concatを使って実装してみた
  • SignalProducer methods
    • |> mapや|> flattenをうまく使う
    • ReactiveCocoaのunittestやCarthageのソースが参考になった
  • Observe的に使う
    • viewmodelを作り、2つのVCを参照してると2つにイベントを投げれる
    • やってるのはNSNotificationCenterと変わらないが型チェックができるので安心

[Android] Android M Developer Preview & Wear最新トピック

@korodroid様
Android Mの最新情報の紹介です

  • App Permissions
    • 例えば、アプリから電話帳にアクセスするときにアクセスしてもいいかの許可ダイアログを出し、許可を求めるようになった
    • 設定アプリから各アプリの許可というのが増えていて、そこで変更もできる
  • FingerprintAuthentification
    • 指紋を登録して本人認証に使える機能
    • アプリ購入前などに認証を使える
    • エミュレータの検証でしかできません
  • MultiWindow
    • 複数のアプリを1このアプリに表示できる
  • AndroidWear最新機能
    • アプリの常時表示
    • 手首ジェスチャーでの操作
    • 指でなぞって絵文字入力
    • ランチャー
    • wear単体でのWi-Fi接続ができます

[iOS] Intercom APIによるチャット実装

sakamoto yasuhiro様

  • Intercomは企業向けのCRMサービス
    • 今回サポートにあるチャット機能をiOSに組み込んでみた
  • 配信者がチャットを送ると、アプリを使っているユーザーにメッセージなどを送れる

  • How to 実装
    • APIキーの取得
    • Cocoapodsでライブラリを導入
    • APIキーを登録し、ユーザを登録後、Intercomサイトとのセッションを開始する
    • チャット画面の表示は1行書くだけ
    • push通知サポートするために、deviceTokenを1行設定するだけ
  • できないこと
    • Intercomだけのチャット停止
    • 1タイ1しかできない
    • UIの外観を変更できない
    • 49$/月 250ユーザとお金がかかる

[iOS] 10万回で死んだNSURLConnection

NSURLConnectionとNSURLSessionのキャッシュ周りのお話です。

  • NSURLConnection on iOS7でひたすら連続ダウンロードを行ってみたところ、3桁MBでメモリ使用量一旦下がるが、iOS8だとどんどんふえていく
  • 数十キロバイトの画像をDLしてるだけなのにおかしいとおもったのでNSURLSessionを使ってみたが、ios7でどんどんメモリが増えていった
  • サーバレスポンスを返すものだけをつくってやってみたところ、DLしたデータがキャッシュを貯めこんでいることがわかった
  • ios8.1 x NSURLConnectionの場合、データも増えるのでやはりNSURLSessionのほうがいい
  • NSURLSessionのNSURLSessionConfigurationにnilをいれたらキャッシュを無効に出来た
  • これからはNSURLSessionを使いましょう

[Android] Killing Me Softly

@hydrakecat様

SoftReferenceのお話です。

  • メモリキャッシュ、bitmapで使われたりするが、使うなと言われている
  • softreferenceがいつ開放されるのかは不明
  • いつ、開放されるかOracle Javaで試してみたら、OutOfMemoryがきたらsoft referenceが開放された
  • Androidでためしてみたら、GCが走るたびにsoft referenceは半分になっていった。最後のsoft referenceはOOMが走った時に消えた
  • API Levelによってsoft referenceの挙動が違う
    • APILevel 9未満はGCが走ったら開放
    • APILevel 9~21はGCが走るたびに半分になり、OOMが起きたら開放
    • APILevel 21以上はheapが起きる時に時々soft referenceは開放
  • まとめ
    • soft referenceをキャッシュとしては使わない -> UseLruCacheを代わりに使う
    • 強参照以外を使いたければ、weak referenceを使おう!androidでsoft referenceの使い道はないかな
    • LolipopのGC(ART)は良く出来ている

[Android] Android カードUI Tips

tomoki iwai様

カードUIを作るときはDrawable XMLを使うといいんじゃないかというお話です。

  • カードUIの1枚についてのお話
    • どうやって実現するかは、Layoutを2弾重ねて、Paddingを設ける
    • 下の方は横に細長いviewを配置する
  • paddingがレイアウトにあるとカオス
  • Drawable XMLを使うと浅くなるし、padding設定ないし、余分のviewの生成がない
  • Drawable XMLは画像そのものにPaddingを含めちゃうので、このファイルを背景に指定すればPadding設定が不要になる
  • まとめ
    • カードUIを全部レイアウトで書くとごチャットするので背景画像をXMLでつくろう
  • cardviewは5未満ではpadding調整が面倒のと、FrameLayoutを継承しているので、結局2段重ねになる
    • アプリ全体でマテリアルデザインを取り入れるのはあり
    • android5以上ならあり

[iOS] UI Testingの非同期な仕組み

Xcode7の新機能、UI Testingのお話です。

  • UI TestingはXcode標準の自動UIテストツール
  • jQueryみたいな文法だが、AppiumやJSでかくよりはまし
  • ためしにログイン後にラベル(1秒後に表示)があるかをテストしてみたところ、即座にAssertされてしまうので失敗してしまった
  • 非同期でテストするときは、label.tap()といれると成功する
    • UITestingのEvent送信や、プロパティアクセスで見つかるまでリトライする
    • tapのイベントがあると3回リトライ1秒ポーリングなど自動でやってくれる
  • 3秒以上待つ場合はどうするか? -> whileでループして待つしかない

[Android] CircleCIと半年間格闘してみた

CircleCIをandroidでビルドできるように頑張ったお話です。

  • コンテナ1個なら無料で導入コストが低いのでやってみた
  • CircleCIはメモリ4Gまでしか使えないので、OutOfMemoryになってジョブが失敗する
    • JAVA_OPTSでメモリ量を指定する
  • ライブラリを使いしまくるとOutOfMemory
    • assemble家庭のdexタスクが並列で複数走ると発生する
    • dexはJABA_OPTSでメモリを制御できないので、build.gradleにdexOptionsの[javaMaxHeapSize]を追加した
  • メソッド数が65k超えるとビルドできない問題
    • multidexを追加して対応するが、ビルド失敗するようになった
    • dexOptionsのJavaMaxHeapSizeを1Gに増やすことで解決
  • まとめ
    • CircleCIはOOMとの戦い
    • JAVA_OPTSとjavaMaxHeapSizeが肝

[iOS] UIViewにまつわるあれこれ

@daisuke0131様

  • レイアウト指示書通りに作った時にデザインがちゃんとあっているかわからない問題がある
    • テスト配布したアプリからもUIViewの詳細なデザインを見たいということでライブラリとしてViewMonitorを作ってみました

[iOS] Layout System Improvements in iOS 9

NSLayoutAnchor、UILayoutGuide, UIStackViewのお話です。

NSLayoutAnchor

  • UIViewの新しいプロパティでNSLayoutConstraintを作成できる

UILayoutGuide

  • AutoLayout用に短形を表現する
  • UIViewより軽量
  • ~Anchorプロパティがあります
  • 同じ幅のLabelを起きたい時に真ん中においたりします -> 脱ダミーview

UIStackView

  • 縦横にsubviewを並べるコンテナ
  • subviewのコンテナの内容が増減してもうまいことしてくれる
  • spacingは空間を調整してくれる
  • distributionはどういう分布でviewをおくかの指定
  • alignmentはどこにおくかの指定

まとめ

  • すごい便利!
  • しかしこれが使えるのはios9以降です

[Android] Android Support Annotations

新しく追加されたアノテーションのお話です。

  • 新しくThread, 引数チェック、メソッド用のアノテーションが追加されました
  • @MainThreadを使ってもうまくできない問題は@WorkerThreadアノテーションを付ける?
  • アノテーションのルールが強制できます

[iOS] 続 ObjC→Swift 自動変換の野望

@taketo1024様
ANTLR v4を使ったコンバーターの続編です。進化前は前々回のpotatotips 16参照

  • かなり進化しました
    • .h/.mファイルをマージできるようになりました
    • obj-cのメソッドをswiftにコールできるようになりました。
    • @の文字列もとれます
    • for文も変換できます。
  • optionalとかについては自分でやる必要はあるが、変換後にgenericsに書きなおしたりして効率を上げてます
  • まだできてないこと
    • 宣言後1回しか代入してなかったらletにする
    • optional周りの改善
    • Foundation / UIKitなど既存APIへの最適化
  • webUIも近日公開されます (なかなかすごい!

[Android] Android Media Hacks

音楽再生と通知についてのtipsです

  • 音楽の再生コントロールを通知に出てきたりするが、このUIを実現するには大変
    • KitKatだとRemoteController、ICSではRemoteControlClientなどがあるが、LollipopからはMediaSessionやMediaControllerがあります
  • MediaController
    • 音楽コンテンツを持ってるアプリがMediaSessionをもっていて、トークンを吐き出すことで他のアプリがコントロールできるようになる
    • 通知で動かすにはSystem Notificationにtokenをわたすとコントロールできるようになる
  • AndroidAuto
    • MediaBrowserServiceを通じてセッションを払いだしている
  • NotificationListenerService
    • 通知の中身が読み取れるが、Extrasの中にMediaStyleというものがあり、そこにtokenがいれられる
    • MediaControllerはトークンとcontext渡せば作れるので通知からtokenぱくれば作れるのでは・・・?!
    • しかしGooglePlayMusicしかこれは使っていなかったのでそれしか使えなかった…
  • まとめ
    • 通知のパーミッションがとれれば全アクセスとれるので、変な情報を入れてると、ぱくられるので気をつけましょう
    • AndroidAutoがでてきてそうだが、MediaSessionとMediaControllerで再生方法を統一できるので今後使っていきましょう
    • RemoeteControllClientを使ってもダーティなハックですが同じようなことができます
    • 互換性を考えると今はRemoteControllerが優秀か?

[iOS] watchOS 2 新機能の細かい話

watchOS-2-Samplerを作った上で気づいた細かい点などの紹介

cf: watchOS 2 新機能の細かい話5つ #potatotips

2つのアセットカタログの使い分け

  • Extensionのcodeもウォッチ側で実行される
    • watch extension,  Watch AppのAssetCatalogはウォッチ側にある
  • watch extentionのアセットカタログを使う場合はcoordinated animationsなどのUIImage(image: ~)などのWatchKit以外のクラスから参照する場合で使う
  • watch app側のリソースを使うのはWKImage(imageName: ~)などのWatchKitのクラスから参照する場合に使う

メディアデータの保存場所

  • 第1引数にオーディオファイル出力先のNSURLオブジェクトを渡すが、ドキュメントフォルダへの保存は実機では動かない!
  • AppGroupsを有効にしてshared containerを使うようにしましょう

WKAudio

  • Bluetooth Headsetのペアリングが必要
  • WKAudioFilePlayerItemのstatusプロパティがReadyToPlayになれば再生できます

ウォッチ側Bluetoothの直接利用はできるか

  • watchOS Developer LibraryにはCore Bluetoothのドキュメントはないが、ためしに使えるかどうかimportしてみたが、やっぱりimportできなかったので使えません

Watch Connectivity

  • Phone – Watch間で相互にメッセージやデータを送れる
  • 以前あったopenParent~はwatch -> Phoneだけだった
  • Reachableになるケース
    • 両者ともにフォアグランド
    • iOS側だけバックグラウンド
  • watch appがバックグラウンドの時はiPhone側からのメッセージを受け取れない
    • Application contextやuser info transfer, file transferを使えばphone -> watch へ情報を送れるかもしれない

[Android] UIのPerformanceTest Tips

cookych/Koichi_Kukino様
Androidでパフォーマンスチェックする時のtips

  • adb shell dumpsys gfxinfoで使っているパッケージの情報が見れるがわかりづらい
  • DeviceMonitorで細かく見ていくことも可能だが時間をかけたくない
  • GPUレンダリングのプロフィールから視覚的にパフォーマンスがみれる
    • 緑の線を超え続ける場合はSystraceなどで調べましょう
  • StrictModeにすると問題を見つけやすい
    • logcat上に問題がある箇所が出てくる
  • まとめ
    • 開発中は重いと感じることがないが、新機能が増えるたびに重たくなってしまうので常にパフォーマンス意識した開発をする
    • 後からチューニングにかける時間が減る
    • UI/UXにかける時間が確保できる!

所感

今回は新機能を試してみてのtipsがたくさん出たので非常に役に立つtipsが出ました。

一人でやっていたら確実に詰まっていたと思われるので、いつもためになるtipsがでますが今回も参加して本当に良かったpotatotipsでした。

次回はブログ枠がもう埋まってしまっていたので参加できるかわからないですが発表枠で頑張ってみたいと思っています。

mogmet

View Comments