برنامه نویسی

ایجاد اپلیکیشن‌های کوچکی که شگفت‌انگیز هستند: چگونه با استفاده از هر فریم‌ورک JS و پورتال Ionic، برنامه‌های موبایلی شیک و سریع بسازیم

تصور کنید که توسعه دهنده یک اپلیکیشن موبایل کیف پول آنلاین هستید و صاحب سینمای محلی با درخواستی به شما مراجعه می کند. او از شما می‌خواهد قابلیتی را به برنامه اضافه کنید که به کاربران امکان می‌دهد مستقیماً از برنامه صندلی رزرو کرده و هزینه پرداخت کنند. شما با خوشحالی متعهد می شوید و شروع به کار روی نسخه های اندروید و iOS می کنید. پس از راه اندازی موفقیت آمیز، شخص دیگری به شما نزدیک می شود و از شما می پرسد که آیا می توانید فروشگاه آنلاین او را به برنامه خود اضافه کنید تا مشتریان بتوانند مستقیماً از آنجا هزینه کالا را پرداخت کنند. شما شروع به نگرانی در مورد بزرگتر شدن برنامه با این همه ویژگی های جدید می کنید. شما نمی خواهید که کاربران مجبور به دانلود یک میلیارد گیگابایت برنامه فقط برای پرداخت هزینه بلیط فیلم خود باشند.

چه خواهید کرد؟ بیایید با هم این موضوع را حل کنیم.

ما به راه‌هایی فکر می‌کنیم که برنامه را برای همه این ویژگی‌های جدید سبک‌تر و آسان‌تر کنیم. یک ایده این است که از راه حل های مبتنی بر وب برای پرداخت و رزرو به طور مستقیم از برنامه استفاده کنید. برای ساده سازی یکپارچه سازی تا حد امکان، می توانیم یک JavaScript SDK ایجاد کنیم.

پس از کمی تحقیق، پروژه تیم Ionic به نام Ionic Portals را کشف می کنیم. با توجه به مستندات، این یک مؤلفه نمایش وب بومی سوپرشارژ شده برای iOS و Android است. با Ionic Portals، ما می توانیم:

  • برنامه های بومی را با محتوای وب گسترش دهید. این به کاربران امکان می دهد ویژگی ها و تجربیات مبتنی بر وب را به یک برنامه تلفن همراه بومی موجود اضافه کنند.
  • از طریق پل خازن به ویژگی های بومی دسترسی پیدا کنید. دسترسی ایمن و ایمن به ویژگی هایی مانند دوربین، موقعیت جغرافیایی، لمسی و غیره – همه از نمای وب. به این ترتیب می‌توانیم با استفاده از وب، تجربیات واقعی تلفن همراه را ارائه دهیم.
  • کنترل دسترسی به ویژگی ها و داده های بومی تیم های توسعه بومی کنترل دقیقی بر قسمت هایی از برنامه – از جمله ویژگی ها و داده های خاص – تیم های وب در هنگام همکاری در یک پروژه تلفن همراه دارند. …

به طور خلاصه، Ionic Portals راه حل مناسبی برای مشکل ما است. این به ما امکان می دهد تا ویژگی های مبتنی بر وب را به برنامه خود اضافه کنیم بدون اینکه آن را سنگین کنیم. همچنین یک راه امن برای دسترسی به ویژگی‌ها و داده‌های بومی ارائه می‌کند، به این معنی که می‌توانیم با استفاده از وب، تجربه‌های واقعی تلفن همراه را ارائه کنیم و برنامه را سبک، کارآمد و کاربرپسند کنیم. با این کار، می‌توانیم کاربران خود را راضی نگه داریم و از پاپ کورن آن‌ها در حین تماشای آخرین بلاک‌باستر لذت ببریم.

بریم به کسب و کار برسیم! برای ساده‌تر کردن فرآیند یکپارچه‌سازی، می‌خواهیم یک JavaScript SDK بنویسیم. ما یک کتابخانه برای تعامل برنامه های کاربردی وب با یک برنامه بومی ایجاد می کنیم و آن را در npm منتشر می کنیم. پس از کمی تغییرات، یک پروژه تایپ اسکریپت با استفاده از vite ایجاد کردم و یک فایل message.ts ایجاد کردم. این فایل برای شروع شامل 4 روش است (واردات لازم و بخش های گمشده کد را می توان در مخزن Github پیدا کرد و JS SDK را می توان به راحتی از طریق npm نصب کرد.):

import Portals, { getInitialContext } from "@ionic/portals";
import {
  IInitialContext,
  IMessage,
  IMessageSubscription,
  IPortalSubscription,
  ISubscribeOptions,
  ISubscriptionCallback,
} from "./types";

export const SendMessage = async (params: IMessage) => {
  return Portals.publish<IMessage>(params);
};

export const SubscribeToMessage = async (
  options: ISubscribeOptions,
  callback: ISubscriptionCallback
): Promise<IPortalSubscription> => {
  return Portals.subscribe<IMessageSubscription>(options, callback);
};

export const UnsubscribeFromMessage = async (
  options: IPortalSubscription
): Promise<void> => {
  return Portals.unsubscribe(options);
};

