React Nativeをリアルタイムで：パブ/サブ、ジオロケーション、プレゼンス
Published: 2024-03-08 19:17:03

今日のペースの速い世界では、私たちの注意力が低下するにつれて、シームレスなインタラクティビティへの需要が急増し続けています。サーバーの回転や画像の読み込みによる遅延は、真にリアルタイムのユーザーエクスペリエンスを妨げます。ますますメディアを消費する社会では、ウェブサイトやIoTデバイスのロードを待つことは古臭く感じられる。私は今5Gの接続性を持っているのに、なぜ依存関係に対処することを強いられなければならないのか」といった考えが、頻繁にユーザーの頭をよぎる。

このブログの目的は、私の視点からアプリケーションの未来を予測し、アプリをスピードとセキュリティの現在の標準に適応させることのシンプルさを説明することである。これは、言語やフレームワーク、あるいはプロジェクト実行のためのnpmパッケージのような単純なものの選択を考えている専門家にとって、特に適切なものとなる。リアルタイムの時代は急速に近づいており、このスピードに合わせて進化しないシステムは取り残される可能性が高い。

このリアルタイム環境のエスカレートは、テクノロジーのエコシステムに革命をもたらした。新しい技術が進歩するたびに、私たちはデジタル体験をシームレスに統合し、より速い成果を達成することに一歩ずつ近づいている。素人にとっては、これはイベントハンドラやプッシュ通知を通じてUberの運転手の位置をリアルタイムで認識することにつながる。開発者にとっては、Pub/Subモデルを通じて世界中のデバイスを統合し、迅速でスムーズな[接続体験への](https://www.pubnub.com/blog/connected-shared-experiences-a-developers-guide/)扉を開くことになる。

リアクトネイティブのリアルタイムトレンド
--------------------

インスタントなデータを求める現代の消費者の出現とNode.jsの機能が相まって、メッセージを受け取るのに何日も待つことが許容されていた時代は過ぎ去りました。サービスが瞬時でない場合、ユーザーはすぐに代わりのものを探します。

新しい接続速度が世界中で利用可能になるにつれて、このリアルタイムでインタラクティブな世界に参加する人の数は増加の一途をたどっている。米国内での[ライドシェアリングやフードデリバリー・サービスの](https://www.pubnub.com/blog/the-biggest-technological-trend-shaping-the-on-demand-economy/)成長と並んで、同じ産業が東南アジアやインドでもブームを迎えている。インドで人気のSwiggyやZomatoのようなフードデリバリー・サービスは、1日に50万件以上の配達をこなしている。これらのビジネスとその消費者は、Pythonによるリアルタイムのjsonデータストリームに大きく依存している。こうしたサービスの提供が、実験的なベンチャーから、世界中の日常生活に不可欠なものになりつつあることは明らかだ。

5Gの採用が進み、ウェブアプリケーションやモバイルアプリケーションが進歩する中、潜在的なボトルネックを防ぐために、ソフトウェアのデータ転送速度を向上させることが最も重要です。アプリケーションは今やリアルタイムで更新する力を持ち、人々のコネクティビティを触媒している。リアルタイムの応答性を持つReact Nativeは、テクノロジーへの依存度を高める理想的なソリューションです。

リアルタイムのReact Nativeとは？
----------------------

スピードへのニーズに応えるため、フェイスブックの開発者たちはReactとして知られるJavaScriptフレームワークと、それに続くJSファイルの使用を開始した。Reactは、JavaScriptとJavaScript構文拡張（JSX）を使用して、高速で軽量なウェブページの作成を可能にする。JSXは、JavaScriptの機能を保持しながら、XMLのようなフォーマットでユーザーインターフェースを設計することを容易にする。さらに、Reactはウェブページの的を絞った更新を可能にし、修正のためにページを完全にリロードする必要性をなくすため、ウェブサイトを高速化し、ユーザー体験を豊かにする。

ウェブページ専用に設計されたReactの誕生に続き、そのコンポーネント構造はReact Nativeへと拡張された。このテクノロジーは、Reactと同様の原理でモバイルアプリケーションを作成できる。JavaScriptを処理し、モバイル・デバイス上で直接実行し、ブリッジを使って各コンポーネントをiOSやAndroidのネイティブ・コンポーネントに接続する。ブリッジは、実行中のJavaScriptがネイティブ・コンポーネントに情報を中継するのを容易にする。

React Nativeは、コンポーネントが他のコンポーネントを含むことができるコンポーネント構造を活用している。特定のコンポーネントに関連するデータが変更されると、そのコンポーネントだけが再レンダリングされる。この選択的な再レンダリングにより、アプリやウェブページはより速く、よりスムーズで、より効率的になる。ReactとReact Nativeにはこのシステムが組み込まれているため、リアルタイム・アプリケーションを作成するための優れたリソースとなる。

しかし、React Nativeはリアルタイムチャットアプリケーションの理想的な基盤ではあるが、必要な接続サービスを提供していない。そこでPubNubが、APIキーとセキュアな認証メカニズムによって実現されるシームレスでセキュアな接続体験をユーザーに提供することで、ギャップを埋めるのです。

なぜリアルタイムサービスとしてPubNubを使うべきか？
----------------------------

ベースアプリとしてReact Nativeを使用する場合、デバイスやユーザー間の接続を確立するためのメカニズムが必要になります。そこでPubNubが適切なソリューションとして登場する。PubNubは単にユーザーを接続するだけでなく、それを迅速に行う。PubNubのPoP（Points of Presence：戦略的に配置された世界中のデータセンターで、データのローカライズを改善し、待ち時間を短縮する）のグローバルネットワークは、真のグローバルサービスを提供することを可能にする。React Nativeと組み合わせることで、ユーザーを共通の共有体験でつなぐことができる。

PubNubは、Pub/Sub（パブリッシュ/サブスクライブ）やその他多くの機能をすぐに利用できる、主要なリアルタイムネットワークプロバイダーのひとつです。PubNubは月間100万メッセージまで無料で利用できる！この寛大な無料層に加えて、PubNubは使いやすく、あなたのプロジェクトにいくつかのスターターコードをドロップして接続し、最小限の手間でPub/Subメッセージングを開始することができます。

もうサーバーのセットアップや複数の接続に悩む必要はありません。PubNubはバックエンドの責任を負い、クライアントにとって重要な情報をクライアントに通知します。PubNubは強固なPub/Subインフラを提供し、その上に構築することができます。データを送信するだけで、PubNubは各ユーザーに確実に届きます。この文脈でPubNubのパブサブ、履歴、プレゼンス機能を探ります。

以降のセクションでは、起動プロセスについて説明し、一般的なReact Nativeのユースケースに有益なコード・スニペットについて掘り下げていきます。

リアルタイムReact Nativeの基本
---------------------

リアルタイム・アプリの一般的な機能を構築するのに役立つPubNubの機能をいくつかレビューします。各例でコードスニペットと詳細情報へのリンクを提供します。

### PubNubをReact Nativeに接続する

ターミナルに次のコードを入力して、PubNubをReact Nativeプロジェクトにインストールします。これにより、依存関係もネイティブにインストールされます。

```js
npm install pubnub
```

以下は、PubNubの使用を開始するために必要なすべてのコンポーネントを備えた一般的なReact Nativeアプリの外観の例です。

```js
import React, { Component } from 'react';
import PubNub from 'pubnub';

export default class App extends Component {
  constructor(props) {
    super(props);

    // Initialize a PubNub instance
    this.pubnub = new PubNub({
      publishKey: "INSERT PUBLISH KEY HERE",
      subscribeKey: "INSERT SUBSCRIBE KEY HERE",
      uuid: "yourUniqueUserId" // Optionally set a UUID for this client
    });

    this.state = {
      // Your initial state
    };

    // Bind your event handlers if necessary
    // this.someEventHandler = this.someEventHandler.bind(this);
  }

  componentDidMount() {
    // Set up PubNub listeners and subscribe to channels
    this.pubnub.addListener({
      message: (message) => {
        // Handle new messages
        console.log(message);
      },
      presence: (presenceEvent) => {
        // Handle presence events
      }
      // Add other event handlers as needed
    });
  }

  componentWillUnmount() {
    // Unsubscribe from all channels
    this.pubnub.unsubscribeAll();
  }

  // Your component methods...

  render() {
    // Your render method...
    return (
      <div>
        {/* Your component UI */}
      </div>
    );
  }
}
```

このコードスニペットでは、まずファイルの先頭でPubNubをインポートします。コンポーネントのコンストラクタ内では、コールバックベースのシステムによってPubNubオブジェクトを作成し、キーを挿入します。ステートオブジェクトを作成したら、PubNubオブジェクトの\`init\`関数を使用します。React NativeでPubNubをセットアップする詳細な説明については、[PubNub React SDKドキュメントを](https://pubnub.com/docs/sdks/javascript/react)参照してください。

### パブリッシュとサブスクライブ

[Pub/Sub Messagingは](https://www.pubnub.com/features/pub-sub-messaging/)PubNubのコア機能です。ほとんどのユースケースでは、アプリをリアルタイムにするために何らかのバージョンのPub/Subが必要です。Pub/Subは単一の関数呼び出しで構成されます。Publishにオブジェクトや文字列を含めることができ、チャンネルに登録されている人は誰でも一瞬でメッセージを受け取ることができます。たったこれだけだ。受信したメッセージを処理するメッセージ・ハンドラを作成することもできる。

```js
 setupListeners() {
    this.pubnub.addListener({
      message: (messageEvent) => {
        console.log(messageEvent.message.name + " loves " + messageEvent.message.awesomeRDSN);
      },
      presence: (presenceEvent) => {
        // Handle presence events if needed
        console.log(presenceEvent);
      }
    });

    this.pubnub.subscribe({
      channels: ["channel1"],
      withPresence: true
    });
  }

  publishMessage() {
    this.pubnub.publish({
      message: {
        name: "Samba",
        awesomeRDSN: "PubNub"
      },
      channel: "channel1"
    }, (status, response) => {
      if (status.error) {
        // Handle publish error
        console.error(status);
      } else {
        console.log("Message Published", response);
      }
    });
  }
```

### メッセージング

チャットアプリやチャットアプリケーションでのメッセージングは、Pub/Subの優れたユースケースです。1対1、多対多、またはその中間の組み合わせであっても、PubNubはすべて処理できます。テーマ設定のためにCSSを使用して[React Nativeでチャットアプリを作成](https://www.pubnub.com/blog/build-a-fully-featured-react-chat-app/)する包括的なチュートリアルシリーズがあります。

### 保存と再生

メッセージの保存と取得はメッセージングアプリにとって重要な要素です。以下は、参照できる履歴呼び出しのサンプルです。

```js
function fetchHistory() {
  pubnub.history({
      channel: 'channel1',
      count: 100 // You can adjust this number up to the maximum allowed by your PubNub plan
    },
    (status, response) => {
      if (status.error) {
        // Handle the error case
        console.error('Error retrieving history:', status);
        return;
      }

      // Success - output the response
      console.log('History response:', response);
    }
  );
}
```

このコードスニペットでは、PubNubの\`history\`関数を利用しています。この関数はPubNubオブジェクトと引数のセットを受け取り、指定したPubNubチャンネルで送信された過去のメッセージを取得できます。過去のメッセージを含む呼び出しからの応答は、アプリケーションの要求に応じて表示、解析、または利用することができます。この機能の詳細については、更新された[Storage & Playbackドキュメントを](https://pubnub.com/docs/sdks/javascript/react)参照してください。

### ジオロケーション

PubNubを使用すると、位置情報のライブストリーミングや近接通知のトリガーが簡単になります。[react-native-mapsを](https://github.com/react-native-maps/react-native-maps)統合することで、\`MapView\`コンポーネントとその子コンポーネントをインポートしてインタラクティブな地理体験を作成できます。提供されるマーカーは、ユースケースに合わせて配置したりカスタマイズしたりできます。

```js
import MapView, {Marker} from 'react-native-maps';
```

PubNubのパワーを使えば、強力でフル機能のiOSおよびAndroidアプリケーションを作成できます。これらのアプリケーションは、あなたのデバイス上で、あるいはシミュレータ上で実行することができ、堅牢で汎用性の高いプラットフォームを提供します。では、なぜ待つのでしょうか？React NativeとPubNubを使って、今すぐリアルタイムアプリケーションの構築を始めましょう！

```js
import React, { Component } from 'react';
import { View } from 'react-native';
import MapView, { Marker } from 'react-native-maps';
import PubNub from 'pubnub';

export default class MapsExample extends Component {
  constructor(props) {
    super(props);

    this.state = {
      region: {
        latitude: 37.78825,
        longitude: -122.4324,
        latitudeDelta: 0.0922,
        longitudeDelta: 0.0421,
      },
      markers: [],
    };

    this.pubnub = new PubNub({
      publishKey: 'your-publish-key',
      subscribeKey: 'your-subscribe-key',
      uuid: "yourUniqueUserId"
    });

    this.onRegionChange = this.onRegionChange.bind(this);
  }

  componentDidMount() {
    this.watchPosition();
  }

  watchPosition() {
    navigator.geolocation.watchPosition(
      position => {
        const { latitude, longitude } = position.coords;
        this.pubnub.publish({
          message: {
            uuid: this.pubnub.getUUID(),
            latitude,
            longitude,
          },
          channel: "global"
        });

        // Update state to re-render markers if needed
        this.setState(prevState => ({
          markers: [
            ...prevState.markers,
            {
              latlng: { latitude, longitude },
              title: "User Location",
              description: "Current user position."
            }
          ]
        }));
      },
      error => console.log("Maps Error: ", error),
      {
        enableHighAccuracy: false,
        distanceFilter: 100
      }
    );
  }

  onRegionChange(region) {
    this.setState({ region });
  }

  render() {
    return (
      <View style={{ flex: 1 }}>
        <MapView
          style={{ flex: 1 }}
          region={this.state.region}
          onRegionChange={this.onRegionChange}
        >
          {this.state.markers.map((marker, index) => (
            <Marker
              key={index}
              coordinate={marker.latlng}
              title={marker.title}
              description={marker.description}
            />
          ))}
        </MapView>
      </View>
    );
  }
}
```

上記のコード・スニペットでは、デバイスがあらかじめ決められた距離を移動するたびに、デバイスの座標を公開する機能を設定しています。こうすることで、継続的な位置情報の更新を保証している。React Nativeで地理追跡チャットアプリを作成し、pub/sub機能を使用するための包括的なガイドについては、[リアルタイム地理追跡アプリの構築に関する](https://pubnub.com/blog/realtime-geo-tracking-app-react-native/)チュートリアルを参照してください。

### モバイルプッシュ通知とIoT

PubNubはリアルタイムインタラクションのために設計されているだけでなく、[モバイルプッシュ通知の](https://www.pubnub.com/products/mobile-push-notifications/)発信をサポートし、IoT関連のニーズに対応します。プッシュ通知機能は、アプリがアクティブに使用されていないときでもユーザーに更新情報を通知し、シームレスなユーザー体験を提供します。iOSのAPNSとAndroidのFCMの両方をサポートすることで、デバイスを問わず幅広いカバレッジを確保します。

PubNubはnpmをサポートし、依存関係を処理するための直感的なCLIを提供します。JSファイルにmapViewやreactをインポートするのは簡単です。PubNubのセキュアなサーバーレスアーキテクチャを使用することで、バックエンドの機能にNode.jsとPythonのパワーを活用することができます。PubNub APIキーは簡単な認証を提供します。PublishキーとSubscribeキーを使用して、JSONファイル形式のデータストリームをアプリケーションと共有します。

PubNubを使用する利点は、簡単に設定できるパーミッションとイベントハンドラが用意されていることで、チャットアプリケーションでの使用に効果的です。Flutter、React Native Mapsを使用している場合でも、CSSを使用してさまざまなプラットフォームで作業している場合でも、PubNubを使用するとアプリの構築プロセスが効率的になります。

React Nativeアプリケーションに[モバイルプッシュ通知を](https://pubnub.com/docs/messages/push/send)統合する方法について詳しく学びましょう。また、チャットアプリケーションでスムーズでリアルタイムのインタラクションを行うためのコールバック関数の扱い方についても学びましょう。

残りのセクションも同様の方法で続き、より深い内容を追加し、用語を明確にし、より最新の参考文献やガイドを提供し、一般的な問題のトラブルシューティングを行い、関連する統計情報を組み込みます。結論として、読者自身がPubNubを試してみるように呼びかける。また、すべてのリンクが機能しているか、ビジュアル、図、GIFが最新かどうかも再確認します。

最後に、PubNubのシミュレータの改善などの新機能や進歩があれば強調し、開発者がリアルタイムインタラクションのニーズに対して信頼できるプラットフォームを提供するというPubNubの継続的なコミットメントを強調します。

#### 目次

[React Nativeのリアルタイムトレンド](#h-0)[React Nativeのリアルタイムサービスとは？](#h-1)[なぜPubNubをリアルタイムサービスとして使うべきなのか？](#h-2)[リアルタイムReact Nativeの基本](#h-3)[PubNubとReact Nativeの](#h-4)[接続](#h-3)[公開と購読メッセージング](#h-5)[保存と再生](#h-7)[ジオロケーションモバイルプッシュ通知とIoT](#h-9)

PubNubはどのように役立つのか？
==================

この記事は[PubNub.com](https://www.pubnub.com/blog/pubnub-react-native-basics-pub-sub-history-gelocation-presence/)に掲載されたものです。

PubNubのプラットフォームは、開発者がWebアプリ、モバイルアプリ、IoTデバイス向けにリアルタイムのインタラクティブ機能を構築、配信、管理できるように支援します。

私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。

PubNubを体験
---------

[ライブツアーを](https://www.pubnub.com/tour/introduction/)チェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ
------

[PubNubアカウントに](https://admin.pubnub.com/signup/)サインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める
---

[PubNubのドキュメントは](https://www.pubnub.com/docs)、ユースケースや[SDKに](https://www.pubnub.com/docs)関係なく、あなたを立ち上げ、実行することができます。