Heim  >  Artikel  >  Web-Frontend  >  Android Dev mit Web-Tools: schnellster Weg zur Produktion mit Ionic React

Android Dev mit Web-Tools: schnellster Weg zur Produktion mit Ionic React

WBOY
WBOYOriginal
2024-08-07 20:53:13800Durchsuche

Investitionen in die Android-Entwicklung können zu einem enormen Gerätemarktanteil, einer größeren Marktreichweite und einer hohen Kapitalrendite führen.

Mit über 6,8 Milliarden Smartphone-Nutzern weltweit. Android hält etwa 70 % des weltweiten Marktanteils, was etwa 4,76 Milliarden Nutzern entspricht. Die Suche nach Ihrer Nische ist in greifbarer Nähe. Es geht darum, qualitativ hochwertige und schnelle Anwendungen zu erstellen.

Ionic ermöglicht Ihnen mit nativen Webkomponenten die Erstellung leistungsstarker und hochwertiger Android-Apps mit vertrauten Tools wie HTML, JavaScript und CSS und gleichzeitig die Nutzung nativer Funktionen mit Capacitor.

Dies ist mehr als nur ein Tutorial zu Ionic; Es geht darum, qualitativ hochwertige und leistungsstarke Android-Anwendungen zu entwickeln, die für die Produktion bereit sind.

Dieser Artikel ist eine Einführung in eine Serie, in der wir die Grundlagen von Ionic mit React als Frontend behandeln und später die Brücke zwischen nativen und Web-Technologien mit Capacitor erkunden.

Ionisches Gerüst: Eine Einführung

Laufzeiten oder Brücken zwischen verschiedenen Technologien sind nichts Neues!

Nehmen Sie zum Beispiel Node.js. Nur durch Node kann JavaScript zu einer Systemsprache werden.

   [JS]
   [byte code]
   [Node] --> [N API] --> [C/C++ modules]
   [bindings]
   [Cpp][V8][libuv]
   [OS]

Erwägen Sie hybride Desktop-Anwendungen, die HTML, JavaScript und CSS als Ansicht über die Webansicht verwenden. Auf dieser Idee basiert Go Wails, ein sehr leistungsfähiges Desktop-Entwicklungsframework. Ebenso funktionieren Rust Tauri-Apps nach diesem Prinzip.

Bindungen existieren und werden schon seit einiger Zeit in der mobilen Welt getestet, mit Beispielen wie React Native und NativeScript.

Die Entwicklungswelt erkennt, wie wichtig nicht nur die Benutzeroberfläche, sondern auch eine schöne und reaktionsfähige Benutzeroberfläche ist. In diesem Bereich gibt es keine so fortschrittlichen Frameworks wie Webtechnologien.

Die native Android-Entwicklung verlagert sich in Richtung React mit zusammensetzbaren Benutzeroberflächen in Kotlin und entfernt sich vom weniger beliebten XML.

Dieser Trend bringt das Beste aus beiden Welten: native Geschwindigkeit mit einer schönen zusammensetzbaren Benutzeroberfläche. Hier sticht Ionic unter seinen Mitbewerbern hervor. Der Unterschied besteht darin, dass Ionic leicht zu verstehen ist – ich habe die Anwendung eines Kunden in weniger als einem Monat erfolgreich erstellt.

Aufstellen

Erstellen Sie einen neuen Projektordner und führen Sie Folgendes aus:

npx ionic start

Dies führt Sie durch die Ionic-Einrichtung. Wählen Sie React als Frontend-Framework für diesen Artikel.

Ionic verwendet weiterhin Webpack und Create React App (CRA), da Vite Schablone.js, den Kern der Ionic-Webkomponenten, noch nicht unterstützt.

Sobald alles installiert ist, öffnen Sie das Projekt in VSCode. Ich bevorzuge es, npm zu entfernen und pnpm zu verwenden (dieser Schritt ist optional). Wenn Sie dasselbe tun möchten:

  • Löschen Sie den Ordner „node_modules“.

  • Löschen Sie die Datei package-lock.json, nicht package.json.

  • Führen Sie die pnpm-Installation aus.

Um eine Ionic-Anwendung auszuführen, verwenden Sie:

