iOS 8/Swift エンジニア勉強会@ヤフー に参加してきたよ #ios8yahoo

More than 3 years have passed since last update.


iOS 8/Swift エンジニア勉強会@ヤフー

7582e189d2243166b737e0aebe4940a3.png

http://connpass.com/event/8629/

http://www.ustream.tv/channel/ios8yahoo

http://togetter.com/li/733745

#ios8yahoo

公式の記事が公開されました。

http://techblog.yahoo.co.jp/ios/ios8SwiftStudySession/

ヤフー本社にて開催された「iOS 8/Swift エンジニア勉強会@ヤフー」に一般枠で参加してきました。その内容(メモ)になります。メモが及ばなかった部分がありますがご了承ください。

※一部非公開情報がありましたため、そこは割愛させていただきます。

※内容に問題がありましたらご指摘ください。


会場の様子

会場はとても広く、全面と側面にはディスプレイを複数並べた巨大なディスプレイがありました。

部屋の写真を撮ったのですが写りが微妙だったので載せるのはやめておきます。

初音ミクのシール、Smart Search のシールと飴、ヤフオクのシールとペンを頂きました。

3.jpg

休憩時間にたくさんのピザとお酒、飲み物類が提供されました。ピザおいしかったです。

2.jpg


ヤフー社員による発表

全体的に若い方が多く、新卒数年目というエンジニアが輝いておりました。羨ましい限りです。


iOS 8 / Swift 概要

平松亮介氏(ヤフー)

http://www.slideshare.net/himaratsu/ios-8swift-ios8yahoo


ヤフーでは


  • WWDCに参加

  • 勉強会や社内チャットで積極的に情報交換


iOS 8の変化

6→7はUIが大きく変わった。

7→8はアプリ間連携が強化されるなど内部的な機能追加が目立った


iOS 8 新機能など


App Extension


  • アプリ間連携

  • ウィジェット

  • キーボード

  • Share


    • Twitter, Facebook, Pocketなど



  • Action


    • 別アプリのVCを表示



  • Document Provider


    • 外部ストレージの利用



  • Photo Editing


    • 写真加工




Interactive Notification

通知センターからアクション(ボタン)で反応出来るやつ。


CloudKit

Apple製MBaaS


HomeKit

家電の操作


HealthKit

身体情報の蓄積と利用、アプリとの連携


WKWebView


  • Safari と同じエンジン(Nitro)が使えるので高速

  • 読み込み状態(Safariアドレスバー下のプログレスバー)や閲覧情報のプロパティが追加

  • UIWebView よりもいろいろできるよ


iTunes Connect


  • iOS 7っぽいUIに変わったよね

  • 日本語に(一部)表記が対応

  • 微妙に操作方法も変わったので慣れが必要かも


TestFlight


  • テスター向けサービス

  • iTunes Connect に統合

  • Buildにアップロード → テスターに配布

  • 内部テスター、外部テスター

  • 配布には一部制限あり


iTunes Connect / App Store


  • App Previews


    • スクショのところに動画を1つ追加できる

    • 30秒まで



  • AppBundle


    • 複数のアプリをセット販売

    • 有料アプリのみ

    • 10個まで



  • Analytics


    • 解析など




Swift


概要


  • OS X, iOS に使える

  • JSなど最近の他の言語に似ている

  • いろいろ面倒だった構文が楽に

  • 文字列操作が直感的

  • Generics

  • 名前空間

  • 互いに呼び出す事は可能

  • 堅牢に書ける


    • nil の扱いが Obj-C よりも厳しくなった

    • 静的解析で確認できる

    • public, private, internal 追加

    • 型推論



  • ヘッダーファイルが不要


Playground

Xcode 6のREPL環境

Appleの資料が分かりやすい

https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html


Xcode6の新機能

佐藤新悟氏(ヤフー)


Xcode 6新機能概要


  • Swift

  • Playground

  • XCTest

  • Viewの3D表示

  • IBでライブレンダリング

  • queueに積まれたblock表示

  • Extension 対応

  • .framework 対応


Viewの3D表示

デバッガーパネル上のボタンを押すと表示出来るやつ。

(サードパーティのプラグインであったものだが、Appleが同じようなものを載せてきた)


  • 階層表示

  • 表示する範囲をスライダーで動的に変更

  • ワイヤーフレーム表示もできる

  • カメラ角度


IBのライブレンダリング

https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_6_0.html

IBで配置したビューの内容が描画される。具体的には、drawRect: 内の描画が行われる。

Apple公式にはframeworkでないと使えないらしい?が、別にそうではなくても使えるとか。

IB_DESIGNABLE をクラス宣言の前に付ける。

IB_DESIGNABLE

@interface MyClass : NSObject
@end

IBInspectable をプロパティ宣言に付ける。

@propety (strong) IBInspectable UIColor *color;

これにより、IBに専用の設定パネルが出現する。

大抵の標準的な型には対応する。

Swiftの場合は @IBDesignable, @IBInspectable


非同期テスト

https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/testing_with_xcode/Introduction/Introduction.html#//apple_ref/doc/uid/TP40014132

Xcode 6ではXCTestが旧版iOSにも対応する。

XCTestExpectation

非同期テストが出来るようになった。

-waitForExpectationsWithTimeout:handler: を使う。

KVOのテストの場合

-keyValueObservingExpectationForObject:keyPath:expectedValue:

-waitForExpectationsWithTimeout:handler:

Notificationのテストの場合

-expectationForNotification:object:handler:

-waitForExpectationsWithTimeout:handler:


既存アプリのiOS8対応(ヤフオクの事例)

西 磨翁氏(ヤフー)


  • iOS 8の対応範囲

  • ヤフオクでの問題

  • Widget対応

  • 工数

  • ユーザの反応

ヤフオクは2010年登場の歴史のあるアプリ。

なので、iPhone/iPadユニバーサルではなくて別々になっている。


iOS 8の対応範囲


  • 正常動作を目指す

  • ExtensionなどiOS 8新機能への対応

  • iPhone 6向けレイアウトへの対応 (ヤフオクでは現在未対応)


ヤフオクでの対応


回転時にレイアウトが崩れる

applicationFrame が回転を考慮する値を返すようになった。これを使っている箇所では回転時にレイアウトが崩れてしまった。

iOS 7以前とiOS 8以降で挙動が違うので分岐が必要。


UITableView の区切り線

iOS 7での対応方法だけではインデントが残ってしまう。

消したい場合は、新たに layoutMargins プロパティでの対応が必要になる。

あくまでAppleのHIGに従ってから考慮した方が良さげ。


デバイストークンの取得方法が変更

UIUserNotificationType

UIUserNotificationSettings


カメラ撮影(iPad)の不具合

iPadのみで、UIImagePickerController を起動するとなぜか落ちる。

dispatch_async を使って非同期にするとなぜか落ちない!?


ExtenstionからsharedApplicationが呼べない

マクロで分岐したりして対処。


Widgetへの対応

キーボードが呼べない → Widgetの中にテンキーのようなボタンを配置して対応。


開発工数

合計1週間程度で対応出来た。

迅速な(iOS 8)対応をすると、世間の評判が良い。


iOS 8 Widget

田邉裕貴氏(ヤフー)

http://www.slideshare.net/tanabee/ios8widget


Extension 概要

Extension は単体では作れないし、申請も出来ない。

本体アプリに Target を追加する。

ウィジェットは既に競争激しいので、あの領域に居続けられると強いよね。


詰まりどころ


Widget表示名


  • Info.plist の Bundle display name


Widgetの左余白


  • デフォで入っている領域

-widgetMarginInsetsForProposedMarginInsets: メソッドで対応可能。

わざわざ余白があるのはUX的な意図があるので、本当に必要な場合のみ検討した方が良い。


ビューのライフサイクル


  • 一般的なVCと同じ


    • -viewDidLoad

    • -viewWillAppear

    • -viewDidAppear

    • -viewWillDisAppear

    • -viewDidDisappear



-viewDidLoad も含め、表示・表示の度に呼ばれる。


Widgetからのアプリ起動

sharedApplication は使えないが、別のメソッドにより URL スキームを使った起動が可能。

[self.extensionContext openURL:completionHandler:];

アプリからWidgetの起動は出来ない。


データ共有


  • App Group を使う

  • 同一開発者であれば複数アプリ、ウィジェットとのデータ共有が可能

手順


  1. App Group 作成する

  2. 本体アプリ、ウィジェットで App Group を有効にする

  3. 実装

iOS Dev Center, Certificates のところに App Group の画面がある。

Xcode の Capabilities タブから有効に出来る。

NSUserDefaults の場合

[[NSUserDefautls alloc] initWithSuiteName:appGroupID];

その他、CoreData, SQLiteなども共有可能。


コードの共有


  • .frameworkを作って対応


禁止事項


  • キーボードは使えない

  • スクロールビューは禁止


    • 通知センターがスクロールビューであるので、ウィジェットもスクロールビューだと使いにくくなるからだと思われる



  • 大きすぎる(高すぎる)コンテンツも禁止


Document Provider

大西智也氏(ヤフー)


Document Provider 何が出来る


  • 外部ストレージを利用可能


    • iCloud

    • Dropbox

    • Box



  • Import


    • Provider → HostApp



  • Export


    • HostApp → Provider



  • Open

  • Move


構成

それぞれ別のExtensionとなる。


