2020の10日目の記事です。株式会社ビデオマーケットの仙台オフィスでMIRAILのiOS/Androidアプリ開発を担当しているasmzです。業務でiOSアプリでのWebSocketクライアントの実装方法を調査していて、その中でApple公式のAPIとして用意されているURLSessionWebSocketTaskの使い方を初めて知ったので、今回は簡単なWebSocketクライアントを実装しながらその実装方法をまとめてみたいと思います。WebSocketとは詳細は省きますが、Webアプリケーションにおいて双方向通信を実現するための技術仕様です。e-words.jpWebSocketではサーバとクライアントがコネクションを確立後、そのコネクションを用いてメッセージの送受信を行うことで、低コストなリアルタイム通信を可能としています。iOS13より追加されたWebSocketクライアント処理を行うためのクラスで、従来のHTTP通信を行うURLSessionTaskのサブクラスとして実装されています。developer.apple.comdeveloper.apple.comこれまでiOSアプリでWebSocket通信を実装するものとしてはNetwork.frameworkなどがありましたが、URLSessionWebSocketTaskはそれをより手軽に扱えるようにした感じのクラスです。WebSocketクライアント実装それでは早速、具体的な実装方法の説明に入っていきましょう。タスク生成まず最初にURLSessionWebSocketTaskのインスタンスを生成する必要があります。"ws://localhost:5001/")ここでWebSocketサーバのURLを指定します。接続は通常のURLSessionと同様にresume()を実行するだけです。webSocketTask.resume()メッセージ送信コネクションが確立したら、send()でメッセージの送信が可能となります。以下のように文字列とバイナリの列挙型となっており、テキストメッセージとバイナリデータの2種類の形式で送信可能となっています。}}2種類の形式と言っても、JSONなどのテキストで送受信すれば他にもいろんな情報を詰め込むことは可能です。メッセージ受信サーバからのメッセージはreceive()のcompletionHandlerで受けとることができます。Void)ただしここで注意点として、receive()メソッドはメッセージ受信時の1回しか呼ばれません。そのため、継続してメッセージを受信したい場合は、以下のようにreceive()メソッドをWrapし、メッセージ受信後にこのWrapperメソッドを再帰的に呼び出す必要があります。}}この辺、Delegateなど設定すれば自動的に入ってくると良いなと思うのですが、現状そういった方法は用意されていないようです。切断コネクション切断にはcancel()を使用します。Data?)切断時には切断コード値と理由をサーバへ通知することができます。URLSessionWebSocketTask.CloseCodeは以下のように定義されています。nil)接続ステータス監視URLSessionWebSocketDelegateを用いて、WebSocketのコネクションが確立・切断されたタイミングを監視し、アプリ側でハンドリングすることが可能です。Data?)なお、URLSessionWebSocketDelegateはURLSessionTaskDelegateのサブクラスなので、通信エラーなどの場合はURLSessionTask利用時と同じようにurlSession(_:task:didCompleteWithError:)で補足できます。実装サンプルクライアントというわけで、上記の内容を踏まえて簡単なチャット風WebSocketクライアントアプリを用意してみました。github.comWebSocketClientクラスがWebSocketクライアント本体となります。普段の業務ではSwiftUI使っていないのですが、今回は興味本位でSwiftUIで実装してみました。(SwiftUIでの開発には全く慣れていないので、UI周りの実装については正直自信ありません。)サーバ今回のエントリの範疇ではないですが、とりあえず動作確認したかったので雑に以下のNode.jsのサーバをlocalhostに立ち上げました。});});やってることは、単純にクライアントから受信したメッセージを全クライアントに返すだけです。HTTPでの通信となるので、iOSでの実行の際はATS設定が必要です。実行結果シミュレータを2台立ち上げて、同一WebSocketサーバと接続した状態での挙動です。一方のアプリでメッセージを送信すると、もう一方のアプリもリアルタイムでメッセージを受信していることがわかるかと思います。おわりに以上、URLSessionWebSocketTaskを用いたWebSocket通信処理の基本的な実装手順を紹介しました。個人的な感想としてはちょっとreceive()の扱いにクセがあるように思いましたが、公式APIのみでだいぶ手軽にWebSocketが扱えるようになったという印象です。URLSessionWebSocketTaskが使えるのはiOS13以上となりますのでご注意ください。(ここまで調べといて何ですが、私はそれでURLSessionWebSocketTaskを使うのは諦めて、サードパーティ製のライブラリを使用することにしました。00:00関連記事2024-05-30VMAFスコアを可視化するこんにちは。バックエンドエンジニアの阿部です。初めまして、クリエイターブログは初めての投稿です。MIRAILで...2019-08-222019年新卒入社メンバーのOJT研修こんにちは。Engineeringをしている里山です。今回のCRE...2019-07-31Goで実践クリーンアーキテクチャはじめまして。仙台オフィスMIRAILチームのsaisaiです。7はてなブログをはじめよう!vm_creatorsさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。