npx ionic serve

Die Ionic CLI kümmert sich um alles. Sie können auch die Option --lab für eine telefonähnliche Vorschau verwenden (beachten Sie, dass es sich hierbei nicht um einen Android- oder iOS-Emulator, sondern um eine „Ansicht“ handelt):

pnpm add -D @ionic/lab

npx ionic serve --lab

Android Dev with web Tools: fastest way to production with Ionic React

Dadurch können wir in einer Vorschau sehen, wie die Benutzeroberfläche in einer telefonähnlichen Ansicht aussehen wird.

Die Struktur durchgehen

Ich gehe davon aus, dass Sie das Projekt in einer IDE Ihrer Wahl geöffnet haben. Wenn Sie keine React-Erfahrung haben, kann dies eine kleine Herausforderung sein. Ich schlage vor, ein grundlegendes React-Tutorial zu absolvieren und etwas über React-Router zu lernen.

Der Einstiegspunkt ist ein standardmäßiges React-Anwendungsrendering in index.tsx:

root.render(      

<React.StrictMode>

     <App/>

</React.StrictMode>

  );



In App.tsx handelt es sich um einen Router und eine Tab-Navigationsleiste, die Ionic-Router und -Komponenten verwendet. Ionische Komponenten sind native Webkomponenten, die mit Schablone.js erstellt wurden und so gestaltet sind, dass sie wie eine mobile Anwendung aussehen.

Ionic stellt CSS-Dateien und Themes bereit, die den Standards von iOS und Android entsprechen. Verwenden Sie ionische Komponenten über HTML für ein natürliches Erscheinungsbild mobiler Anwendungen.

Lassen Sie uns App.tsx aufschlüsseln, beginnend mit dem Router. Es funktioniert ähnlich wie der React-Webrouter, ordnet einen Pfad einer Komponente zu und rendert die passende Komponente bei der Navigation.



import Tab1 from './pages/Tab1';

import Tab2 from './pages/Tab2';

import Tab3 from './pages/Tab3';



    <IonRouterOutlet>
          <Route exact path="/tab1">
            <Tab1 />
          </Route>
          <Route exact path="/tab2">
            <Tab2 />
          </Route>
          <Route path="/tab3">
            <Tab3 />
          </Route>
          <Route exact path="/">
            <Redirect to="/tab1" />
          </Route>
     </IonRouterOutlet>

Wenn Sie mit Backend vertraut sind, ist der Pfad wie ein Endpunkt und die Komponente ist ein Handler.

   <IonTabBar slot="bottom">
          <IonTabButton tab="tab1" href="/tab1">
            <IonIcon aria-hidden="true" icon={triangle} />
            <IonLabel>Tab 1</IonLabel>
          </IonTabButton>
          <IonTabButton tab="tab2" href="/tab2">
            <IonIcon aria-hidden="true" icon={ellipse} />
            <IonLabel>Tab 2</IonLabel>
          </IonTabButton>
          <IonTabButton tab="tab3" href="/tab3">
            <IonIcon aria-hidden="true" icon={square} />
            <IonLabel>Tab 3</IonLabel>
          </IonTabButton>
     </IonTabBar>



Die IonTabBar erstellt eine Tab-Leiste am dafür vorgesehenen Steckplatz, in unserer Anwendung unten. Die Magie liegt in der Tab-Schaltfläche: Triggert den Router mithilfe von Hrefs. Alles normale React-Code, verpackt in ionischen Komponenten.

Folgen Sie einer der Registerkarten; Es handelt sich im Wesentlichen nur um Seiten.

   <IonPage>
      <IonHeader>
        <IonToolbar>
          <IonTitle>Tab 1</IonTitle>
        </IonToolbar>
      </IonHeader>
      <IonContent fullscreen>
        <IonHeader collapse="condense">
          <IonToolbar>
            <IonTitle size="large">Tab 1</IonTitle>
          </IonToolbar>
        </IonHeader>
        <ExploreContainer name="Tab 1 page" />
      </IonContent>
    </IonPage>



Mit der Ionic-Seitenkomponente werden Dinge wie Scrollen und Reaktionsfähigkeit sofort erledigt.

Die Standardstruktur einer Ionic-Seite umfasst eine Kopfzeile mit einer Symbolleiste und einem Inhaltsbereich, ähnlich wie bei den meisten mobilen Anwendungen.

Kopfzeile:

  <IonHeader>
        <IonToolbar>
          <IonTitle>Tab 1</IonTitle>
        </IonToolbar>
      </IonHeader>

Inhaltsbereich:



    <IonContent fullscreen>
        <IonHeader collapse="condense">
          <IonToolbar>
            <IonTitle size="large">Tab 1</IonTitle>
          </IonToolbar>
        </IonHeader>
          <ExploreContainer name="Tab 1 page" />
      </IonContent>



The content area occupies most of the screen, where most of the application lives. The ExploreContainer acts as a slot; we can conditionally render components based on the name prop.

<ExploreContainer name="Tab 1 page" />

When name is "Tab 1," we render a component for that tab. You can hard code components for each tab, but the slot method is more flexible and composable.

For example, open the ExploreContainer component under the components folder and create three new components:

const Tab1Content = () => { return ( "I am tab 1 content" ); }

const Tab2Content = () => { return ( "I am tab 2 content" ); }

const Tab3Content = () => { return ( "I am tab 3 content" ); }

Now update the container to conditionally render based on the name prop:

<div className="container">
  {name.includes("Tab 1") ? <Tab1Content /> : name.includes("Tab 2") ? <Tab2Content /> : <Tab3Content />}
</div>


This is just an example; you can create an easy-to-follow pattern matching method. The updated preview should show "I am tab x content" based on the tab clicked.

This application is still web-based. We haven't installed or initialized Capacitor, which is responsible for turning our application into a native app.

Android Dev with web Tools: fastest way to production with Ionic React

Capacitor is a cross-platform native runtime for web apps, allowing us to create cross-platform iOS, Android, and Progressive Web Apps with JavaScript, HTML, and CSS.

Enabling Capacitor in Ionic

First, install Capacitor:

pnpm add @capacitor/core
pnpm add -D @capacitor/cli

Next, initialize the Capacitor configuration file:

npx cap init

The package ID should uniquely identify your app. We use an inverted domain name, e.g., com.example.app.

Capacitor is initialized. Run the following commands to install a Capacitor platform and primitive plugins:

pnpm add @capacitor/android



pnpm add @capacitor/app @capacitor/haptics @capacitor/keyboard @capacitor/status-bar


The following command will create the native android project structure and files in your ionic project:

npx cap add android

Important: Build the web app:

pnpm run build

to avoid this error before we run sync

[error] Could not find the web assets directory: .\build.

... More info: https://capacitorjs.com/docs/basics/workflow#sync-your-project

Once the build is finished, you can sync, copying the built web app; into the native webview:

npx cap sync

Believe it or not, we are ready to either build or preview the native application in an emulator.

We'll dive deeper into Capacitor and native development, environment setup, etc., in the next article.

Since we are still getting a feel for Ionic, let's play with a few Ionic components and wrap up with a simple application example.

PokeApp Example

You can easily find Ionic components in the documentation.

We'll implement a simple app that fetches Pokémon data from the PokeAPI, for a compact card view, and then build it into an APK.

Android Dev with web Tools: fastest way to production with Ionic React

From the results, we can already see how decent the app looks with no styling—thanks to the power of Ionic components.

Open the ExploreContainer component, and we'll work on Tab 2.

Update the component and add the following:

const BASE_LINK = "https://pokeapi.co/api/v2/pokemon/"



const Tab2Content = () => { 



 const [pokemon, setPokemon] = useState("pikachu")



 useEffect(()=> {    

if(pokemon != ""){    

  fetch(BASE_LINK + pokemon).then(async(poke)=> {

       console.log(await poke.json())              

    }).catch((err)=>console.log(err))   

 } 



 }, [pokemon])  



// add some padding to the div below

return  (

  <div style={{padding: ".5em"}}>

        I am tab 2 content  
 </div>

)}

We've added a state to track the Pokémon we want to look up, with the default being Pikachu:

const [pokemon, setPokemon] = useState("pikachu")

On load, we fetch the Pokémon data from the PokeAPI:

 useEffect(()=> {    

if(pokemon != ""){    

  fetch(BASE_LINK + pokemon).then(async(poke)=> {

       console.log(await poke.json())              

    }).catch((err)=>console.log(err))    } 

 }, [pokemon])  



Android Dev with web Tools: fastest way to production with Ionic React

The useEffect hook runs twice in React strict mode.

Instead of logging our result, let's turn it into a state so we can use it in our card component.

First, add a new useState under the Pokémon one:

 const [showResults, setResults] = useState()

Then, update the useEffect to set the results::



 useEffect(()=> {
    if(pokemon != ""){
      fetch(BASE_LINK + pokemon).then(async(poke)=> {


       const results = await poke.json()
       const {front_default} = results.sprites
       setResults({front_default})


      }).catch((err)=> console.log(err))
    }
  }, [pokemon])

The PokeAPI returns a lot of data. We are interested in the Pokémon image, specifically the front-facing image in the sprites object:

       const results = await poke.json()
       const {front_default} = results.sprites
       setResults({front_default})

If you are familiar with React, you know we have created the re-render on state change loop already. Now, we just need to consume the data:



 return  (
  <div style={{padding: ".5em"}}>
 <IonCard>
      <IonCardHeader>
        <IonCardTitle>{pokemon}</IonCardTitle>

      </IonCardHeader>

      <IonCardContent>
         <img src={showResults ? showResults.front_default : ""} />
      </IonCardContent>
    </IonCard>
  </div>
  )

We use an Ion card component to show the retrieved image:



   <IonCardContent>
         <img src={showResults ? showResults.front_default : ""} />
      </IonCardContent>



We have a basic structure already, but we can only show the default Pokémon. We need a way to accept user input (a Pokémon name) and make a fetch request based on that input.

The basic React approach is to have an input element bound to a useState value, updating it on onChange. However, in our case, this is problematic because every keystroke will trigger our useEffect, making multiple erroneous requests to the PokeAPI.

Instead, we need the user to type fully and press a search button to initiate the API call. Copy the code below and paste it on top of the Ion card:



 <IonItem>
        <IonInput aria-label="Pokemon" value={pokemon} ref={pokeNameref}></IonInput>
      </IonItem>
      <IonButton onClick={()=> PokeSearch() }>search</IonButton>

</IonItem>



From the code above, we need two things: a useRef pointing to our Ion input and a PokeSearch function triggered by an Ion button.

const Tab2Content = () => {
  const [pokemon, setPokemon] = useState("pikachu")
  const [showResults, setResults] = useState<any>()
  const pokeNameref = useRef<any>(null)

  const PokeSearch = () => {

    if(pokeNameref.current){

      console.log(pokeNameref.current.value)
         setPokemon(pokeNameref.current.value.toLocaleLowerCase())
    }
  }



....



}

The code below is responsible for updating the state, triggering the effect

 if(pokeNameref.current){

      console.log(pokeNameref.current.value)
         setPokemon(pokeNameref.current.value.toLocaleLowerCase())
    }



The entire component:

const Tab2Content = () => {
  const [pokemon, setPokemon] = useState("pikachu")
  const [showResults, setResults] = useState<any>()
  const pokeNameref = useRef<any>(null)

  const PokeSearch = () => {

    if(pokeNameref.current){

      console.log(pokeNameref.current.value)
      setPokemon(pokeNameref.current.value.toLocaleLowerCase())
    }
  }

  useEffect(()=> {
    if(pokemon != ""){
      fetch(BASE_LINK + pokemon).then(async(poke)=> {
       const results = await poke.json()
       console.log(results.sprites)
       const {front_default} = results.sprites
       setResults({front_default})
      }).catch((err)=> console.log(err))
    }
  }, [pokemon])

  return  (
  <div style={{padding: ".5em"}}>
      <IonItem>
        <IonInput aria-label="Pokemon" value={pokemon} ref={pokeNameref}></IonInput>
      </IonItem>
      <IonButton onClick={()=> PokeSearch() }>search</IonButton>
 <IonCard>
      <IonCardHeader>
        <IonCardTitle>{pokemon}</IonCardTitle>

      </IonCardHeader>

      <IonCardContent>
         <img src={showResults ? showResults.front_default : ""} />
      </IonCardContent>
    </IonCard>
  </div>
  )
}



Our simple PokeApp is complete. Make sure ionic serve --lab is running and type a few Pokémon names, such as:

bulbasaur dragonite

If everything is set up correctly, the Pokémon should change on search.

Not a life-changing application, but enough for learning Ionic. The next step requires Android Studio . Download it and follow the defaults while installing it.

PokeApp to APK

If you have never seen Android Studio, it’s probably the most complex IDE and has a steep learning curve!

I suggest following the defaults on installation and letting it run its course. My only suggestion is to select the option to install an emulator, which makes it easier to build and review the APK before bundling it.

When you download Android Studio for the first time, it'll download a lot of dependencies and set up Gradle, which may take some time. Let it do its thing. Gradle is a build tool for Android, similar to how we use Webpack or Vite in web development.

When you are ready and Android Studio is installed, navigate to our PokeApp in the terminal.

As an extra precaution, build and sync before opening the project in Android Studio to ensure there are no errors:

pnpm run build

npx cap sync

If the build is successful, we can rest assured there are no errors in our application. Next, open the project in Android Studio:

npx cap open android

Let the Gradle processes run:

Android Dev with web Tools: fastest way to production with Ionic React

When Gradle is done, try running the app in an emulator (top middle) in the IDE. If the app runs on the emulator, you can be sure it'll bundle to a standalone APK:

Android Dev with web Tools: fastest way to production with Ionic React

Check this extensive link for more ways to debug and run your APK: android studio run

Notes on Building the APK

There are a few steps involved in building an actual production APK for the Google Play Store, from setting up an Android console to creating banner images, which are tedious but essential tasks.

Note: The Android development account is a one-time fee. You can buy and set it up on Google Console.

Design, search keywords, and banners are beyond coding. This series is about getting the coding part right! I promise everything else will fall into place with practice and getting used to the tediousness of the Google Play Console.

In short, I will skip the Google Play Console for a few reasons:

  • It takes a while (2 weeks minimum) to get approved.
    When approved, the APK goes through a vetting process (takes time, may fail).

  • You can't submit an APK on Google Console unless you have banners and icons.

  • There is a lot of editing and icon generation for different screens.

These reasons make it impractical to include in a tutorial. But rest assured, what I will show you in this and upcoming articles will prepare you to build production-ready applications to publish in any store besides Google or for self-hosting.

However, if you already have a Google Play account, there are many articles and videos on publishing an Ionic Android app.

For our case, as long as we can generate a debug APK file and install it on an emulator or real phone, the other steps are just a Google search away!

Because this process is tedious, I will dedicate a separate article in this series to go through Android Studio, sign an APK, and build a release. For now, a debug APK will suffice as this article is already long.

Generating a debug apk

Look at your Android Studio top bar left; after the Android icon, there should be a hamburger menu button. Select to expand the menu. The build option is hidden there:

Android Dev with web Tools: fastest way to production with Ionic React

If the APK is generated successfully, a popup should show at the bottom right with a locate option, which will open the explorer to the APK path. You can share or install it on an Android device!

If you want to create a signed APK, the full production deal, Google has an extensive documentation

This was a high-level overview. We will go deeper with each article in the series.

In diesem Artikel haben wir die Android-Entwicklung mithilfe von Webtools vorgestellt und unser bevorzugtes Framework war Ionic. Wir haben die Grundlagen von Ionic und Ionic-Komponenten behandelt, wie man den nativen Laufzeitbrückenkondensator einrichtet und ein Debug-APK erstellt.

Wenn Sie bereit sind, tief in Capacitor einzutauchen, finden Sie hier den nächsten Artikel: Capacitor JS: Die Brücke zwischen Web-Technologie und Native – Android, IOS, PWA

Das ist erst der Anfang.

Wenn Sie an längeren, exklusiven und praktischen Inhalten interessiert sind, habe ich Stufen und Beiträge, die Ihre Programmierkenntnisse auf der Ko-Fi-Plattform verbessern sollen.

Das obige ist der detaillierte Inhalt vonAndroid Dev mit Web-Tools: schnellster Weg zur Produktion mit Ionic React. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn