<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>iOS &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/ios/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>DMMも参入！競合ひしめくライブ配信アプリ「LIVEcommune」の開発秘話を聞いてきた！</title>
		<link>/miyuki-baba/24799/</link>
		<pubDate>Tue, 19 Dec 2017 01:06:51 +0000</pubDate>
		<dc:creator><![CDATA[馬場 美由紀]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Assault]]></category>
		<category><![CDATA[DMM.com]]></category>
		<category><![CDATA[LIVEcommune]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">/?p=24799</guid>
		<description><![CDATA[DMMが9月28日にサービス開始したライブ配信アプリ「LIVEcommune（ライブコミューン）」。ライブを見ながらチャット感覚でコメントやプレゼントを送ったり、リアルタイムで配信者や他のユーザーと盛り上がることができま...]]></description>
				<content:encoded><![CDATA[<p>DMMが9月28日にサービス開始したライブ配信アプリ「<a href="https://livecommune.dmm.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">LIVEcommune（ライブコミューン）</a>」。ライブを見ながらチャット感覚でコメントやプレゼントを送ったり、リアルタイムで配信者や他のユーザーと盛り上がることができます。</p>

<p>今回はこのライブ配信アプリ「LIVEcommune」の開発チームにどんな技術や体制で開発しているのか、HTML5 Experts.jp白石俊平編集長が直撃インタビューしてきました！</p>

<p><img src="/wp-content/uploads/2017/12/DSC05779.jpg" alt="" width="640" height="401" class="alignnone size-full wp-image-24802" srcset="/wp-content/uploads/2017/12/DSC05779.jpg 640w, /wp-content/uploads/2017/12/DSC05779-300x188.jpg 300w, /wp-content/uploads/2017/12/DSC05779-207x130.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>DMMが映像配信のノウハウを活かしたライブ配信アプリ「LIVEcommune」をリリース！</h2>

<p><strong>白石</strong>：まずは、「LIVEcommune」がどのようなアプリなのか教えてください。</p>

<p><strong>植田</strong>：今回開発したアプリ「<a href="https://livecommune.dmm.com/" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">LIVEcommune</a>」は、配信者と視聴者を繋ぐ生配信アプリです。配信者をプレゼントで応援したり、嬉しいことや面白いことを「LIVEcommune」を通じて共有できます！一般ユーザーがスマホアプリのカメラで配信し、それをスマホユーザーが見てチャットなどでコミュニケーションをとって楽しむライブ配信アプリです。さらに、オンライン上で盛り上がっていただくスタンプ・アイテムを提供しています。</p>

<p>ライブ配信アプリはもうすでにレッドオーシャンになっており、日本だけでなく、中国をはじめるとするアジアでも盛り上がっている市場です。「LIVEcommune」はスピード感を持ってまずはユーザにとって絶対に必要な基本機能を厳選して開発を行いました。戦略的な機能はこれから実装をしていくといったところですが、動画広告やコンテンツ配信など各社マネタイズに工夫しているようです。</p>

<p><img src="/wp-content/uploads/2017/12/DSC05593.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24865" srcset="/wp-content/uploads/2017/12/DSC05593.jpg 640w, /wp-content/uploads/2017/12/DSC05593-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC05593-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 85%;">▲<strong>株式会社DMM.comラボ 植田隼人さん /「LIVEcommune」の開発リーダー、システムの取りまとめをしている</strong></span></p>

<p><strong>白石</strong>：この開発には何人くらい携わっているんですか？</p>

<p><strong>植田</strong>：開発時はエンジニア、デザイナー、ディレクターなど、事業推進責任者含めると最大20人でした。今は10人ちょっとくらい。メンバー構成としてはリーダー、開発メンバー、サーバーサイド、iOSエンジニア、Androidエンジニア、ディレクター、デザイナーですね。</p>

<p><strong>山本</strong>：iOSはXcodeと、当時の最新であるSwift 3.1で開発しました。あと、MVVMというアーキテクチャを取り入れて、RxSwiftというデータバインディングできるライブラリを使いました。RxSwiftはデータのやりとりから、コントローラーからモデルの間にビューモデルがあって、データのやり取りを簡単にすることができるライブラリです。</p>

<p><img src="/wp-content/uploads/2017/12/DSC05622.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24870" srcset="/wp-content/uploads/2017/12/DSC05622.jpg 640w, /wp-content/uploads/2017/12/DSC05622-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC05622-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 90%;">▲<strong>株式会社DMM.comラボ 山本修平さん / 「LIVEcommune」ユニットリーダー、iOSアプリエンジニアを務める</strong></span></p>

<p><strong>杉野</strong>：僕がエンジニアチームと大きく関わったのは、ぬるぬる動くスタンプのアニメーションのところです。はじめの要求としては3～4カ月くらいでiOS、Android、Webに書き出せるものを作ってほしいという要望もあり、デザイナーだけで完結できるAirbnbが出したライブラリでLottieというのを使いました。</p>

<p>After EffectsからiOS、Android、Webにそのまま反映できるので、ぬるぬる動くアニメーションが実現できました。データはJSON形式にしてアプリの方に送り、アニメを再生するのはRottyを使ってiOS、Androidに吐き出しています。Web版はこれから開発予定です。新しいことに挑戦したいという気持ちもあって、楽しかったですね。</p>

<p><img src="/wp-content/uploads/2017/12/DSC05656.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24872" srcset="/wp-content/uploads/2017/12/DSC05656.jpg 640w, /wp-content/uploads/2017/12/DSC05656-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC05656-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 90%;">▲<strong>株式会社DMM.comラボ 杉野さん /「LIVEcommune」のUIデザインとコンセプトメイキング、技術選定を担当</strong></span></p>

<h2>ロゴが変化するデザイン、ダイナミック・アイデンティティにチャレンジ</h2>

<p><strong>白石</strong>：デザインやロゴはどうでしたか？</p>

<p><strong>杉野</strong>：今回良かったのは開発スタートしたときに、コンセプトやどういうアプリにしようというのがなかったんですね。搭載する機能だけが決まっていた。でも、コンセプトがあった方が機能を作る上での方向性も決めやすいと思ったので、デザインはコンセプトメイキングから入りました。こちらも開発と並行だったけど楽しかった。</p>

<p>コンセプトは「いつでもどこでも一体感を共有」「アプリを開くと新しい発見」「リアルタイムコミュニケーション」。この3つをロゴに落とし込みました。communeの語源は、親しく交わるとかコミュニティ、コミュニケーションからきています。</p>

<p><img src="/wp-content/uploads/2017/12/DSC05675.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24875" srcset="/wp-content/uploads/2017/12/DSC05675.jpg 640w, /wp-content/uploads/2017/12/DSC05675-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC05675-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石</strong>：丸くもこもこしているところがユーザーが交わっているところなんですね。</p>

<p><strong>杉野</strong>：ライブアプリなので、再生を想起させるものを作りました。決めるのに2カ月くらいかかりました(笑)。イベントやメディアによってロゴの形や色が変化するダイナミック・アイデンティティという新しい概念も、これから取り入れようとしています。</p>

<p><img src="/wp-content/uploads/2017/12/DSC05666.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24909" srcset="/wp-content/uploads/2017/12/DSC05666.jpg 640w, /wp-content/uploads/2017/12/DSC05666-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC05666-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 80%;">▲<strong>ダイナミックアイデンティティ以外にもロゴの別案(パターン)も複数案出し、検討していったとのこと</strong></span></p>

<h2>WebのフレームワークはLaravel、データベースはAmazon Aurora、KVSはRedis</h2>

<p><strong>中里</strong>：僕はアプリの中でWebViewを使っているところや、API周りを担当しました。</p>

<p>アプリの中でユーザーが貯めたポイントを現金やiTunesカードなどの景品と交換できるのですが、そのユーザー認証や銀行口座などの入力、景品交換をする一連のページをWebViewを使って開発しています。</p>

<p><img src="/wp-content/uploads/2017/12/DSC05707.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24879" srcset="/wp-content/uploads/2017/12/DSC05707.jpg 640w, /wp-content/uploads/2017/12/DSC05707-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC05707-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 90%;">▲<strong>株式会社DMM.comラボ 中里勇輝さん /「LIVEcommune」Web/APIの開発を担当</strong></span></p>

<p><strong>白石</strong>：なぜ、WebViewで開発しようと思ったんですか？</p>

<p><strong>中里</strong>：今後Web版が出たときに共有できるし、DMMの共通機能も使いやすかったからですね。</p>

<p><strong>白石</strong>：APIはどの辺を使ったんでしょう。</p>

<p><strong>中里</strong>：最初にフレームワークどうしようという話になったときに候補に挙がったのが、Laravel, CakePHP, FuelPHP。どれを採用してもチームの中で全員が使ったことがあるのがなかったし、どうせ学習コストがかかるのなら海外ではメジャーなフレームワークを使ってみたい。ということで、更新頻度も多く、海外ではメジャーだったのでLaravelを選びました。</p>

<p><strong>白石</strong>：基本的にはPHPを使っているとのことですが、PHP7になって結構変わりました？</p>

<p><strong>中里</strong>：メソッドを作る時に、引数などの型を完全に指定できるようになりましたね。指定したものと違うクラスが来たら、エラーになります。</p>

<p>あと、今回はAWS上に誰でも用意されたコマンドを打てば簡単に開発環境が作れる仕組みを作りました。これまで人によってバージョンが違うと動かなかったりエラーが出たりなど、ローカルで開発環境を作ってはまることが多かったんですが、今回はそういうことがなく、全員同じ開発環境がコマンド１発で作ることができました。</p>

<p><img src="/wp-content/uploads/2017/12/DSC05717.jpg" alt="" width="640" height="421" class="alignnone size-full wp-image-24883" srcset="/wp-content/uploads/2017/12/DSC05717.jpg 640w, /wp-content/uploads/2017/12/DSC05717-300x197.jpg 300w, /wp-content/uploads/2017/12/DSC05717-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石</strong>：どういうコマンドなんですか？</p>

<p><strong>中里</strong>：AWS上でインスタンスを作って、ansibleでPHPやMySQLをインストールして設定するとAWS上に個人環境ができるというものです。ローカルでソースコードを書いて、シンクさせます。元を変えたら全員の環境がアップデートされます。新しいメンバーが参加しても、開発環境の準備で時間を取られることがなくなりました。</p>

<p><strong>白石</strong>：反映が遅いということはなかった？</p>

<p><strong>中里</strong>：ないですね。すぐに反映されます。</p>

<p><strong>白石</strong>：データベースは何を使ってるんですか？</p>

<p><strong>中里</strong>：AWSのAmazon Auroraと、KVSはRedisを利用しています。</p>

<h2>データ通信のサーバーはSocket.IOで実装、言語はGoを採用</h2>

<p><strong>田仲</strong>：視聴中のチャットなどのデータ通信は、Socket.IOを利用しており、言語はGoを使用しています。たいていのものはSocket.IOで通信していますが、認証やセキュリティ的要件が必要なものは一回APIサーバーを挟んで通信していますね。</p>

<p><img src="/wp-content/uploads/2017/12/DSC05736.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24881" srcset="/wp-content/uploads/2017/12/DSC05736.jpg 640w, /wp-content/uploads/2017/12/DSC05736-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC05736-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><span style="font-size: 90%;">▲<strong>株式会社DMM.comラボ 田仲祐介さん /「LIVEcommune」配信サーバー、インフラ周りを担当</strong></span></p>

<p><strong>白石</strong>：重要な方はAPIを挟むんですね。</p>

<p><strong>田仲</strong>：視聴者が画面をタップするとハートを送ることができるのですが、これらのデータの信頼性がそこまで重要でないものは速度を重視して、Socket.IOで完結させています。</p>

<p><strong>植田</strong>：ちなみに去年くらいから、プラットフォーム上で使う言語はGoを採用するようになってきました。エンジニアが使いたい言語をチームで話し合って決めているので、自由度は高いです。</p>

<h2>配信サーバーはWowzaで構築、チャット用サーバーはRedisで運用</h2>

<p><strong>白石</strong>：DMMさんがもともと自社で持っている映像配信のイメージが強いですが、そのプラットフォームを活用したのでしょうか。</p>

<p><strong>植田</strong>：そうですね。社内のインフラチームにはサーバーの基礎の構築だけお願いしました。サーバーにAPIサーバーなどはの特定の情報は持たないようにして、AMIによる構築とで構築することによってオートスケーリングを組み合わせることによって、と組み合わせて障害が起きた際の復旧をインスタンスを自動化することができました。</p>

<p>ログはAWSのElastic SearchとKibanaを使っていて、チャット用のサーバーはRedisで運用しています。</p>

<p><strong>田仲</strong>：配信サーバーの方はWowzaという製品を使って構築していて、そちらはAWSではなく、オンプレで構築しています。Wowzaは映像配信のデファクトスタンダードと言われているもので、一部モジュールの方はJavaで開発しています。</p>

<p>AWS Lambdaも少し使っているところがあるんですけど、そこはNode,Ruby,Pythonを使っています。</p>

<p><strong>白石</strong>：田仲さんはオールラウンダーですね！配信サーバーだけはオンプレなんですか？</p>

<p><strong>田仲</strong>：配信サーバーは要求されるスペックが高く、AWSで試算してみたらランニングコストがかなり高かったので、オンプレで構築しました。</p>

<p><img src="/wp-content/uploads/2017/12/DSC05748.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24885" srcset="/wp-content/uploads/2017/12/DSC05748.jpg 640w, /wp-content/uploads/2017/12/DSC05748-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC05748-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>田仲</strong>：当初WebRTCの採用も検討したんですが、少人数のグループでの映像配信には向いていると思うのですが、不特定多数に配信するこのサービスでは負荷対策の問題がありました。現在は、RTMPとHLSという技術を組み合わせて使用しています。</p>

<p>配信サーバーのリリース時は、使われていない配信サーバーから順に停止して入れ替えていくんですが、たいていの場合は人力で1台ずつリリースしていると聞きます。そこを自動化したことで、人的なコストとリリースにかかる時間を抑えることができました。</p>

<p><strong>白石</strong>：配信はロードバランシングできるんですか？</p>

<p><strong>田仲</strong>：視聴という意味では、配信サーバーからHLS形式でクラウドフロンドのCDNをはさんでます。配信のインプットはロードバランサーをはさむのは困難なことと、一度に大量のアクセスが来るものでもないので、振分ロジックをAPIサーバーの方で実装しました。それにより、配信負荷が均等になるように振分されます。</p>

<p><strong>白石</strong>：大量のトラフィックが発生する視聴側はHLSで負荷分散をするわけですね。</p>

<h2>ユーザー数に合わせたサーバーや開発体制の構築を</h2>

<p><strong>白石</strong>：最後に、今後サービスや開発の課題でチャレンジしていきたいことを聞かせてください。</p>

<p><strong>田仲</strong>：当初予定していた視聴者数などの要件定義に耐えられるような構築したのですが、サービス開始直後ということもあり、まだそこまで利用されていない状態です。今後は利用状況に応じてスケーリングすることにより、ランニングコストの調整をしていきたいなと考えています。</p>

<p><strong>植田</strong>：今回のプロジェクトでは、開発手法としてスクラム開発を取り入れました。社内でスクラム開発が増えてきているという背景もありますが、一番の理由は定期的に成果物を確認し合い、手戻りをなくしたいからです。</p>

<p>スクラム開発をやるにあたって、本やネットで調べて手探りでやってみましたが、わからないことがたくさんあったんですね。開発が一旦落ち着いてきたので、今度はもっと正規なスクラム開発をやってみようと思っています。</p>

<p><strong>白石</strong>：ちなみにプロジェクト管理のツールは何を使ってるんですか？</p>

<p><strong>杉野</strong>：JIRAを使っています。ドキュメント管理はConfluenceやGoogle Docsですね。あとはホワイトボードも活用しています。誰がどんな業務を抱えているのか、目で見てわかりやすいので。</p>

<p><strong>山本</strong>：機能ドリブンで開発をしてきましたが、リリースしてわかったことや、自分たちが実際にユーザー側に立って使って感じたことを改善していきたいですね。</p>

<p><strong>白石</strong>：DMMさんはエンジニアがチームで話し合って技術剪定をしているので、新しい技術にもチャレンジしやすい環境があって楽しそうですね。今日は興味深い話をいろいろ語っていただき、ありがとうございました！</p>

<p><img src="/wp-content/uploads/2017/12/DSC05798.jpg" alt="" width="640" height="420" class="alignnone size-full wp-image-24886" srcset="/wp-content/uploads/2017/12/DSC05798.jpg 640w, /wp-content/uploads/2017/12/DSC05798-300x197.jpg 300w, /wp-content/uploads/2017/12/DSC05798-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
			</item>
		<item>
		<title>SkyWay iOS/Android SDKを使って、WebRTCアプリを開発しよう</title>
		<link>/sho-y/17863/</link>
		<pubDate>Thu, 24 Dec 2015 00:00:53 +0000</pubDate>
		<dc:creator><![CDATA[山村 奨]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">/?p=17863</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (5)連載5回目の今回は、12月にアップグレードされたSkyWayのiOS/Android用SDKのチュートリアルをお届けします。 iOS/Android用S...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (5)</div><p>連載5回目の今回は、12月にアップグレードされたSkyWayのiOS/Android用SDKのチュートリアルをお届けします。</p>

<p>iOS/Android用SDKを使うことで、SkyWayの特徴である「WebRTCを使ったP2P通信を簡単に実現」することができます。
また、APIもJavaScript版とほぼ同じで、JavaScript版をすでに利用されている方にも実装しやすく、JavaScript/iOS/Android間での通信もサポートしています。</p>

<p>この記事では、そんなiOS/AndroidのSDKの利用方法を、それぞれサンプルアプリのビルド方法や解説を交えながらご紹介していきます。</p>

<p>まずは、iOSのサンプルアプリのビルド方法からご紹介します。Androidのみ開発される方は読み飛ばしてください。</p>

<h2>iOSのサンプルアプリのビルド方法</h2>

<p>まず、まだSkyWayに登録されていない方は<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWayのサイト</a>から開発者登録を行ってください。その際の利用可能ドメインですが、ドメインをお持ちでない方は「localhost」等、適当な文字列を指定してください。</p>

<p>次に、iOS SDKをダウンロードします。<br />
iOS SDKの<a href="https://github.com/nttcom/SkyWay-iOS-SDK/releases/latest" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ダウンロードページ</a>にアクセスして下さい。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sdk_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sdk_DL.png" alt="iOS SDKのダウンロード方法" width="640" height="622" class="alignnone size-full wp-image-17963" srcset="/wp-content/uploads/2015/12/ios_sdk_DL.png 640w, /wp-content/uploads/2015/12/ios_sdk_DL-300x292.png 300w, /wp-content/uploads/2015/12/ios_sdk_DL-207x201.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ページ下部のDownloadsからダウンロードして下さい。
解凍したフォルダの中に「SkyWay.framework」というものが入っており、これがiOS SDK本体になります。</p>

<p>次はサンプルアプリプログラムのダウンロードを行います。<br />
SkyWay-iOS-Sampleの<a href="https://github.com/nttcom/SkyWay-iOS-Sample" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">レポジトリ</a>をクローンするかダウンロードを行って下さい。（下図はダウンロードする場合）
<a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sample_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sample_DL.png" alt="iOSサンプルアプリのダウンロード方法" width="640" height="525" class="alignnone size-full wp-image-17964" srcset="/wp-content/uploads/2015/12/ios_sample_DL.png 640w, /wp-content/uploads/2015/12/ios_sample_DL-300x246.png 300w, /wp-content/uploads/2015/12/ios_sample_DL-207x170.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次に、サンプルアプリのフォルダにはSDKが含まれていないので、サンプルアプリプロジェクトにSDKを入れます。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sample_sdkcopy.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sample_sdkcopy.png" alt="iOS SDKのコピー" width="640" height="334" class="alignnone size-full wp-image-17875" srcset="/wp-content/uploads/2015/12/ios_sample_sdkcopy.png 640w, /wp-content/uploads/2015/12/ios_sample_sdkcopy-300x157.png 300w, /wp-content/uploads/2015/12/ios_sample_sdkcopy-207x108.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>先ほどのSkyWay.frameworkを「SkyWay-iOS-Sample &gt; frameworks」内にコピーします。</p>

<p>サンプルアプリを動かすためには、開発者登録をした際のAPIキーとドメインを設定する必要があります。<br />
では、サンプルアプリプロジェクトを開いて設定してみましょう。</p>

<p>SkyWay-iOS-Sample.xcodeprojをXcode（本記事ではVersion 7.1.1）で開き、<br />
SkyWay-iOS-Sample &gt; SkyWay-iOS-Sample内の「DataConnectionViewController.m」を開きます。</p>

<p></p><pre class="crayon-plain-tag">//
// MediaConnectionViewController.m
// SkyWay-iOS-Sample
//

#import "MediaConnectionViewController.h"

#import &lt;AVFoundation/AVFoundation.h&gt;

#import &lt;SkyWay/SKWPeer.h&gt;

#import "AppDelegate.h"
#import "PeersListViewController.h"


// Enter your APIkey and Domain
// Please check this page. &gt;&gt; https://skyway.io/ds/
static NSString *const kAPIkey = @"yourAPIKEY";
static NSString *const kDomain = @"yourDomain";


typedef NS_ENUM(NSUInteger, ViewTag)
{
  TAG_ID = 1000,
  TAG_WEBRTC_ACTION,
  TAG_REMOTE_VIDEO,
  TAG_LOCAL_VIDEO,
};</pre><p></p>

<p>コードの上方部分に、上図のような箇所があるので、ここにAPIキーとドメインを設定して保存しましょう。</p>

<p>「MediaConnectionViewController.m」にも同様の箇所があるため、こちらも修正します。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sample_Build.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sample_Build.png" alt="iOSサンプルアプリのビルド" width="640" height="492" class="alignnone size-full wp-image-17897" srcset="/wp-content/uploads/2015/12/ios_sample_Build.png 640w, /wp-content/uploads/2015/12/ios_sample_Build-300x231.png 300w, /wp-content/uploads/2015/12/ios_sample_Build-207x159.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ここまで終わったら、ビルドする端末を接続・選択して、ビルドをします。
以上がiOSのサンプルアプリのビルド方法です。</p>

<p>次はAndroidのサンプルアプリのビルド方法をご紹介します。
iOSのみ開発される方は飛ばしてください。</p>

<h2>Androidのサンプルアプリのビルド方法</h2>

<p>まずはiOSと同じく、まだSkyWayに登録されていない方は<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWayのサイト</a>から開発者登録を行ってください。その際の利用可能ドメインですが、ドメインをお持ちでない方は「localhost」等、適当な文字列を指定してください。</p>

<p>次に、Android SDKをダウンロードします。<br />
Android SDKの<a href="https://github.com/nttcom/SkyWay-Android-SDK/releases/latest" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ダウンロードページ</a>にアクセスして下さい。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sdk_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sdk_DL.png" alt="Android SDKのダウンロード方法" width="640" height="525" class="alignnone size-full wp-image-17966" srcset="/wp-content/uploads/2015/12/android_sdk_DL.png 640w, /wp-content/uploads/2015/12/android_sdk_DL-300x246.png 300w, /wp-content/uploads/2015/12/android_sdk_DL-207x170.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ページ下部のDownloadsからダウンロードして下さい。
解凍したフォルダの中に「SkyWay.aar」というものが入っており、これがAndroid SDK本体になります。</p>

<p>次はサンプルアプリプログラムのダウンロードを行います。<br />
SkyWay-Android-Sampleの<a href="https://github.com/nttcom/SkyWay-Android-Sample" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">レポジトリ</a>をクローンするかダウンロードを行って下さい。（下図はダウンロードする場合）
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_DL.png" alt="Androidサンプルアプリのダウンロード方法" width="640" height="525" class="alignnone size-full wp-image-17967" srcset="/wp-content/uploads/2015/12/android_sample_DL.png 640w, /wp-content/uploads/2015/12/android_sample_DL-300x246.png 300w, /wp-content/uploads/2015/12/android_sample_DL-207x170.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次に、サンプルアプリにはSDKが含まれていないので、サンプルアプリ内にSDKを入れます。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_sdkcopy.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_sdkcopy.png" alt="Android SDKのコピー" width="640" height="377" class="alignnone size-full wp-image-17911" srcset="/wp-content/uploads/2015/12/android_sample_sdkcopy.png 640w, /wp-content/uploads/2015/12/android_sample_sdkcopy-300x177.png 300w, /wp-content/uploads/2015/12/android_sample_sdkcopy-207x122.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>先ほどのSkyWay.aarを「app &gt; libs」内にコピーします。</p>

<p>サンプルアプリを動かすためには、開発者登録をした際のAPIキーとドメインを設定する必要があります。<br />
では、サンプルアプリプロジェクトを開いて設定してみましょう。</p>

<p>サンプルアプリのフォルダををAndroid Studio（本記事ではVersion 1.4）で開き、<br />
app &gt; src &gt; main &gt; java &gt; io.skyway.testpeerjava 内の「DataActivity.java」を開きます。</p>

<p></p><pre class="crayon-plain-tag">package io.skyway.testpeerjava;

import ...   //省略


public class DataActivity
    extends Activity
{
  private static final String TAG = DataActivity.class.getSimpleName();

  private Peer           _peer;
  private DataConnection _data;
  private Handler _handler;
  private String   _id;
  private String[] _listPeerIds;
  private Boolean  _bConnecting;
  private Runnable     _runAddLog;
  private List&lt;String&gt; _aryLogs;
  private Bitmap _image;


  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);

    Window wnd = getWindow();
    wnd.addFlags(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.activity_chat);
    _handler = new Handler(Looper.getMainLooper());

    Context context = getApplicationContext();


    //////////////////////////////////////////////////////////////////////
    //////////////////  START: Initialize Peer ///////////////////////////
    //////////////////////////////////////////////////////////////////////


    // connect option
    PeerOption options = new PeerOption();

    // Please check this page. &gt;&gt; https://skyway.io/ds/
    //Enter your API Key and registered Domain.
    options.key = "";
    options.domain = "";

    // PeerOption has many options. Please check the document. &gt;&gt; http://nttcom.github.io/skyway/docs/

    _peer = new Peer(context, options);
    setPeerCallback(_peer);</pre><p></p>

<p>コードの上方部分に、上図のような箇所があるので、ここにAPIキーとドメインを設定して保存しましょう。</p>

<p>「MediaActivity.java」にも同様の箇所があるため、こちらも修正します。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_Build.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_Build.png" alt="Androidサンプルアプリのビルド" width="640" height="471" class="alignnone size-full wp-image-17913" srcset="/wp-content/uploads/2015/12/android_sample_Build.png 640w, /wp-content/uploads/2015/12/android_sample_Build-300x221.png 300w, /wp-content/uploads/2015/12/android_sample_Build-207x152.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ここまで終わったらビルドを行い、端末を選択します。
以上がAndroidのサンプルアプリのビルド方法です。</p>

<p>では、コードを参考にしながら、簡単にAPIの使い方を見ていきましょう。</p>

<h2>ビデオチャットのコード</h2>

<p>iOSとAndroidの二種類のSDKをご紹介をしましたが、この二つのAPIは細かいところを除いては、ほぼ同じです。また、サンプルアプリのコードもほぼ似通ったものとなっています。<br />
そのため、ここではAndroidのビデオチャットのコードを参考にしながら、簡単にAPIの使い方をご紹介します。</p>

<p>また、WebRTC技術についての説明は割愛します。
詳しいWebRTCの仕組みについては、がねこまさしさんが書かれたコチラの記事をお読みください: <a href="https://html5experts.jp/mganeko/5554/" data-wpel-link="internal">壁を越えろ！WebRTCでNAT/Firewallを越えて通信しよう</a></p>

<p>ではまず、APIの使い方の前に、サンプルアプリの動作を確認します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_seq1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_seq1.png" alt="android_sample_seq1" width="640" height="569" class="alignnone size-full wp-image-17940" srcset="/wp-content/uploads/2015/12/android_sample_seq1.png 640w, /wp-content/uploads/2015/12/android_sample_seq1-300x267.png 300w, /wp-content/uploads/2015/12/android_sample_seq1-207x184.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_seq2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_seq2.png" alt="android_sample_seq2" width="640" height="569" class="alignnone size-full wp-image-17937" srcset="/wp-content/uploads/2015/12/android_sample_seq2.png 640w, /wp-content/uploads/2015/12/android_sample_seq2-300x267.png 300w, /wp-content/uploads/2015/12/android_sample_seq2-207x184.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>このように、</p>

<ul>
<li>シグナリングサーバ<sup>*1</sup>との接続とPeerIDの取得</li>
<li>自分の映像の取得と表示</li>
<li>PeerIDの一覧取得</li>
<li>選択したPeerIDへの通話呼び出し</li>
<li>相手の映像の取得と表示</li>
</ul>

<p>を行う、とてもシンプルなアプリです。</p>

<p>では、この動作に沿ってコードを見ていきましょう。<br />
まずは、SkyWayとのサーバとの接続です。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////
    //////////////////  START: Initialize SkyWay Peer ////////////////////
    //////////////////////////////////////////////////////////////////////

    // Please check this page. &gt;&gt; https://skyway.io/ds/
    PeerOption options = new PeerOption();

    //Enter your API Key.
    options.key = "";
    //Enter your registered Domain.
    options.domain = "";


    // SKWPeer has many options. Please check the document. &gt;&gt; http://nttcom.github.io/skyway/docs/

    _peer = new Peer(context, options);
    setPeerCallback(_peer);

    //////////////////////////////////////////////////////////////////////
    ////////////////// END: Initialize SkyWay Peer ///////////////////////
    //////////////////////////////////////////////////////////////////////</pre><p></p>

<p>ここではSkyWayのシグナリングサーバとの接続を行っています。</p>

<p>まず、接続を行う時のオプションをPeerOptionクラスで設定します。<br />
このクラスでまず必須なのは、SkyWayを利用するためには必須となる「APIキー」や「ドメイン」の設定です。<br />
そのほかにも、SkyWayが提供するTURNサーバの利用を選択する「turn」プロパティや、自前のSTUN/TURNサーバを設定する「config」プロパティ等の設定が可能です。もっと詳しく知りたい方は<a href="https://nttcom.github.io/skyway/docs/#Android-peeroption" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ドキュメント</a>をご参照ください。</p>

<p>次に16行目では、このオプションを使ってシグナリングサーバと接続を行っています。<br />
このPeerクラスはシグナリングサーバとの接続を管理しており、「connect/call」メソッドでのP2Pのデータ/メディア通信の開始や、「listAllPeers」メソッドでのAPIキー毎のアクティブなPeerIDを取得、などができます。<br />
実際にサンプルアプリでは、「Calling」というボタンを押すとlistAllPeersメソッドを呼び出し、PeerID一覧の取得を行っています。</p>

<p>続いて17行目では、このPeerオプジェクトのコールバックを設定しています。<br />
コールバックの説明の前に、ローカルの映像取得部分を見てみます。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////
    ////////////////// START: Get Local Stream   /////////////////////////
    //////////////////////////////////////////////////////////////////////
    Navigator.initialize(_peer);
    MediaConstraints constraints = new MediaConstraints();
    MediaStream _msLocal = Navigator.getUserMedia(constraints); 

    Canvas canvas = (Canvas) findViewById(R.id.svSecondary);
    canvas.addSrc(_msLocal, 0);

    //////////////////////////////////////////////////////////////////////
    //////////////////// END: Get Local Stream   /////////////////////////
    //////////////////////////////////////////////////////////////////////</pre><p></p>

<p>ここでは、ローカルの映像取得を行って、得た映像ストリームをViewに表示しています。<br />
NavigatorオブジェクトのgetUserMediaメソッドを呼び出すことで、MediaSteamオブジェクトの映像ストリームを得ることができます。その際に、MediaConstraintsというオプションを指定することで、映像/音声の利用可否の指定、インカメラ/アウトカメラの指定、などを行うことができます。</p>

<p>また、CanvasクラスはGLSurfaceViewを継承しており、得た映像ストリームはCanvasオブジェクトのaddSrcメソッドで表示することができます(iOSのSKWVideoオブジェクトはUIViewを継承しています)。</p>

<p>では、話を戻してPeerオブジェクトのコールバックを見てみましょう。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////////////////
    ///////////////////// START: Set SkyWay peer callback   //////////////////////////
    //////////////////////////////////////////////////////////////////////////////////
    // 簡単のため、適宜、省略しています

    // !!!: Event/Open
    peer.on(Peer.PeerEventEnum.OPEN, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // シグナリングサーバと接続された
        _id = (String) object;

        updateUI();
      }
    });

    // !!!: Event/Call
    peer.on(Peer.PeerEventEnum.CALL, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // 相手から通話がかかってきた
        _media = (MediaConnection) object;

        _media.answer(_msLocal);

        setMediaCallback(_media);

        updateUI();
      }
    });

    // !!!: Event/Close
    peer.on(Peer.PeerEventEnum.CLOSE, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // シグナリングサーバとの接続ステータスがdestroyedとなった
      }
    });

    // !!!: Event/Disconnected
    peer.on(Peer.PeerEventEnum.DISCONNECTED, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // シグナリングサーバとの接続ステータスがdisconnectedとなった
      }
    });

    // !!!: Event/Error
    peer.on(Peer.PeerEventEnum.ERROR, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // 何かしらのエラーが発生した
      }
    });

    //////////////////////////////////////////////////////////////////////////////////
    /////////////////////// END: Set SkyWay peer callback   //////////////////////////
    //////////////////////////////////////////////////////////////////////////////////</pre><p></p>

