<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>React Native on ITフリーランスの備忘的なにか</title>
    <link>https://zac-lab.com/tags/react-native/</link>
    <description>Recent content in React Native on ITフリーランスの備忘的なにか</description>
    <generator>Hugo -- 0.143.0</generator>
    <language>ja</language>
    <lastBuildDate>Thu, 01 May 2025 13:09:53 +0900</lastBuildDate>
    <atom:link href="https://zac-lab.com/tags/react-native/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>React Native(Expo) でAdMobを設定する</title>
      <link>https://zac-lab.com/posts/20250501/</link>
      <pubDate>Thu, 01 May 2025 13:09:53 +0900</pubDate>
      <guid>https://zac-lab.com/posts/20250501/</guid>
      <description>React NativeとExpoで開発したAndroidアプリにAdMob広告を実装する手順を解説。react-native-google-mobile-adsライブラリの設定から広告コンポーネントの実装まで、個人開発者向けの実践的なガイドです。</description>
      <content:encoded><![CDATA[<h2 id="はじめに">はじめに</h2>
<p>先日、初めてReact Nativeを触ってみたという<a href="/posts/20250418/">ポスト</a>
をしました。</p>
<p>まずはAndroidアプリを公開したいと考えており、組織アカウントとして登録するためにDUNS Numberの取得申請中でございます。
（東京商工リサーチで申請し、7営業日程たちますが、まだ音沙汰なしです。。）</p>
<p>スマホアプリで収益を得たいと考えていますが、まずは一番ハードルが低そうな広告収入を目指していきます。</p>
<p>今回は、Expoで作ったAndroidアプリに、react-native-google-mobile-adsライブラリを使ってAdMobを設置する手順をご紹介します。</p>
<h2 id="1-admobの設定手順">1. AdMobの設定手順</h2>
<h3 id="google-admobのアカウント作成とアプリ登録">Google AdMobのアカウント作成とアプリ登録</h3>
<p>AdMob（<a href="https://admob.google.com/" target="_blank">https://admob.google.com/</a>
）にアクセスし、ユーザー登録します。</p>
<p>その後、アプリを追加します。</p>
<p><img alt="新しいアプリの設定" loading="lazy" src="/posts/20250501/screen1.png"></p>
<p>プラットフォームは「Android」を選択、まだストアにアプリを公開していないので、「いいえ」を選択。</p>
<p><img alt="アプリ名の設定" loading="lazy" src="/posts/20250501/screen2.png"></p>
<p>アプリの名前を入力し、「アプリを追加」をクリック。</p>
<p><img alt="アプリ作成完了" loading="lazy" src="/posts/20250501/screen3.png"></p>
<p>アプリの作成が完了しました。「完了」をクリック。</p>
<p><img alt="アプリ作成後" loading="lazy" src="/posts/20250501/screen4.png"></p>
<h3 id="広告ユニットの作成">広告ユニットの作成</h3>
<p>次は、広告ユニットを作成します。「広告ユニットを追加」をクリック。</p>
<p><img alt="広告ユニットの作成1" loading="lazy" src="/posts/20250501/screen5.png"></p>
<p>広告のフォーマットがいくつかあります。起動時に全面表示するものだったり、全部見たら報酬を得られる系のものだったり。今回は、単純に画面の一部に広告が表示されればよいため、「バナー」を選択。</p>
<p><img alt="広告ユニットの作成2" loading="lazy" src="/posts/20250501/screen6.png"></p>
<p>広告ユニット名には、自分で識別できるように適当に名前を付けて、「広告ユニットの作成」をクリック。</p>
<p><img alt="広告ユニットの作成完了" loading="lazy" src="/posts/20250501/screen7.png"></p>
<p>広告ユニットの作成が完了したら、アプリIDと広告ユニットIDが表示されるので、コピーしておきます。
（こちらの画像の広告ユニットIDは、すでに無効となっています）</p>
<h2 id="2-expoアプリへの実装">2. Expoアプリへの実装</h2>
<h3 id="ライブラリのインストール">ライブラリのインストール</h3>
<p><code>react-native-google-mobile-ads</code>をインストールします。最新バージョン（v15）をインストールしたところ後続手順でビルドエラーが発生したため、v14でインストールするようにしました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npx expo install react-native-google-mobile-ads@14.11.0
</span></span></code></pre></div><h3 id="appjsonの設定">app.jsonの設定</h3>
<p>react-native-google-mobile-adsをインストールすると、app.jsonに&quot;react-native-google-mobile-ads&quot;の記載が追加されていると思います。</p>
<p>その部分を、以下のように修正します。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>[
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;react-native-google-mobile-ads&#34;</span>,
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;android_app_id&#34;</span>: <span style="color:#e6db74">&#34;ca-app-pub-6970209880901801~7980726474&#34;</span>  <span style="color:#75715e">// アプリIDを設定します
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    }
</span></span><span style="display:flex;"><span>]
</span></span></code></pre></div><h3 id="開発ビルドの作成">開発ビルドの作成</h3>
<p>広告を使用するには、Expo Goのみでは対応できないので、開発ビルドを行う必要があります。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npx eas-cli build --profile development
</span></span></code></pre></div><p>ビルドが完了したら、表示されているQRコードをスマホで読み取ってリンクに飛び、Installボタンを押してダウンロードおよびインストールを行います。</p>
<p>その後、<code>npx expo start</code>で開発サーバーを起動した上で、アプリを起動しておきます。</p>
<h3 id="広告コンポーネントの実装">広告コンポーネントの実装</h3>
<p>実際に、アプリに広告を配置してみます。</p>
<p>アプリの初回起動時に、SDKの初期化を行う必要があるようです。
とりあえずホーム画面においてuseEffectで初回時のみ初期化するようにしてみました。
もしかしたらもっといいやり方があるかもしれません。
参考までに。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#66d9ef">import</span> <span style="color:#a6e22e">mobileAds</span>, { <span style="color:#a6e22e">BannerAd</span>, <span style="color:#a6e22e">BannerAdSize</span>, <span style="color:#a6e22e">TestIds</span> } <span style="color:#66d9ef">from</span> <span style="color:#e6db74">&#39;react-native-google-mobile-ads&#39;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// アプリの初回起動時にSDKを初期化
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">useEffect</span>(() <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">mobileAds</span>()
</span></span><span style="display:flex;"><span>        .<span style="color:#a6e22e">initialize</span>()
</span></span><span style="display:flex;"><span>        .<span style="color:#a6e22e">then</span>(() <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;AdMob SDK initialized&#39;</span>);
</span></span><span style="display:flex;"><span>        });
</span></span><span style="display:flex;"><span>}, []);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// テスト広告の設定
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">adUnitId</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">TestIds</span>.<span style="color:#a6e22e">BANNER</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// バナー広告のコンポーネント
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>&lt;<span style="color:#f92672">BannerAd</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">unitId</span><span style="color:#f92672">=</span>{<span style="color:#a6e22e">adUnitId</span>}
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">size</span><span style="color:#f92672">=</span>{<span style="color:#a6e22e">BannerAdSize</span>.<span style="color:#a6e22e">MEDIUM_RECTANGLE</span>}
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">requestOptions</span><span style="color:#f92672">=</span>{{
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">requestNonPersonalizedAdsOnly</span>: <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>    }}
</span></span><span style="display:flex;"><span>/&gt;
</span></span></code></pre></div><p>開発時は、テスト広告しか表示してはいけないようです。
本番アプリではTestIds.BANNERの部分を、先ほど取得した広告ユニットIDに差し替えてください。</p>
<p>sizeには、幾つかの種類があります。<code>ANCHORED_ADAPTIVE_BANNER</code>だと横幅いっぱいに広がってくれるため、様々なサイズの端末に対応できるということでおすすめです。</p>
<p>私のアプリには高さが足りないと感じたため、もう少し存在感のある、<code>MEDIUM_RECTANGLE</code>を使ってみました。</p>
<h2 id="まとめ">まとめ</h2>
<p>React Native + Expoで構築するスマホアプリに、AdMob広告を貼る手順をご紹介しました。</p>
<p>色々試行錯誤していた時は、Bare workflowにする必要がある（ネイティブコードをいじる必要がある）という情報も転がっていたのでハマってしまいました。</p>
<p>実際にはBare workflowにする必要はなく、Managed workflowのまま開発を進められました。</p>
<p>おそらく以前は対応していなかったものが後々対されるようになったという感じでしょうかね。</p>
<p>Managed workflowのまま、広告貼れるよというお話でした。</p>
]]></content:encoded>
    </item>
    <item>
      <title>スマホアプリ開発に挑戦：React NativeとExpoで始める個人開発</title>
      <link>https://zac-lab.com/posts/20250418/</link>
      <pubDate>Fri, 18 Apr 2025 11:29:18 +0900</pubDate>
      <guid>https://zac-lab.com/posts/20250418/</guid>
      <description>React NativeとExpoを使用したスマホアプリ開発の始め方と、Google Play Consoleでのアプリ公開までの道のりを解説。個人開発者としての挑戦と課題についても紹介します。</description>
      <content:encoded><![CDATA[<h2 id="はじめに">はじめに</h2>
<p>これまでWeb開発を中心に行ってきた私が、新たな挑戦としてスマホアプリ開発に取り組むことにしました。Android StudioやKotlinでの開発経験はあるものの、コード量の多さや学習の難しさから断念した過去があります。しかし、自己啓発と収益化の可能性を考え、まずはAndroidアプリから始めてみることにしました。</p>
<h2 id="技術選定react-native-vs-flutter">技術選定：React Native vs Flutter</h2>
<p>スマホアプリ開発の主要な選択肢として、React NativeとFlutterが挙げられます。X（旧Twitter）で個人開発者の投稿を見ると、Flutterを採用している方が多い印象でした。しかし、Reactの経験がある私にとっては、React Nativeの方が学習コストが低いと判断し、Cursorと共に開発を始めることにしました。</p>
<p>Cursorに最新のReact Nativeドキュメントを読み込ませて、順に一緒にやってもらいました。余談ですが、今後新しい技術がでてきたら、とりあえずドキュメントを読ませてハンズオンを一緒にやってみるのが一番早いのかなと思ってます。</p>
<p>最新のドキュメントを読んではいたものの、古いコマンドを提案してきていたようで途中でうまく起動せず、結局ドキュメントで最新のコマンドを探して打つという・・（笑）まああるあるですね。</p>
<h2 id="react-native--expoでの開発の流れ">React Native + Expoでの開発の流れ</h2>
<p>細かい話は省略しますが、ざっくりと開発の流れを記載します。</p>
<h3 id="1-初期セットアップ">1. 初期セットアップ</h3>
<p>Expoを使用することで、開発のハードルを大幅に下げることができました。VSCodeで開発できる点も大きなメリットです。以前はAndroid Studioが必要でしたが、その重さと待ち時間の長さがネックでした。</p>
<p>プロジェクトの作成は以下のコマンドで簡単に行えます。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npx create-expo-app@latest
</span></span></code></pre></div><p>その後、以下のコマンドで開発サーバーを起動します。（tunnelオプションを付けないとExpo Goアプリがブルースクリーンになりました）</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npx expo start --tunnel
</span></span></code></pre></div><p>驚くほどReactと開発体験が似てますね。すばらしい。</p>
<h3 id="2-expo-goでの開発">2. Expo Goでの開発</h3>
<p>そしてExpo GoアプリをGoogle Play ストアから探してインストールします。
（Expoでアカウント登録もしました）</p>
<p><code>npx expo start</code> でターミナルに表示されたQRコードを、Expo Goアプリから起動したスキャナで読み取ると、デフォルトアプリが動き出します。</p>
<p>コードを修正すると、ホットリロードでスマホ側に即座に修正が反映されます。</p>
<p>以前は、実機で確認するには毎回ビルドして転送コードでファイルを転送して、というのが必要だった記憶があるので、スピーディーにできるようになりましたね。</p>
<p>開発自体も、コンポーネントをどんどん配置していくという流れがReactの開発と非常によく似ています。これほどスムーズにWebアプリ開発からスマホアプリ開発に移行できるとは。食わず嫌いせずにもっと早くやってればよかったです。</p>
<p>実際の仕様決めやコード実装は、生成AIと協働で進めていきます。まずはシンプルなアプリを作って公開するまでの一連の手順を経験してみたいと思います。</p>
<h3 id="3-開発ビルドの作成">3. 開発ビルドの作成</h3>
<p>ある程度開発が進んでくると、Expo Goだけでは対応できなくなってくるので、ちゃんとビルドして実機で動かせるようにする必要があります。
ドキュメントでは、唐突に「Development Build」を作る的な話になるので、最初は混乱しました。
要するに、Expo Goアプリというのは、Expoの開発体験をお試しできるように作られた、プレビュー用のアプリという位置付けのようです。</p>
<p>標準的な機能しか対応しておらず、ちょっとコミいったことをしようと思ったら、改めてビルドして実機にインストールして動作させる必要があります。</p>
<p>開発ビルドをゲットするには、プロジェクトに<code>expo-dev-client</code>ライブラリを追加した上で、EASというビルド用のツールを使います。</p>
<p>下記コマンドにより、Androidアプリの開発用にビルドを作成できます。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>eas build --platform android --profile development
</span></span></code></pre></div><p>ビルドの時間は10～15分程かかりました。
ビルドが終了したら、スマホでExpoの開発者ページに飛んでファイルをダウンロードして実行すると、勝手にインストールが開始されます。
（ビルドは時間が長いので、途中でターミナルを閉じても問題ないようです。しばらくしてからExpoの開発者ページに飛べば、インストールのボタンが表示されています。）</p>
<p>開発ビルドを動作させるには、Expo Goと同様、起動コマンドが必要になります。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npx expo start --tunnel
</span></span></code></pre></div><p>Expo Goの時と同じコマンドですが、プロジェクトに<code>expo-dev-client</code>がインストールされていれば、開発ビルドが使用するサーバーが自動的に立ち上がるようです。</p>
<p>ビルドの待ち時間は長いですが、開発ビルドもExpo Goと同様、基本的にはコードを修正したらホットリロードでリアルタイム反映されるので、開発体験としてそれほど変わりません。
なので、一度Expo Goでの開発を経験したら、次回からは最初からDevelopment Buildを使って開発を進めるでもいいかなと思いました。</p>
<p>ただ、アプリの設定に関わるようなこと（ロゴマークなどの変更なども含めて）を変えた場合には、毎回ビルドしなおさないと反映されないようです。</p>
<h3 id="4-内部配布用ビルドの作成">4. 内部配布用ビルドの作成</h3>
<p>内部配布用のビルドは以下のコマンドで作成できます。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>eas build --platform android --profile preview
</span></span></code></pre></div><p>上記コマンドを実行し、ビルドが完了するまで待つと、インストール用のURLが発行されます。
リンクを知っている人だけが、各自の実機にアプリをインストールできるようになるというわけです。</p>
<h3 id="5-ストア提出用ビルドの作成">5. ストア提出用ビルドの作成</h3>
<p>そして、いよいよストア提出用のビルド。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>eas build --platform android --profile production
</span></span></code></pre></div><p>同様にしばらく待つと、開発者ページにダウンロードのボタンが表示されます。</p>
<h2 id="google-play-consoleでの課題">Google Play Consoleでの課題</h2>
<p>アプリの公開を目指す中で、Google Play Consoleでの登録時に思いがけない課題に直面しました。</p>
<h3 id="個人情報の公開問題">個人情報の公開問題</h3>
<p>ストア提出用のアプリは準備OK！これをGoogle Play Consoleからアップロードして審査を通れば晴れてストアに公開できるはず、と思ったのですが、思いがけない弊害がありました。</p>
<p>まず、開発者として登録するためには最初に払いきりの$25を支払う必要があります。
これは想定していたのですが、アカウントの登録をしていると、氏名や住所が公開されるとあるじゃないですか。</p>
<p>確かに数年前にアカウント確認が厳しくなるという話は聞いていたのですが、住所まで公開されるとは把握しておらず。</p>
<p>ざっと調査したところによると、開発者アカウントは、組織アカウントか個人アカウントのいずれかを選択する必要があるようです。以下、あくまでもご参考まで。</p>
<p><strong>組織アカウントの場合：</strong></p>
<ul>
<li>氏名＋住所が公開される</li>
<li>氏名は屋号でもOK（ただし公式に政府が発行した資料、もしくは公共料金の領収証などを提出する必要がある）</li>
<li>DUNS（ダンズ）ナンバーを取得し、申請する必要がある。（ナンバーは東京商工リサーチのサイトから取得できる）</li>
</ul>
<p><strong>個人アカウントの場合：</strong></p>
<ul>
<li>有料コンテンツ販売しているアカウントであれば、氏名＋住所が公開される</li>
<li>無料のみならば、氏名と国のみ公開される</li>
<li>テスト要件が厳しくなっている。20名で14日間クローズドテストを実施しないと、アプリの申請ができないようになっているらしい。</li>
</ul>
<p>ちなみに、有料コンテンツ販売しているアカウントとは、「有料アプリやアプリ内購入が可能なアプリ」になるそうで、AdMob広告のみの場合は該当しないようです。
ただし、過去に一度でも（テストのためであっても）報酬を受け取るように有効化したアカウントについては有料扱いみたいです。</p>
<p>また、これは全く知らなかったのですが、個人アカウントだとテスト要件が厳しくなっています。
20人にインストールしてもらうとなると、かなり厳しい印象。
みんなでクローズドテストを乗り切ろう的なコミュニティはあるようですが、他人の開発した、どんな悪意あるコードが埋め込まれてるか分からないアプリなんてインストールしたくないよなぁ、と思ってしまいました。（インストールしてもらうためには、自分も協力しないとなわけで。）</p>
<h3 id="今後の対応策">今後の対応策</h3>
<p>個人開発者が締め出されているといわれていますが、皆さんブログなどで対応策を発信してくださっていて、本当にありがたい。今のところ、以下の対応をとろうと考えています。</p>
<ol>
<li>
<p><strong>バーチャルオフィスで公開用の住所を取得する</strong></p>
<ul>
<li>DMMバーチャルオフィス（郵便転送サービス付きで660円/月のミニマムプランがよさそう）を契約する</li>
</ul>
</li>
<li>
<p><strong>新規に電話番号を取得する</strong></p>
<ul>
<li>POVO2.0を契約する</li>
<li>基本的には受電のみなら0円、半年に一度数百円程度の有料トッピングを購入する必要がある</li>
<li>現在使っているスマホでデュアルSIMが対応できたので、eSIMとして追加する</li>
</ul>
</li>
<li>
<p><strong>開業届を修正申告する</strong></p>
<ul>
<li>すでに提出はしていますが、現在は屋号を使っていないので、新しく屋号を登録します</li>
<li>事業所の新設として申請します。（通常、申請する必要はないですが、あえて印鑑付きの書面が欲しいので）</li>
<li>e-Taxでもとれるけど、印鑑あった方が後々楽なので、管轄の税務署に出向こうと思います。（腰が重い…）</li>
</ul>
</li>
<li>
<p><strong>組織アカウントとして登録する</strong></p>
<ul>
<li>上記対策を実施後、組織アカウントとして登録予定</li>
</ul>
</li>
</ol>
<h2 id="さいごに">さいごに</h2>
<p>スマホアプリの開発においてはまだまだヒヨッコの開発者ですが、なんとか安全にストア公開まで持っていけるように頑張ります！
詳細な対策の進捗については、また別の記事で報告させていただきます。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