DocumentPickerViewContrller Extension (DocumentPicker)


  • UI

  • Import, Export

Provider からファイルのコピーをつくる。

-prepareForPresentationInMode


  • Document Providerが表示される直前に呼ばれる

  • UIが表示される

-dismissGrantingAccessToURL


  • HostAppに返す(デリゲートが呼ばれる)

  • UIを閉じる


FileProvider


  • Open, Move

これらはファイルの直接アクセスなので、コンフリクトを考慮した複雑な処理が必要。


オトナのHomeKit

羽田健太郎氏(ヤフオク)

HomeKitではBLEによる家電の操作が可能。

いわゆる「スマート家電」に対応する訳ではなく、Appleの「MFi」認証を取得している家電とのBLE, WiFi接続に対応する。

※MFi = Made For iPhone/iPad

割といろいろなメーカーが対応をうたっているが、日本企業の名は今のところ無し。

Philips の電球 Hue も対応している。

GoogleもHomeKitみたいなの出すかもという噂がある。


HomeKitとは


  • 機器にアクセスするための共通インターフェース

  • いままではメーカー独自のSDKが乱立していたが、HomeKitにまとめられることで共通のインターフェースで機器の制御が可能

  • HomeKit Accessory Simulator が存在する

  • 機器が持つ機能は HMService で提供される

HomeKit Accessory Simulator はさっぱりしているが、一応動いている様子はうかがえる。


虚数は作れる!Swiftで学ぶ複素数

佐野岳人氏(ヤフー)

@taketo1024

http://www.slideshare.net/taketo1024/swift-40423935

https://github.com/taketo1024/SwiftComplex

SmartSearchの中の人。

虚数の世界をSwiftによって表現するという、面白い発表でした。UIView上の点をドラッグすると対応する点が動いていく様は、是非とも高校数学の教育に取り入れられたらな、と思いました。美しいです。

Macに付属のGrapher.appが正しく活用されている様子を初めて目の当たりにしました。

数学が得意でない私のメモよりも公開されている資料をご覧下さい。


シークレットセッション

佐々木海氏(ヤフー)

こちらは非公開発表となりますので割愛いたします。

なかなか聞く機会の無い貴重な内容でした。



LT枠

compassに記載のLT登壇予定者の何名かが急遽キャンセルされたため、あの予定表とは順番、発表者が実際には異なります。


SwiftでSioriを開発した体験記

杉上洋平氏 (WANTEDLY)

@susieyy

http://www.slideshare.net/susieyy/swiftsiori


  • 2ヶ月で開発、開発体制3名

  • エンジニアがディレクションやったり、デザイナーがSwiftコーディングやったり

  • まずは勉強会と情報収集

  • Qiitaでも情報発信

  • プロトタイプをSwiftで作ってみた。アニメーションもする。

  • RestKitが使えるかの確認もやった。

  • 「これは行けそうかも」→採用決定(7月末)

  • 8〜9月で開発

  • UX変更とInteractive Transitionを活用。あまり実装例が無かった。

  • Beta版に悩まされた。

苦労したところ


  • iOS 8, Xcode, Swiftどのレイヤーでの問題なのか

  • Xcodeがよく落ちる

  • シンタックスハイライトと補完がなかった

  • Betaが出る度にコンパイルエラー

  • ObjCライブラリも一部動かない

  • 予約語とバッティング

  • デバッグ時に変数が見られない

良かった点


  • 他の言語のように書きやすい

  • コード量は6割に

  • enumによる状態管理、switchによるパターンマッチング

  • ObjCとの共存

Swiftどうなの

ObjC経験者なら参入しやすい。

AFNetworkingの人のAlamofireが実装例として参考になる。

https://github.com/Alamofire/Alamofire

チームで導入するなら

設計方針、コーディング規約、共通認識が必要かも。

Qiitaにも上がってるよ。

http://qiita.com/susieyy/items/f71435cc962e70d81b37

http://engineer.wantedly.com/2014/10/06/swift-style-guide.html


Swift の Optional型。

長谷川智希氏 (デジタルサーカス株式会社)

@tomzoh

新卒13年目の人。

http://www.slideshare.net/hasegawatomoki/ss-40424010

Swift の String型

var str: String = "Hello"

str = nil // <- ここでエラーが出る

nilを入れる場合は ? をつける

……これはOptionalの省略形

var str: String? = "Hello"

str = nil

ではない!?

nilを入れたい場合は Optional型を使う

var: Optional<String> = "Hello"

str = nil

Optional型はそのままではString型としては使えない。

アンラップが必要。


アンラップ

Optional型でラップした変数をもとの型として使えるようにする処理。

方法は4種類


  • Forced Unwrapping

  • Optional Chaining

  • Optional Binding

  • Implicitly Unwrapped Optional


Forced Unwrapping


  • 強制的にアンラップし手元の型を取り出す

  • 変数名後ろに!を付ける

  • nilにこれをやると実行時にエラーになる

var str: Optional<String> = "Hello"

var unwrapped: String = str!
unwrapped.lowercaseString


Optional Chaining


  • 元の型のメソッドを使えるようにする

  • 変数名の後ろに?を付ける

  • 結果もOptional型

  • 変数がnilの場合そのアクセスは無視する


Optional Binding


  • nilチェックしてnilでなければ元の型を取り出す

bar str: Optional<String> = "Hello"

if let unwrapped: String = str {
unwrapped.lowercaseString
}


  • let, var OK

  • unwrappedはString型


Implicitly Unwrapped Optional


  • 使用時に自動でアンラップされてもとの型になる

var str: ImplicitlyUnwrappedOptional<String> = "Hello"

str.lowercaseString


  • このアンラップはForced Unwrapping

  • nilのときは実行時にエラー


Optional型 の省略形

ImplicitlyUnwrappedOptional の省略形が存在する。

型の後ろに!を付ける

var str1: ImplicitlyUnwrappedOptional<String> = "Hello"

var str2: String! = "Hello"

Optional にも省略形がある。

型の後ろに?を付ける

var str1: Optional<String> = "Hello"

var str1: String? = "Hello"


まとめ


  • SwiftのString, Int, Bool などはnilを値として取らない

  • nilを扱うにはOptional型を使う


    • 省略形は、元の方の後ろに !, ?



  • Optional型を元の型として扱うにはアンラップ!


    • アンラップは末尾に !, ? を付けて方法を示す



  • Optional型の省略形とアンラップの !, ? は別物なので注意

とても分かりやすい発表でした。


Swift & iOS 8 (SceneKit)

束田大介氏

@dsgarage

自己紹介が長い人。


  • Metal


    • Unityでは難しい表現が可能

    • 高速な信号処理



ポイント


  • 3Dモデル描画

  • シェーダーによる開発

  • 3D描画を活かした音声演出

Apple がいろいろサンプルを出しているので参考になりそう。


Swift-JSON

@dankogai

https://github.com/dankogai/swift-json/

使えるJSONライブラリが欲しかったので作ったと力説されておりました。同名のswift-jsonよりも優れているそうです。

私のSwiftの理解が及ばなかったので、発表内容をメモしきれませんでした。

let json = JSON(obj)

という非常にシンプルな形で扱えるとの事です。

具体的な実装はgithubで解説されています。


フラットデザインの裏にあるもの

@nakajijapan 氏 (GMO PEPABO)

https://speakerdeck.com/nakajijapan/flat-desginfalseli-niarumofalse


  • Grid

  • Typography

  • Skeuomorphism

  • Material Honesty

  • Minimalism


Skeuomorphism

現実を模倣した表現。

昔のiOSとかMac OS Xとか。

この表現には限界がある。

形態が機能を表現しきれていない。

ユーザの習熟度が上がってきたが故のフラット化。

Appleは一言も「フラットデザイン」とは言っていない。

コンテンツを重視した表現である。


Material Honesty

工業製品は素材に忠実であるべきという考え方。

形態は機能に従う。

光源をディスプレイの中で表現する手法はディスプレイに合っていない。


Minimalism

必要最低限の要素のみにする。


もしiOS8のキーボードがガジェットのSDKを搭載したら

@niwatako 氏(株式会社Asterisk)

「PHPは文系」とツッコミ言われていた人。

AsReader(バーコードリーダー機器)の開発における事例の紹介。

※AsReader: iPhone, iPod に装着するバーコードリーダー(ハードウェア)とソフトウェア


問題点

AsReaderを使うには、アプリ側SDKを組み込む必要がある。

一般のアプリにそのSDKが入ってないため、専用アプリが必要となってしまう。

標準アプリはほぼ無理、FileMaker等のアプリに組み込むのもなかなか難しい。


iOS8では


  • カスタムキーボードでバーコードリーダーを作ればどのアプリでもいける!

  • Extensionはアプリに同行されるが、独立したサンドボックスになる

Info.plist で RequestsOpenAccess = YES にするとキーボードがサンドボックスの外側にもアクセス出来る「フルアクセスを許可」項目が増える。

これにより、連絡先などにもアクセス可能。

Appleに日本語の資料があるので参考になる

https://developer.apple.com/jp/devcenter/ios/library/documentation/ExtensibilityPG.pdf


外部装置との連携には

ExternalAccessoryFrameworkを利用する

MFi認証を取らないと接続出来ないのでこれの取得(ID)が必要。


カスタムキーボードでバーコードリーダー

まだ申請が通るかは分からない。結果待ち。