<p>ここでは、シグナリングサーバから送られたイベントに対し、処理を行っています。</p>

<p>7行目は、シグナリングサーバとの接続が確立した際の「OPEN」イベントでの処理です。<br />
ここでのObjectは、シグナリングサーバから自分に割り当てられたPeerIDが格納されており、サンプルアプリでは、そのPeerIDを表示しています。PeerIDはnew Peer時にIDを指定することもできますし、指定せずにランダムなIDを取得することもできます。</p>

<p>20行目では、他のPeerから通話がかかってきた際の「CALL」イベントでの処理です。<br />
ここでのObjectはMediaConnectionクラスであり、answerメソッドを呼ぶことで、先ほど作成した自分の映像ストリームを返しています。引数を与えないことで、映像ストリームを返さないことも可能です。<br />
そのあと、30行目でMediaConnectionのコールバックを設定しています。</p>

<p>このように、相手からの通話を受ける際は、Peerオブジェクトのコールバック内で「CALL」イベントで処理を行います。<br />
自分から通話する場合は、下記のようにPeerオブジェクトのcallメソッドを呼びます。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////
    ////////////////// START: Calling SkyWay Peer   //////////////////////
    //////////////////////////////////////////////////////////////////////
    // 簡単のため、適宜、省略しています

    CallOption option = new CallOption();

    _media = _peer.call(strPeerId, _msLocal, option);

    setMediaCallback(_media);

    //////////////////////////////////////////////////////////////////////
    /////////////////// END: Calling SkyWay Peer   ///////////////////////
    //////////////////////////////////////////////////////////////////////</pre><p></p>

<p>この部分は、listAllPeersメソッドで得られたPeerIdの一覧から、通話したいPeerIDをタップした時に呼ばれます。</p>

<p>このように、呼び出し時のオプションを設定し（このコードでは何も設定していませんが）、通話をしたいPeerIDと自分の映像ストリームを指定してcallメソッドを実行します。返り値は通話がかかってきた際と同様、MediaConnectionクラスで、MediaConnectionのコールバックを設定しています。</p>

<p>では、MediaConnectionのコールバックを見てみましょう。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////////////////
    //////////////  START: Set SkyWay peer Media connection callback   ///////////////
    //////////////////////////////////////////////////////////////////////////////////
    // 簡単のため、適宜、省略しています

    // !!!: MediaEvent/Stream
    media.on(MediaConnection.MediaEventEnum.STREAM, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        _msRemote = (MediaStream) object;

        Canvas canvas = (Canvas) findViewById(R.id.svPrimary);
        canvas.addSrc(_msRemote, 0);
      }
    });

    // !!!: MediaEvent/Close
    media.on(MediaConnection.MediaEventEnum.CLOSE, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        Canvas canvas = (Canvas) findViewById(R.id.svPrimary);
        canvas.removeSrc(_msRemote, 0);

        _msRemote = null;
        _media = null;

        updateUI();
      }
    });

    // !!!: MediaEvent/Error
    media.on(MediaConnection.MediaEventEnum.ERROR, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // 何かしらのエラーが発生した
      }
    });

    //////////////////////////////////////////////////////////////////////////////////
    ///////////////  END: Set SkyWay peer Media connection callback   ////////////////
    //////////////////////////////////////////////////////////////////////////////////</pre><p></p>

<p>7行目は、通話相手の映像ストリームを取得した際の「STREAM」イベントでの処理です。ここでのObjectは、MediaStreamオブジェクトです。自分の映像ストリームと同じくCanvasオブジェクトを利用して表示しています。</p>

<p>20行目では、通話相手との通話が切断された際の「CLOSE」イベントでの処理です。</p>

<p>ここまでが、簡単なSkyWayを使ったWebRTCの処理になります。</p>

<p>最後に、最近のアップデートで追加されたメソッドについてご紹介します。</p>

<p></p><pre class="crayon-plain-tag">Button switchCameraAction = (Button)findViewById(R.id.switchCameraAction);
    switchCameraAction.setOnClickListener(new View.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        Boolean result = _msLocal.switchCamera();
        if(true == result)
        {
          //Success
        }else
        {
          //Failed
        }
      }
    });</pre><p></p>

<p>MediaStreamオブジェクトがローカルの映像ストリームの場合、switchCameraメソッドを呼び出すことができます。<br />
これにより、今まではできなかった、「getUserMedia後のインカメラ/アウトカメラ切り替え」が可能になります。</p>

<p>以上が、サンプルアプリの簡単なコード解説になります。今回はビデオチャットだけの紹介でしたが、ほぼ同じようなAPIでテキストや画像が送れるデータチャットも可能です。</p>

<h2>おわりに</h2>

<p>今回は、SkyWayのiOS/Android用SDKのチュートリアルをお届けしました。</p>

<p>JavaScript版と同じように、手軽にWebRTCが利用可能です。
是非ご自身のアプリケーションに組み込んでみてください！</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>【HTML5 Experts.jp】2015年9月のブラウザ関連ニュース</title>
		<link>/myakura/17320/</link>
		<pubDate>Wed, 14 Oct 2015 04:00:39 +0000</pubDate>
		<dc:creator><![CDATA[矢倉 眞隆]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[ブラウザ]]></category>

		<guid isPermaLink="false">/?p=17320</guid>
		<description><![CDATA[連載： WEB標準化動向 (5)Chrome 45でES2015のArrow Functionsに対応 9月1日にChrome 45がリリースされました。 Chrome 45ではJavaScriptエンジンのV8が更新さ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webstandards-news/" class="series-156" title="WEB標準化動向" data-wpel-link="internal">WEB標準化動向</a> (5)</div><h2>Chrome 45でES2015のArrow Functionsに対応</h2>

<p>9月1日に<a href="http://googlechromereleases.blogspot.jp/2015/09/stable-channel-update.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chrome 45がリリース</a>されました。</p>

<p>Chrome 45ではJavaScriptエンジンのV8が更新され、ECMAScript 2015のサポートが向上しました。新たにサポートされた機能には、関数の読みやすさ・書きやすさが上がるArrow Functionsがあります。同月リリースされたNode 4.0でもArrow Functionsが使えますし、これから見る機会が増えてくるかなと思います。</p>

<p>パフォーマンス改善点として、<a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/KIoVljZw5fc" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">スクロール中のカーソル位置を更新しなくなった</a>というものがありました。スクロール中に<code>:hover</code>のスタイルやマウスイベントが反応すると、不必要な処理や描画が増えてしまうため、パフォーマンスが低下します。今回の変更で、IEやFirefoxとだいたい同様の挙動（スクロール停止100ms後にカーソル位置を更新）となったようです。<a href="https://bugs.webkit.org/show_bug.cgi?id=99940" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebKitも今年春に同様の変更を行った</a>ようなので、今後は<a href="http://www.html5rocks.com/en/tutorials/speed/unnecessary-paints/#toc-combination" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">スクロール中にスタイルを無効にし、タイマーを仕掛けスクロール後に再適用する</a>なんてことをしなくてもよくなりそうです。</p>

<h2>Alliance for Open Media設立</h2>

<p>9月1日にGoogle, Microsoft, Mozilla、ほか数社が、ロイヤリティフリーなビデオコーデックを推進するアライアンスの設立を発表しました。</p>

<ul>
<li><a href="http://www.mozilla.jp/blog/entry/10501/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ビデオの特許使用料をなくすためのアライアンスを結成しました | Mozilla Japan ブログ</a></li>
</ul>

<p>Webでのビデオコーデックというと、HTML5の<code>video</code>要素やWebRTCが求めるコーデックで激しい議論が行われた過去があります。映像・機器業界などが推し進めるコーデック（<code>video</code>, WebRTCともH.264）が特許使用料を求めるため、Webのオープン性との関わりから反対があるのです。</p>

<p>次世代コーデックとしてはHEVC（H.265）が出ていますが、新たなパテントプールHEVC Advanceがコンテンツ提供者からの使用料徴収を検討していることから、ストリーミング配信事業者から警戒されています。Alliance for Open MediaではCiscoのThor、MozillaとXiph.OrgのDaala、GoogleのVPシリーズといったビデオコーデックをはじめ、ロイヤリティフリーなフォーマットや音声コーデックを推進していくとしています。</p>

<h2>WOFF2の圧縮アルゴリズムBrotliをサーバにも</h2>

<p>Webフォントのフォーマット、WOFF2で採用された圧縮アルゴリズムBrotliを一般的なコンテンツの圧縮にも適用しようという動きが進んでいます。<a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/xdVm8c2GOMQ/DsIZc8mhkPcJ" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Blink</a>, <a href="http://bitsup.blogspot.jp/2015/09/brotli-content-encoding-for-firefox-44.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Gecko</a>で実装が進められています。</p>

<ul>
<li><a href="http://google-opensource.blogspot.jp/2015/09/introducing-brotli-new-compression.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Introducing Brotli: a new compression algorithm for the internet &#8211; Google Open Source Blog</a></li>
</ul>

<p>WOFF 1.0ではDEFLATEアルゴリズムが採用されましたが、圧縮率の点では新しいフォーマットに劣ります。WOFF2では当初LZMAなど圧縮率の高いアルゴリズムを検討していたのですが、メモリの使用量が大きいことやLZMAの仕様が存在していないことなどから、代わりのアルゴリズムとしてGoogleが開発し、そして採用されたのがBrotliです。</p>

<ul>
<li><a href="http://myakura.hatenablog.com/entry/2014/02/05/022608" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WOFF 2.0 Evaluation ReportとBrotli &#8211; fragmentary</a></li>
</ul>

<p>Content-Encodingでの利用によって、gzipよりもさらにbandwidthの削減を見込めます。プロキシソフトFiddlerの開発者Eric Lawrence氏が<a href="http://textslashplain.com/2015/09/10/brotli/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Brotliを試した</a>ところ、gzipに比べてCSSでは12％、JavaScriptでは9％の削減がみられたそうです。</p>

<p>FacebookやCloudFlareなども興味を示しており、今後の普及が期待されます。</p>

<h2>iOS 9のコンテンツブロッカーに賛否</h2>

<p>9月16日にiOS 9がリリースされました。iPhone 6sの機能も話題ですが、iOSの新機能、コンテンツブロッカーが話題となっています。</p>

<ul>
<li><a href="https://www.webkit.org/blog/3476/content-blockers-first-look/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Surfin&#8217; Safari &#8211; Blog Archive » Introduction to WebKit Content Blockers</a></li>
</ul>

<p>コンテンツブロッカーを使うアプリをインストールすると、Safariは広告とおぼしきリソースをダウンロード＆実行しなくなるため、表示時間やメモリ使用量が減るといった利点があります。反面、広告による収益が多くを占めるWebにおいて、こういったものが広まるのはWebに良い影響をもたらさないという反応もあり、なかなかに激しい議論が起こっています。</p>

<p>広告ブロックの是非はさておき、コンテンツブロッカーを使うアプリにはWebフォントをブロックするオプションも用意されていたりします。WebKitはWebフォントが読み込まれるまでテキストを表示しないため、回線速度やサーバーの性能、フォントファイルの容量によってはページを見られるまでに非常に時間がかかります。</p>

<p>コンテンツブロッカーがWebフォントをブロックできるようにしたのはそのためかと思われますが、ブロックされてしまうとアイコンフォントが読み込まれなくなります。リガチャを利用したアイコンフォントであればテキストが読めるかと思いますが、Private Use Area上のコードポイントにアイコンを設定しているフォントは問題になるでしょう。最近は<a href="https://24ways.org/2014/an-overview-of-svg-sprite-creation-techniques/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SVGでのアイコンスプライト</a>が流行っている感じがするので、アイコンフォントに問題を感じる方は試してみてはいかがでしょう。</p>

<h2>Firefox 41でCSSの縦書きが可能に</h2>

<p>9月22日にFirefox 41がリリースされました。</p>

<ul>
<li><a href="http://www.mozilla.jp/firefox/41.0/releasenotes/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firefox 41リリースノート</a></li>
</ul>

<p>今回のリリースでは、<a href="http://drafts.csswg.org/css-writing-modes/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Writing Modes</a>の基礎部分に対応しました。<a href="https://developer.mozilla.org/ja/docs/Web/CSS/writing-mode" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>writing-mode</code>プロパティ</a>や<a href="https://developer.mozilla.org/ja/docs/Web/CSS/text-orientation" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>text-orientation</code>プロパティ</a>が使えるようになったので、基礎的な縦書きが実現できます。</p>

<p>またFirefox 41では、<code>Document.execCommand('cut')</code>と<code>Document.execCommand('copy')</code>がサポートされました。Webアプリなどでクリップボードにコピーさせたい場合、これまではFlashを使う方法が使われてきましたが、それをJavaScriptで実現できます。Chromeも春頃に対応したので結構使えそうですね。</p>

<ul>
<li><a href="https://hacks.mozilla.org/2015/09/flash-free-clipboard-for-the-web/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Flash-Free Clipboard for the Web — Mozilla Hacks</a></li>
<li><a href="https://developers.google.com/web/updates/2015/04/cut-and-copy-commands" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Cut and Copy Commands — Google Web Updates</a></li>
</ul>

<p>開発者ツールには、選択したノードのスクリーンショットを撮るコンテキストメニューが追加されました。これまでも<a href="https://developer.mozilla.org/ja/docs/Tools/GCLI" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">開発ツールバー</a>からコマンドを打てば特定のノードのスクリーンショットを撮れたのですが、CSSセレクタを調べなければならず面倒でした。今回右クリックというUIがついてかなり使いやすくなりました。</p>

<div id="attachment_17324" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2015/10/FirefoxDevToolsScreenshotNode-640x346.png" alt="Firefox開発者ツールのインスペクトパネルのスクリーンショット" width="640" height="346" class="size-large wp-image-17324" srcset="/wp-content/uploads/2015/10/FirefoxDevToolsScreenshotNode.png 640w, /wp-content/uploads/2015/10/FirefoxDevToolsScreenshotNode-300x162.png 300w, /wp-content/uploads/2015/10/FirefoxDevToolsScreenshotNode-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">ノードを選び右クリックメニューにある”Screenshot Node”を選ぶだけ</p></div>
]]></content:encoded>
		
		<series:name><![CDATA[WEB標準化動向]]></series:name>
	</item>
		<item>
		<title>iOS7におけるMobile Safariの主な変更点</title>
		<link>/shumpei-shiraishi/2602/</link>
		<pubDate>Thu, 19 Sep 2013 10:34:09 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[ブラウザ]]></category>

		<guid isPermaLink="false">/?p=2602</guid>
		<description><![CDATA[iOS7上のSafariがどのように変化したかについて、Maximiliano Firtman氏（@firt）がブログで詳細に解説しています。 この記事では、同氏のブログから、Web制作者／開発者にとって重要と思われる情...]]></description>
				<content:encoded><![CDATA[<p>iOS7上のSafariがどのように変化したかについて、Maximiliano Firtman氏（<a href="https://twitter.com/firt" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@firt</a>）が<a href="http://www.mobilexweb.com/blog/safari-ios7-html5-problems-apis-review" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ブログで詳細に解説しています</a>。
この記事では、同氏のブログから、Web制作者／開発者にとって重要と思われる情報を引用して、Web技術者にとっても大きな影響を持つこのアップデートについて紹介していきたいと思います。</p>

<p><span id="more-2602"></span></p>

<p>元記事は非常に長大、かつ詳細なため、全てのポイントを紹介することはとてもできません。素晴らしい記事ですので、関心のある人は、ぜひ元記事を参照してください。</p>

<p>ちなみに、最初にガッカリさせることになってしまいますが、@firt氏によれば、「<em>1.0以降最もバグの多いバージョンだ</em>」（<q>this is the buggiest Safari version since 1.0</q>）だそうです…</p>

<h2>UIが大幅に変更、フルスクリーン（に近いサイズ）がデフォルトに</h2>

<p>Webブラウジングをしている最中は、フルスクリーンがデフォルトになりました。ホスト名部分をクリックしたり、トップに戻るようスクロールを始めた時に、URLバーとツールバーが表示されます。</p>

<div id="attachment_2596" style="width: 179px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/09/2013-09-19-18.15.26.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/09/2013-09-19-18.15.26-169x300.png" alt="Webページはフルスクリーンに近いサイズで表示される" width="169" height="300" class="size-medium wp-image-2596" srcset="/wp-content/uploads/2013/09/2013-09-19-18.15.26-169x300.png 169w, /wp-content/uploads/2013/09/2013-09-19-18.15.26-576x1024.png 576w, /wp-content/uploads/2013/09/2013-09-19-18.15.26-116x207.png 116w, /wp-content/uploads/2013/09/2013-09-19-18.15.26.png 360w" sizes="(max-width: 169px) 100vw, 169px" /></a><p class="wp-caption-text">Webページはフルスクリーンに近いサイズで表示される</p></div>

<div id="attachment_2600" style="width: 179px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/09/2013-09-19-16.32.49.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/09/2013-09-19-16.32.49-169x300.png" alt="ユーザーの操作に応じてツールバーが出現する" width="169" height="300" class="size-medium wp-image-2600" srcset="/wp-content/uploads/2013/09/2013-09-19-16.32.49-169x300.png 169w, /wp-content/uploads/2013/09/2013-09-19-16.32.49-576x1024.png 576w, /wp-content/uploads/2013/09/2013-09-19-16.32.49-116x207.png 116w, /wp-content/uploads/2013/09/2013-09-19-16.32.49.png 360w" sizes="(max-width: 169px) 100vw, 169px" /></a><p class="wp-caption-text">ユーザーの操作に応じてツールバーが出現する</p></div>

<p>問題は、ツールバーの表示／非表示が切り替わった際にresizeイベントが発生せず、メディアクエリなどでも検知できないことです。これにより、画面の高さが変わったことをアプリが検知できないということになり、なるべく固定の幅や高さを確保しようとするゲームなどでは、時に大きな問題になります。
また、ネイティブではないスクロール（iframeやoverflow:scroll、JavaScriptベースのスクロールなど）を使用しているアプリの場合は、ツールバーが表示されっぱなしになってしまう事があります。</p>

<div id="attachment_2599" style="width: 179px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/09/2013-09-19-16.27.16.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/09/2013-09-19-16.27.16-169x300.png" alt="Appleのサイトもネイティブのスクロールを使用していないためか、URLバーとツールバーが表示され続ける" width="169" height="300" class="size-medium wp-image-2599" srcset="/wp-content/uploads/2013/09/2013-09-19-16.27.16-169x300.png 169w, /wp-content/uploads/2013/09/2013-09-19-16.27.16-576x1024.png 576w, /wp-content/uploads/2013/09/2013-09-19-16.27.16-116x207.png 116w, /wp-content/uploads/2013/09/2013-09-19-16.27.16.png 360w" sizes="(max-width: 169px) 100vw, 169px" /></a><p class="wp-caption-text">Appleのサイトもネイティブのスクロールを使用していないためか、URLバーとツールバーが表示され続ける</p></div>

<h2>新しいジェスチャー</h2>

<p>新しいSafariでは、画面端からスワイプするというジェスチャーに操作が割り当てられました。
画面の下端から上に向かってジェスチャーすることで<a href="http://www.apple.com/jp/ios/whats-new/#control-center" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">コントロールセンター</a>を表示でき、画面の横端から右／左にスワイプすることで「戻る／進む」といったナビゲーションを行えます。</p>

<p>スワイプ操作を取り扱っているWebアプリは、画面端に適切なマージンを設けていない限り、これらのジェスチャーと被ってしまう可能性があります。</p>

<p>また、右・左のスワイプ操作に割り当てられている「戻る／進む」と言ったナビゲーションは、ナビゲーション前後のページが重ねて表示されます。こうした動作は、履歴管理API（History API）を用いる単一ページアプリケーションでは多少問題になるかもしれません。同じアプリのUIが重ねて表示されることになるためです。</p>

<div id="attachment_2598" style="width: 179px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/09/2013-09-19-17.18.39.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/09/2013-09-19-17.18.39-169x300.png" alt="History APIを使用するアプリケーションでは、同じアプリのUIが重ねて表示されてしまう" width="169" height="300" class="size-medium wp-image-2598" srcset="/wp-content/uploads/2013/09/2013-09-19-17.18.39-169x300.png 169w, /wp-content/uploads/2013/09/2013-09-19-17.18.39-576x1024.png 576w, /wp-content/uploads/2013/09/2013-09-19-17.18.39-116x207.png 116w, /wp-content/uploads/2013/09/2013-09-19-17.18.39.png 360w" sizes="(max-width: 169px) 100vw, 169px" /></a><p class="wp-caption-text">History APIを使用するアプリケーションでは、同じアプリのUIが重ねて表示されてしまう</p></div>

<h2>HTML5関連の変更</h2>

<ul>
<li>track要素のサポート・・・動画や音声に対して、文字による補足情報（字幕やチャプタータイトルなど）を追加できる、track要素がサポートされました。JavaScript API（webkitHasClosedCaptions）やCSS（::cue擬似要素）もサポートされています。ただし、::cue擬似要素で使用できるプロパティはtext-shadow, opacity, outlineだけです。</li>
<li>progress要素のサポート・・・進捗状況を表すprogress要素がサポートされました。また、meter要素は<del>サポートしようとした形跡はあるものの、画面に何も表示されないというバグがあるそうです(^^;</del><ins><a href="http://trac.webkit.org/changeset/153730" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">意図的に無効にされており</a>、利用できません。</ins><small>(<a href="https://html5experts.jp/myakura/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">エキスパートNo.18 矢倉さん</a>の指摘により修正)</small></li>
<li>output要素のサポート・・・プログラムによる計算結果を意味すすoutput要素がサポートされました。</li>
<li>input要素のdatetimeタイプが削除された・・・代わりに、<del>dateタイプとtimeタイプを合わせて使うことが推奨されています。</del><ins>datetime-localタイプを使用してください。</ins><small>(<a href="https://html5experts.jp/myakura/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">エキスパートNo.18 矢倉さん</a>の指摘により修正)</small></li>
<li>iframe要素のseamless属性がサポートされた・・・シームレスなiframeには、親要素のCSSが適用されます。</li>
</ul>

<h2>JavaScript API関連の変更</h2>

<ul>
<li>Page Visibility APIのサポート・・・ページの表示状態（表に表示されているか、裏に回っているか）を検知できるAPI</li>
<li><del>XMLHttpRequest Level2のフルサポート・・・blobの送受信やアップロードの進捗状況を取得すると言った事が可能になりました。</del><small>(<a href="https://html5experts.jp/myakura/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">エキスパートNo.18 矢倉さん</a>の指摘により削除。XMLHttpRequest Level2は、仕様としてはもはや存在せず、<a href="http://www.w3.org/TR/XMLHttpRequest/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">XMLHttpRequestの仕様に統合されています</a>)</small></li>
<li>AirPlay APIが導入されました・・・Apple TVと連携した<a href="http://www.apple.com/jp/airplay/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AirPlay</a>を、Webアプリケーションから制御することができます。</li>
<li>CanvasのAPIが拡充・・・globalCompositeOperation属性やPathクラスがサポートされました。</li>
<li>Shared Workerが削除・・・複数のWebページ間で一つのワーカーインスタンスを共有するためのShared Workerが削除されました。</li>
<li>WebSpeech Synthesis APIがサポートされましたが、正しく動作しません。</li>
<li>MutationObserverがサポートされました。</li>
<li>requestAnimationFrameからwebkitプレフィックスが取れました。</li>
<li>transitionendイベント名からwebkitプレフィックスが取れました。</li>
<li>Web Audio APIからwebkitプレフィックスが取れました。</li>
<li>hidden属性がサポートされました。</li>
<li>visibilityState属性がサポートされました。</li>
<li>window.doNotTrackプロパティがサポートされました。</li>
<li>Web SQL Database APIが、5MB以上のストレージ容量を扱えなくなりました（以前は上限50MBまで利用可能だった）。5MB以上のデータを保存しようとすると例外（DOMException）が発生します。</li>
</ul>

<h2>CSS関連の変更</h2>

<ul>
<li><p><a href="http://lists.w3.org/Archives/Public/www-style/2012Jun/0627.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">position:sticky</a>のサポート・・・<code>position: sticky</code>を指定された要素は、スクロールによって表示領域から追い出されそうになると、画面端に吸い付くように表示されます。<a href="http://html5-demos.appspot.com/static/css/sticky.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちらのデモ</a>で動作を確認することができます。
<div id="attachment_2601" style="width: 179px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2013/09/2013-09-19-18.27.25.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/09/2013-09-19-18.27.25-169x300.png" alt="position: stickyをMobile Safariで動作させた様子" width="169" height="300" class="size-medium wp-image-2601" srcset="/wp-content/uploads/2013/09/2013-09-19-18.27.25-169x300.png 169w, /wp-content/uploads/2013/09/2013-09-19-18.27.25-576x1024.png 576w, /wp-content/uploads/2013/09/2013-09-19-18.27.25-116x207.png 116w, /wp-content/uploads/2013/09/2013-09-19-18.27.25.png 360w" sizes="(max-width: 169px) 100vw, 169px" /></a><p class="wp-caption-text">position: stickyをMobile Safariで動作させた様子</p></div></p></li>
<li><p><a href="http://www.w3.org/TR/2013/WD-css3-regions-20130528/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Regions</a>・・・複数の要素にまたがってコンテンツを「流しこむ」ことができ、雑誌のようなレイアウトを実現できます。<a href="http://letmespellitoutforyou.com/samples/region_mq_sample.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちらのデモ</a>を試してみてください。</p></li>
<li><a href="http://dev.w3.org/csswg/css-grid/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Grid Layout</a>・・・要素をグリッド状に配置することのできる仕様です。うまく動作しないそうです。</li>
<li><a href="http://dev.w3.org/csswg/css-flexbox/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Flexbox</a>・・・コンテナ上で要素を縦横に柔軟に配置することのできる仕様です。</li>
<li><p>動的なフォント・・・筆者も詳細は理解できていないのですが、「読みやすさを向上するために、現在のフォントサイズをベースとして、フォントの重さや文字の間隔などが調整される、とあります。以下に示すような、<code>-apple-</code>というプレフィックスを持つ定数を多数利用してフォント定義を行っていくようです。</p>

<p>h1 { font: -apple-system-headline1 }
p { font: -apple-system-body }</p></li>
<li><p>CSS Transitionからプレフィックスが取れた</p></li>
<li>丸や四角、多角形などの図形にしたがってコンテンツの切り抜きを行える<a href="http://www.html5rocks.com/en/tutorials/masking/adobe/?redirect_from_locale=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSSクリップパス</a>のサポート。</li>
<li>フォントのカーニングや合字がデフォルトで利用可能になった</li>
<li><a href="http://www.htmq.com/css3/box-decoration-break.shtml" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">box-decoration-break: slice/clone</a>のサポート</li>
<li><a href="https://developer.mozilla.org/ja/docs/Web/CSS/tab-size" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">tab-size</a>のサポート</li>
<li><a href="http://docs.webplatform.org/wiki/css/properties/word-wrap" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">overflow-wrap: normal/hypernate/break-word</a></li>
<li>長さの単位としての<a href="http://www.w3.org/TR/css3-values/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">chやvmaxのサポート</a></li>
<li><a href="http://www.w3.org/TR/css-masking/#the-mask-type" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">mask-type: alpha</a>のサポート</li>
</ul>

<h2>終わりに</h2>

<p>iOS 7のMobile Safariは、Indexed Database APIやWebGL、WebRTCなどの期待される機能は搭載されませんでしたが、細かいアップデートがたくさん行われています。
特に、track要素やCSS Flexboxのサポートは嬉しいですね。
ただ、バグが多いらしいので、Web開発者は頭を悩ませる日々が続きそうです…</p>

<p>この記事では、Webページを記述する際にポイントとなりそうな変更点に絞ってご紹介しました。
繰り返しになりますが、この記事の元になったMaximiliano Firtman氏（<a href="https://twitter.com/firt" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@firt</a>）の<a href="http://www.mobilexweb.com/blog/safari-ios7-html5-problems-apis-review" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ブログ記事</a>は素晴らしいリソースですので、ぜひ一度目を通してみてください。</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