export const GetInitialContext = <T = unknown>():
  | IInitialContext<T>
  | undefined => {
  return getInitialContext();
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما در حال ایجاد یک پروژه frontend با استفاده از برنامه معروف Create-React-App هستیم. و بهترین راه برای شروع چیست؟ البته با ایجاد یک پروژه react خالی! بیایید یک جزء ایجاد کنیم:

import { useEffect, useState, useCallback, useRef } from "react";
import {
  SendMessage,
  SubscribeToMessage,
  UnsubscribeFromMessage,
  GetInitialContext,
  IPortalSubscription,
} from "js-miniapp-bridge";
import { MESSAGE_TOPICS } from "./constants";

function App() {
  const tokenSubscriptionRef = useRef<IPortalSubscription>();
  const initialContext = GetInitialContext<{ data: string }>();
  const [message, setMessage] = useState("");
  const [subscribeToTokenSuccessResponse, setSubscribeToTokenSuccessResponse] =
    useState<Partial<IPortalSubscription>>({});
  const [context, setContext] = useState(initialContext);

  const handlePublishToken = async () => {
    SendMessage({
      topic: MESSAGE_TOPICS.ACCOUNT_TOKEN,
      data: message,
    });
  };

  const subscribeToTokenCallback = (result: { topic: string; data: string }) => {
    setSubscribeToTokenSuccessResponse(result);
  };

  const subscribeToToken = useCallback(async () => {
    try {
      tokenSubscriptionRef.current = await SubscribeToMessage(
        { topic: MESSAGE_TOPICS.CHAT_MESSAGE },
        subscribeToTokenCallback
      );
    } catch (e) {
      setsubscribeToTokenErrorResponse(e);
    }
  }, []);

  const handleChangeInput = (e: React.ChangeEvent<HTMLInputElement>) => {
    setMessage(e.target.value);
  };

  useEffect(() => {
    subscribeToToken();

    return () => {
      UnsubscribeFromMessage(tokenSubscriptionRef.current!);
    };
  }, [subscribeToToken]);

  useEffect(() => {
    setContext(initialContext);
  }, [initialContext]);

  return (
    <div className="App">
      <div>
        <b>Subscribe Token Success Result:</b>
        <pre>{JSON.stringify(subscribeToTokenSuccessResponse, null, 4)}</pre>
      </div>
      <hr />
      <div>
        <b>Initial Context Result:</b>
        <pre>{JSON.stringify(context, null, 4)}</pre>
      </div>
      <hr />
      <div>
        <b>Message:</b>
      </div>
      <div>
        <input value={message} onChange={handleChangeInput} />
      </div>
      <button onClick={() => handlePublishToken()}>
        Publish/Send Message
      </button>
    </div>
  );
}

export default App;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون باید اپلیکیشنی بسازیم که بتواند مشترک شود و پیام ارسال کند. برای انجام این کار، یک پروژه React Native ایجاد می کنیم و کامپوننت لازم را ایجاد می کنیم:

import React, {useState} from 'react';
import {SafeAreaView, ScrollView, View, Text, Button} from 'react-native';

import {
  PortalView,
  publish,
  subscribe,
  unsubscribe,
} from '@ionic/portals-react-native';
import initializePortals from './initializePortals';

initializePortals();

function App(): JSX.Element {
  const [subscribeTokenSuccessResponse, setSubscribeTokenSuccessResponse] =
    useState(null);

  const subscribeToTokenRef = React.useRef<number>();

  const handlePublishToken = async () => {
    publish('CHAT_MESSAGE', 'token from native');
  };

  const subscribeToTokenCallback = (result: {topic: string; data: any}) => {
    setSubscribeTokenSuccessResponse(result);
  };

  const subscribeToToken = React.useCallback(async () => {
    subscribeToTokenRef.current = await subscribe(
      'ACCOUNT_TOKEN',
      subscribeToTokenCallback,
    );
  }, []);

  React.useEffect(() => {
    subscribeToToken();

    return () => {
      unsubscribe('ACCOUNT_TOKEN', subscribeToTokenRef.current!);
    };
  }, [subscribeToToken]);

  return (
    <SafeAreaView>
      <ScrollView contentInsetAdjustmentBehavior="automatic">
        <View>
          <PortalView
            portal={{
              name: 'hello',
              initialContext: {
                data: 'Initial data from Native',
              },
            }}
          />
          <Text>Subscribe Token Success Result:</Text>
          <Text>
            {JSON.stringify(subscribeTokenSuccessResponse || '', null, 4)}
          </Text>
          <Button title="Publish Token" onPress={handlePublishToken} />
        </View>
      </ScrollView>
    </SafeAreaView>
  );
}

export default App;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و بس. ما یک برنامه کاربردی سبک وزن، کارآمد و کاربرپسند ایجاد کرده ایم که هنوز همه ویژگی های لازم را ارائه می دهد. با کلیک بر روی این لینک می توانید نتیجه را در نمایش ویدیویی مشاهده کنید.

با استفاده از این روش، ما به تعادلی دست خواهیم یافت که در آن کاربران می توانند یک برنامه سبک وزن داشته باشند که همچنان تمام ویژگی های مورد نیاز خود را ارائه می دهد.

همانطور که قبلا ذکر شد، تمام کدها را می توان در GitHub یافت. اگر سوال یا بازخوردی دارید، لطفاً نظر بدهید. من از ورودی شما قدردانی می کنم. روز خوبی داشته باشی!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا