LINEヤフー Tech Blog

LINEヤフー株式会社のサービスを支える、技術・開発文化を発信しています。

try! Swift Tokyo 2026のブースで展示した「iOSエンジニア性格診断RPG」の裏側

集合写真

こんにちは、iOSエンジニアのyamakenです。

2026年4月12日(日)から14日(火)の3日間にわたり開催された、try! Swift Tokyo 2026に、LINEヤフー株式会社はGOLDスポンサーとして参加しました。また、LINEヤフーからは4名が登壇しました。イベント中は多くの方にブースにお越しいただき、ありがとうございました。

本ブログでは、ブースで展開したアプリについての概要や、技術的なこだわりなどをまとめます。

ブースの概要

今回のブースでは、「iOSエンジニア性格診断RPG」というアプリを展示しました。

アプリのトップ画面

参加者の方には、iOSエンジニアとしての開発スタイルやプロジェクトでの判断に関する質問に答えてもらい、最後に性格に合ったトレーディングカードゲーム風の診断結果が表示される流れです。

また、iOSアプリと展示用のMacアプリを組み合わせ、ブース全体として楽しめる構成にしました。

興味を持ってもらうための工夫

今回のブース設計で重視したのは、参加者の方に足を止めてもらうこと、最後まで楽しんでもらうこと、そして周囲の人にも体験の様子が伝わることです。

一般的な性格診断アプリは、多くの質問に回答し、最後に結果が提示される構成が主流です。しかし、この形式をそのままブース体験として提供するだけでは、体験価値としての面白さを十分に引き出すのが難しいと感じました。

実際のアプリの診断画面

そこで、RPGの世界観で「5日後にアプリをリリースするための緊急対応プロジェクトにアサインされた」というストーリー仕立てにしています。前半5問ではiOSエンジニアとしてのスタイルに関する質問に答え、選択肢に応じた装備を取得します。後半5問では、プロジェクトでのiOSエンジニアあるあるのような状況をモンスター化し、選んだ行動で倒していく構成です。

ミニゲームと診断結果画面

さらに、参加者の皆様に楽しんでいただけるよう、最後にミニゲームも用意しました。

アプリの審査結果をそわそわしながら待つのは、iOSエンジニアあるあるのひとつだと思います。そこで、その感覚を演出としてミニゲームに落とし込み、祈るボタンを10秒間連打して「審査を通す」ゲームにしました。皆さん、唐突に連打を求められ、笑いながら必死に連打していました。

最後の診断結果では、性格に合ったトレーディングカードゲーム風のカードと、Foundation Modelsによって生成された診断結果文、さらにLINEヤフーのサービスの中から相性の良さそうなものを紹介する構成です。

この診断結果をブース全体でも見せるため、Macアプリ側にも工夫を入れています。Macアプリの実際の画面

Mac向けのアプリでは、参加者の皆さんが最後に診断したカードをBluetooth経由で受け取り、カードがたまっていく形にしています。さらに、画面下側には皆さんの回答傾向も割合として表示しています。

カードは数秒ごとにフォーカスが切り替わります。新しいカードが追加されると画面中央にエフェクトが走り、診断アプリを触っていなくてもMacアプリを見るだけで楽しめるようにしています。

遠目からでも「何かカードゲームのようなものが置かれている」と興味を持ってくれる人が増えるのではないかと考え、この形式にしました。

iOSアプリのホーム画面についても、診断結果で表示されるカードをアニメーションでスライドさせることでリッチに見せ、参加者の方に「これ、何をやっているんですか?」と興味を持ってもらう狙いがありました。実際、足を止めて見てくださる方も多く、一定の効果はあったように感じています。

ここからは、この体験を実現するために工夫した技術面を紹介します。

アプリの技術的なところ

ちなみに今回のiOSアプリとMacアプリは、どちらも99% Vibe Codingで実装しました。

Foundation Modelsを2か国語に対応させる

Foundation Modelsの日本語と英語のスクショ

この診断アプリでは、開始する前に言語を日本語と英語から選べる形式にしています。診断結果のFoundation Modelsで生成される文章もその言語に合わせて動的に変化させる必要があります。

生成にあたって、いくつか課題がありました。

  • マイナス要素を書かないでと言っても生成される
  • 言語を日本語に設定しても英語で生成される

よくある性格診断の結果には改善点のような項目があると思います。そこで本アプリでは、「さらに活きる場面」という項目を定義しています。Foundation Modelsへのプロンプトには「マイナス点は書かずに、ユーザーにとってプラスになるようなことを書いて」といった指示を入れていましたが、それでもややネガティブな表現の文章が生成されることがしばしばありました。

後者の言語問題については、日本語を選択したのに英語で出力されたり、その逆も発生するなどの問題にあたりました。

ちょうど悩んでいたところ、try! SwiftのDay 0でFoundation ModelsのWorkshopが開催されることを知って参加し、Workshop終わりにAppleの方に質問して解決できました。

// 修正前
let languageInstruction = outputLanguageCode == "ja"
    ? "always responsed in Japanese."
    : "always responsed in English."

修正前は、上記のように言語指定だけをシンプルに渡していました。言語については responsed in English のような表現よりも、answered in English のほうが高い確率でその言語で回答されること、また大文字にすることでより強くプロンプトの指示ができることが分かり、そのように修正しました。

// 修正後
let languageInstruction = outputLanguageCode == "ja"
    ? "ALWAYS ANSWERED IN JAPANESE."
    : "ALWAYS ANSWERED IN ENGLISH."

ネガティブ表現についても大文字で指示することで解決できました。他にもその言語に合わせてプロンプトの指示自体を日本語、英語で切り替える方法もあるとのことでした。

結果の送受信の難しさ

このアプリでは診断結果表示前にMacからiPhoneへ他の参加者の回答傾向のデータを送信し、最後にiPhoneからMacへ生成されたカード情報と回答結果を送信するようにしています。

診断結果のBLEで受信した割合

これを行うにはさまざまな制約があり、今回はP2P(近距離無線通信)を採用しています。

実装当初は、Wi-FiやBluetoothなどを用いてP2P通信を行うMultipeer Connectivityを採用していました。iPhoneからMacへ素早くデータを送れる点は良かったものの、今回の実装では安定して通信できない場面があり、本番運用には不安があったため採用を見送っています。

最終的には、Core Bluetooth単体を使用して通信を行う構成にしています。開催日前までは通信が途切れることはほぼありませんでした。一方で当日は、周辺に端末が多かったせいか一時的に通信に失敗することもあり、MacとiPhoneのBluetooth設定を一度オン/オフして復旧させる場面もありました。

データの送信周りでの工夫

Mac側ではカードを一覧表示したり、回答傾向を集計したりしたかったため、画像をそのまま送るのではなく、診断結果を表す構造化データを送る設計にしています。カードIDや表示名だけでなく、ATK/DEF、回答履歴、AI診断の要約まで含めることで、受信側で柔軟に再利用できるようにしています。

Bluetoothでは大きなデータを一度に送信することを想定していないため、送信データを分割する必要があります。また、端末によって送れるデータ量の上限が異なるため、その上限も把握する必要がありました。

幸い、Core BluetoothにはmaximumUpdateValueLengthというプロパティがあり、BLE通知で一度に送信できる最大サイズを把握できます。今回はこの値を元に、上限を超えないよう送信データを分割し、JSONパケットに包んで送信する構成にしています。

カード生成

診断結果で表示されるカードのキャラクター画像はAIによって生成しましたが、カードの枠や装飾などはすべてSwiftUIで構成しています。これは、カードのレア度に応じて装飾や色合いを動的に変える必要があるためです。ホログラム風のオーバーレイなどのエフェクトもすべてSwiftで実装でき、よりトレーディングカードらしい見た目になったのではないかと思います。

生成された画像とSwiftで装飾したカード

ちなみにカードは全部で30種類あるのですが、try! Swiftに参加する方々の属性がある程度似ているのか、同じカードが出力されることも多かったです。

アプリ内の演出

ブースに来ていただいた皆さんにどうすれば楽しんでもらえるか、どうすれば満足していただけるかを考え、演出にも力を入れています。

世界観の演出

このアプリでは、昔のRPGゲームのような世界観を表現するためにさまざまな工夫を入れています。世界観の演出を示すスクショ

ドット絵、フォント、レトロ系の効果音、1文字ずつ表示されるタイプライター風の演出、hapticsなどを取り入れています。普段のアプリ開発ではあまり使わない表現も多かったのですが、SwiftやSwiftUIでここまで表現できるのだと実感しました。

ミニゲームの演出

冒頭でも紹介した、祈るボタンを10秒間連打してアプリの審査を通すミニゲームにも工夫を入れています。ただ連打するだけではなく、しっかり入力できている手応えや、演出としての盛り上がりがないと、なかなか面白い体験にはならないと思いました。ミニゲームの段階的な変化を表したスクショ

そこで、タップするたびに祈る絵文字が下から上に飛んでいったり、中央にあるアプリアイコンがバウンスしながらだんだん大きくなったり、波紋のエフェクトが出たりするようにしています。

さらに、一定のタップ数を超えるとレア度が上がり、SpriteKitを用いたスポットライトや細かなエフェクトが追加されます。絵文字の種類も増やすことで、後半に向かって演出の密度が高まる設計です。

最後に

今回作成したアプリは、try! Swiftのブースの2日間のためだけに、2か月以上かけて実装しました。開発序盤はまだ方針もあまり定まっておらず、今とは全く違うものでした。どうすれば来ていただいた皆さんに楽しんでもらえるか、どうしたら面白くなるかを考えているうちに、3回ほど作り直して今回の形になりました。

開催前日まで微調整を入れていたので、本当にこれで楽しんでもらえるのか、とても不安でした。それでも、実際に遊んでくださった方から「面白い!」「クオリティが高いですね」といった感想をいただき、安心するとともに、頑張って作って良かったと心から思えました。ちなみに今回のiOSアプリとMacアプリは、どちらも99% Vibe Codingで実装しました。

また次の機会があれば、今回のコンテンツを超えるようなものをブースで展開したいと思っています。その際は、ぜひ足を運んでいただけたらうれしいです。

改めて、ブースに来ていただいた皆さん、ありがとうございました。

集合写真2