<पी> यदि आप एक वेब डेवलपर हैं जो ऐप डेवलपमेंट के बारे में नहीं जानते (मेरी तरह!), तो यह लेख आपके लिए है। मैं आपको सिखाऊंगा कि नई रूपरेखाओं या भाषाओं के बिना अपनी वेबसाइट को एक मूल ऐप में कैसे बदला जाए। आप सीखेंगे कि किसी वेबसाइट को PWA (प्रोग्रेसिव वेब ऐप) में कैसे परिवर्तित किया जाए जिसे आप Play Store पर प्रकाशित कर सकते हैं। <पी> सबसे पहले, हम आपकी वेबसाइट को प्रोग्रेसिव वेब ऐप (PWA) में बदल देंगे। फिर हम Google के एक निःशुल्क कमांड-लाइन टूल का उपयोग करेंगे, जिसे बबलव्रैप कहा जाता है उस PWA को एंड्रॉइड ऐप में पैकेज करने के लिए। आइए शुरू करें। आवश्यकताएँ
<पी> यदि आप इस ट्यूटोरियल का अनुसरण करते हैं, तो कुछ आवश्यक शर्तें हैं: - <पी> वेब विकास का बुनियादी ज्ञान
- <पी> आपकी साइट जनता के लिए लाइव होनी चाहिए, और आपको इसके स्रोत कोड तक पहुंच की आवश्यकता होगी।
- <पी> हम आवश्यक उपकरण स्थापित करने के लिए npm का उपयोग करेंगे, इसलिए सुनिश्चित करें कि आपके पास Node.js स्थापित है।
<पी> ध्यान दें: यह ट्यूटोरियल एक Vite पर आधारित है प्रोजेक्ट, लेकिन बबलरैप के साथ अंतिम चरण किसी भी वेब फ्रेमवर्क के लिए समान हैं। सामग्री तालिका
- <पी> PWA क्या है?
- <पी> बबलरैप क्या है?
- <पी> TWA (विश्वसनीय वेब गतिविधि) क्या है?
- <पी> TWA विश्वास का सत्यापन कैसे करता है
- <पी> चरण 1 - अपने PWA को Vite में कॉन्फ़िगर करें
- <पी> अपने ऐप आइकन बनाएं
- <पी> Vite PWA प्लगइन इंस्टॉल करें।
- <पी> प्लगइन कॉन्फ़िगर करें
- <पी> चरण 2 - एंड्रॉइड ऐप बनाएं
- <पी> एक बिल्ड फ़ोल्डर बनाएं
- <पी> बबलरैप सीएलआई स्थापित करें
- <पी> प्रोजेक्ट आरंभ करें
- <पी> आइए init कमांड का समस्या निवारण करें।
- <पी> चरण 3 - बबलरैप प्रश्नों के उत्तर दें
- <पी> चरण 4 - ऐप बनाएं
- <पी> चरण 5 - TWA सत्यापन स्थापित करना
- <पी> .सुप्रसिद्ध फ़ोल्डर क्या है?
- <पी> प्रतिनिधि_अनुमति/common.handle_all_urls क्या है?
- <पी> चरण 6 (वैकल्पिक) - इन-ऐप अनुभव को अनुकूलित करें
- <पी> समापन
PWA क्या है?
<पी> PWA का मतलब प्रगतिशील वेब एप्लिकेशन है , और इसका लक्ष्य आपकी वेबसाइट को एक देशी ऐप की तरह दिखाना और महसूस कराना है। यदि आप अपने ब्राउज़र में किसी वेबसाइट पर गए हैं और एक इंस्टॉल आइकन देखा है जो आपको इसे अपने फ़ोन या लैपटॉप पर डाउनलोड करने देता है, तो आपने PWA का उपयोग किया है। <पी> लेकिन यह केवल रूप और अनुभव के बारे में नहीं है। PWA में ऐप जैसी सुविधाएं भी होती हैं, जैसे ऑफ़लाइन काम करना, पुश नोटिफिकेशन भेजना, और भी बहुत कुछ। <पी> PWA के दो मुख्य घटक हैं। - <पी> मेनिफेस्ट फ़ाइल आपके ऐप का वर्णन करती है, जैसे उसका नाम, आइकन, प्रारंभ URL, इत्यादि।
- <पी> सर्विस वर्कर एक पृष्ठभूमि जावास्क्रिप्ट फ़ाइल है जो प्रॉक्सी के रूप में कार्य करती है। कैशिंग और पुश नोटिफिकेशन को एक सेवा फ़ाइल द्वारा नियंत्रित किया जाता है, जो मुख्य थ्रेड के अलावा एक अलग थ्रेड के रूप में चलता है।
<पी> इन दो घटकों के बिना, ब्राउज़र उपयोगकर्ताओं को स्थानीय रूप से ऐप डाउनलोड नहीं करने देंगे। <पी> मेनिफेस्ट फ़ाइल और सेवा कार्यकर्ता ब्राउज़र के लिए एक चेकलिस्ट की तरह हैं। जब आप किसी वेबसाइट पर जाते हैं, तो ब्राउज़र इन दोनों घटकों की तलाश करता है। यदि वे मौजूद हैं और सही ढंग से कॉन्फ़िगर किए गए हैं, तो ब्राउज़र जानता है कि यह एक सच्चा PWA है और "इंस्टॉल" आइकन दिखाएगा, जिससे उपयोगकर्ता स्थानीय रूप से ऐप डाउनलोड कर सकेंगे। उनके बिना, ब्राउज़र बस एक नियमित वेबसाइट देखता है, और इंस्टॉल करने का विकल्प उपलब्ध नहीं होगा। बबलरैप क्या है?
<पी> बबलव्रैप Google द्वारा बनाया गया एक कमांड-लाइन टूल है जो आपका PWA लेता है और इसे एक विश्वसनीय वेब गतिविधि (TWA) का उपयोग करके एक एंड्रॉइड ऐप में बदल देता है। <पी> बबलव्रैप TWA बनाने की प्रक्रिया को सरल बनाता है, PWA की मेनिफेस्ट फ़ाइल को एंड्रॉइड ऐप पैकेज (APK या AAB) में बदल देता है। TWA (विश्वसनीय वेब गतिविधि) क्या है?
<पी> विश्वसनीय वेब गतिविधि (टीडब्ल्यूए) एक आधुनिक एंड्रॉइड सुविधा है जो आपको एंड्रॉइड ऐप के अंदर अपनी लाइव वेबसाइट को पूर्ण-स्क्रीन प्रदर्शित करने की सुविधा देती है। मूल रूप से, यह ब्राउज़र पर वेबसाइट चलाता है, लेकिन यह ऐप पर ब्राउज़र एड्रेस बार नहीं दिखाता है। इससे इसे एक देशी ऐप जैसा महसूस करने में मदद मिलती है। <पी> इस फ़ुल-स्क्रीन सुविधा को अनलॉक करने के लिए, आपके ऐप को "विश्वसनीय" होना आवश्यक है। <पी> यहीं पर "गुप्त हैंडशेक" आता है। एंड्रॉइड को यह सुनिश्चित करना होगा कि ऐप बनाने वाला व्यक्ति और वेबसाइट का मालिक एक ही है। स्वामित्व के इस प्रमाण के बिना, TWA फ़ॉलबैक मोड में चलेगा और शीर्ष पर ब्राउज़र एड्रेस बार दिखाएगा, जिससे मूल ऐप का अनुभव ख़राब हो जाएगा। TWA विश्वास का सत्यापन कैसे करता है
<पी> इस ट्रस्ट को डिजिटल एसेट लिंक्स नामक प्रणाली का उपयोग करके सत्यापित किया जाता है . आप अपनी वेबसाइट पर एक विशेष फ़ाइल रखते हैं (हम इसे कार्यान्वयन भाग में करेंगे) जिसमें आपके ऐप का अद्वितीय डिजिटल फ़िंगरप्रिंट होता है। जब कोई उपयोगकर्ता आपका ऐप खोलता है, तो एंड्रॉइड ओएस इस फ़ाइल की जांच करता है। यदि उंगलियों के निशान मेल खाते हैं, तो यह आपके ऐप को "विश्वसनीय" स्थिति प्रदान करता है, पता बार हटा देता है, और डीप लिंकिंग जैसी अन्य सुविधाओं को सक्षम करता है। <पी> आप Google के आधिकारिक परीक्षण टूल:डिजिटल एसेट लिंक वेरिफायर का उपयोग करके स्वयं इस संबंध की जांच कर सकते हैं। <पी> अब जब आप प्रोजेक्ट और टूल को समझ गए हैं, तो आइए निर्माण शुरू करें। चरण 1 - अपने PWA को Vite में कॉन्फ़िगर करें
<पी> पहला कदम PWA के लिए दो मुख्य घटकों को जोड़ना है:मेनिफेस्ट फ़ाइल और सर्विस वर्कर। यही वह चीज़ है जो ब्राउज़र को इसे "इंस्टॉल करने योग्य" के रूप में पहचानने की अनुमति देगी। <पी> यह गाइड Vite के साथ निर्मित एक प्रोजेक्ट पर आधारित है, जो एक विशेष प्लगइन के साथ इस प्रक्रिया को आसान बनाता है। यदि आप किसी भिन्न टूल का उपयोग कर रहे हैं, तो अवधारणाएँ समान हैं, लेकिन आपको अपने परिवेश के लिए विशिष्ट चरणों के बारे में विभिन्न संसाधनों को देखने की आवश्यकता होगी। अपना ऐप आइकन बनाएं
<पी> किसी भी कोड को छूने से पहले, हमें अपने ऐप के लिए आइकन की आवश्यकता होती है। एंड्रॉइड को ऐप के लॉन्चर आइकन (जो आप अपनी होम स्क्रीन पर देखते हैं) और स्प्लैश स्क्रीन (ऐप शुरू होने पर आप जो देखते हैं) के लिए विशिष्ट आकार की आवश्यकता होती है। <पी> आपको दो मुख्य आकारों की आवश्यकता होगी:192x192 पिक्सेल और 512x512 पिक्सेल. आप संबंधित आकारों में अपना लोगो बनाने के लिए इस फ़ेविकॉन जेनरेटर का उपयोग कर सकते हैं। आप अपना मुख्य लोगो अपलोड कर सकते हैं, और यह आपके लिए सभी आवश्यक आकार उत्पन्न करेगा। <पी> फिर बस जेनरेट की गई फ़ाइलें डाउनलोड करें और 192x192 डालें और 512x512 public में फ़ाइलें आपके प्रोजेक्ट का फ़ोल्डर. <पी>
Vite PWA प्लगइन इंस्टॉल करें।
<पी> PWA को एक मेनिफेस्ट फ़ाइल और एक सेवा कार्यकर्ता की आवश्यकता होती है। हम इन्हें मैन्युअल रूप से बना सकते हैं, लेकिन यह प्लगइन उस पूरी प्रक्रिया को स्वचालित करता है। यह स्वचालित रूप से एक manifest.json उत्पन्न करेगा और service-worker.js हर बार जब आप अपना प्रोजेक्ट बनाते हैं तो आपके लिए। npm install vite-plugin-pwa -D
प्लगइन कॉन्फ़िगर करें
<पी> इस चरण में, हम इस प्लगइन का उपयोग करेंगे और अपने ऐप के मेनिफेस्ट को कॉन्फ़िगर करेंगे। vite.config.ts संपादित करें फ़ाइल. यह कॉन्फ़िगरेशन प्लगइन को बताएगा कि आपके ऐप को क्या नाम देना है, कौन से आइकन का उपयोग करना है, इत्यादि। <पी> vite.config.ts में : export default defineConfig({
plugins: [
VitePWA({
registerType: "autoUpdate",
manifest: {
name: "your app name",
short_name: "your app short name",
description: "write any description",
theme_color: "#0d1117",
background_color: "#ffffff",
display: "standalone",
start_url: "/",
icons: [
{
src: "/web-app-manifest-192x192.png",
sizes: "192x192",
type: "image/png",
},
{
src: "/web-app-manifest-512x512.png",
sizes: "512x512",
type: "image/png",
},
],
},
}),
]
<पी> अब, जब आप npm run build चलाते हैं , प्लगइन स्वचालित रूप से आपके लिए मेनिफेस्ट और सर्विस वर्कर फ़ाइलें उत्पन्न करेगा। ऐसा करने के बाद, परिवर्तनों को तैनात करें। अब आपकी वेबसाइट एक PWA है. चरण 2 - एंड्रॉइड ऐप बनाएं
<पी> अब जब आपकी वेबसाइट एक PWA है, तो आइए इसे एंड्रॉइड ऐप में पैकेज करने के लिए बबलव्रैप का उपयोग करें। एक बिल्ड फ़ोल्डर बनाएं
<पी> अपनी एंड्रॉइड प्रोजेक्ट फ़ाइलों के लिए एक समर्पित फ़ोल्डर बनाएं। अपने प्रोजेक्ट के रूट में, एक नया फ़ोल्डर बनाएं। मैं अपना android पर कॉल करूंगा . project/
├── client/
├── server/
└── android/
<पी> अब आपके द्वारा बनाए गए नए फ़ोल्डर पर नेविगेट करें। बबलरैप सीएलआई स्थापित करें
npm install -g @bubblewrap/cli
प्रोजेक्ट प्रारंभ करें
<पी> इसके बाद, init चलाएँ आदेश. बबलरैप आपकी लाइव वेबसाइट से कनेक्ट हो जाएगा, manifest.webmanifest पढ़ें वह फ़ाइल जिसे Vite ने बनाया है, और उस जानकारी का उपयोग एक बुनियादी Android प्रोजेक्ट बनाने के लिए करें। bubblewrap init --manifest=https://your-website-domain/manifest.webmanifest
<पी> your-website-domain को प्रतिस्थापित करते हुए कमांड चलाएँ आपके वास्तविक URL के साथ: आइए init का समस्या निवारण करें आदेश
<पी> जैसे ही आप init चलाते हैं कमांड, बबलरैप को दो प्रमुख सॉफ़्टवेयर पैकेजों की आवश्यकता होगी:जावा डेवलपमेंट किट (जेडीके) और एंड्रॉइड एसडीके . यह आपके लिए उन्हें स्थापित करने की पेशकश करेगा। जेडीके सेटअप:
? Do you want Bubblewrap to install the JDK (recommended)?
(Enter "No" to use your own JDK 17 installation) (Y/n)
<पी> मेरे मामले में, जब मैंने बबलरैप को जेडीके स्थापित करने दिया, तो प्रक्रिया ने फ़ाइलें डाउनलोड कीं लेकिन फिर "डीकंप्रेसिंग" चरण में विफल रही। यदि आप भी इसी समस्या का सामना करते हैं, तो चिंता न करें! समाधान यह है कि इसे मैन्युअल रूप से इंस्टॉल किया जाए। - <पी> ननहींकहें संकेत के लिए.
- <पी> एडोप्टियम जैसे स्रोत से अनुशंसित संस्करण (आमतौर पर जेडीके 17) डाउनलोड करें।पी>
- <पी> इसे स्थापित करें और जेडीके के
bin को शामिल करने के लिए अपने सिस्टम के पर्यावरण चर सेट करें पथ. यदि आप सुनिश्चित नहीं हैं कि पर्यावरण चर कैसे सेट करें, तो आप इस साइट को देख सकते हैं:पर्यावरण चर सेट करें।
- <पी> जब बबलरैप पथ मांगता है, तो उसे सीधे प्रदान करें, जैसे
C:\java\jdk-17.0.16.8-hotspot .
एंड्रॉइड एसडीके सेटअप:
<पी> एक बार JDK सफलतापूर्वक सेट हो जाने पर, अगला चरण Android SDK को कॉन्फ़िगर करना है। ? Do you want Bubblewrap to install the Android SDK (recommended)?
(Enter "No" to use your own Android SDK installation) (Y/n)
<पी> चूँकि मेरे पास Android SDK नहीं था, इसलिए मैंने हाँ का चयन करके बबलव्रैप को इसे संभालने दिया। . मुझे यहां किसी भी समस्या का सामना नहीं करना पड़ा। <पी> यदि आपको एंड्रॉइड एसडीके पर सेटअप करने में कोई समस्या आती है, तो इसे मैन्युअल रूप से सेट करें और जेडीके सेटअप की तरह पथ दें। चरण 3 - बबलरैप प्रश्नों के उत्तर दें
<पी> एसडीके सेट होने के बाद, बबलरैप आपके ऐप को कॉन्फ़िगर करने के लिए कई प्रश्न पूछेगा। इस जानकारी का उपयोग twa-manifest.json बनाने के लिए किया जाता है फ़ाइल, जो आपके ऐप का ब्लूप्रिंट है। Domain: Press Enter (auto-filled from your manifest)
Application name: Your full app name
Application ID: (e.g, chat.yourapp.twa)
Display mode: standalone
Orientation: portrait
Status bar color: Press Enter (accepts default)
Splash screen color: Press Enter (accepts default)
Icon URL: Press Enter (accepts default)
Include support for Play Billing?: Type Y if your app uses Google Play in-app purchases. Otherwise, N
Request geolocation permission?: Type Y if your app needs location access. Otherwise, N
<पी> इन प्रश्नों में, महत्वपूर्ण भाग कुंजी भंडार और कुंजी है। First and Last names: Your full name
Organizational Unit: Developer or anything
Organization: Your organization name
Country (2-letter code): Your country code
Password for key store: Enter a new password
Password for key: Re-enter the same password
<पी> ध्यान दें: कुंजी भंडार और कुंजी दोनों के लिए ये पासवर्ड समान होने चाहिए, अन्यथा यह एक त्रुटि देगा। इस मुद्दे का संदर्भ लें: बबलरैप अंक. चरण 4 - ऐप बनाएं
bubblewrap build --universalApk
<पी> यह कमांड आपके एप्लिकेशन का निर्माण शुरू करता है। यहां, ध्वज universalApk .apk का उत्पादन करेगा और .abb . यदि आप अपना एप्लिकेशन Play Store में प्रकाशित करने जा रहे हैं, तो .abb अपलोड करें Play Store पर फ़ाइल करें. हमारे परीक्षण के लिए, हमें एक एपीके फ़ाइल की आवश्यकता है, इसलिए यह ध्वज universalApk है दोनों फ़ाइलें तैयार करेगा. यदि हमने यह ध्वज नहीं दिया, तो यह हमें केवल .abb देगा . चरण 5 - TWA सत्यापन स्थापित करना
<पी> एक बार निर्माण पूरा हो जाने पर, आपको एपीके मिलेगा। इसे अपने फ़ोन में स्थानांतरित करें और इसका परीक्षण करें। जब आप ऐप खोलेंगे, तो आपको ब्राउज़र एड्रेस बार दिखाई देगा। ऐसा इसलिए है क्योंकि हमने अभी तक आपके ऐप और आपकी वेबसाइट के बीच "विश्वास" स्थापित नहीं किया है। आइए अब इसे ठीक करें। <पी> अपने फ्रंटएंड प्रोजेक्ट में, public पर जाएं फ़ोल्डर, .well-known नामक एक नया फ़ोल्डर बनाएं , और उसके अंदर, assetlinks.json नामक एक फ़ाइल बनाएं . frontend/
├── public/
├── .well-known/
└── assetlinks.json
.well-known क्या है फ़ोल्डर?
<पी> एक प्रसिद्ध फ़ोल्डर का उपयोग उन फ़ाइलों को संग्रहीत करने के लिए किया जाता है जो प्रोटोकॉल के लिए कॉन्फ़िगरेशन को परिभाषित करते हैं, क्योंकि इसका उपयोग बाहरी स्रोतों के लिए आपकी वेबसाइट के लिए सत्यापन खोजने के लिए किया जाता है। हमारे मामले में, हमारा ऐप हमारी वेबसाइट से प्रसिद्ध फ़ोल्डर की जांच करता है और सत्यापन की पुष्टि करता है। <पी> निम्नलिखित को assetlinks.json में चिपकाएँ : [
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "chat.yourapp.twa",
"sha256_cert_fingerprints": [
"your_sha256_fingerprint"
]
}
}
]
delegate_permission/common.handle_all_urls क्या है ?
<पी> यह एक विशेष ध्वज है जो डोमेन के बजाय ऐप से सभी लिंक खोलता है। सीधे शब्दों में कहें तो यह एक डीपलिंक की तरह काम करता है। ऐप इंस्टॉल करने के बाद, यदि आप व्हाट्सएप या कहीं से अपनी वेबसाइट के लिंक पर क्लिक करते हैं, तो यह ब्राउज़र में खुलने के बजाय डीपलिंक के रूप में कार्य करते हुए आपका ऐप खोलेगा। <पी> package_name फ़ील्ड packageId होना चाहिए , जिसे आप अपने एंड्रॉइड बिल्ड फ़ोल्डर से twa-manifest.json में प्राप्त कर सकते हैं . <पी> अब, अपनी उंगलियों के निशान लें. ऐसा करने के लिए निम्नलिखित कमांड चलाएँ: keytool -list -v -keystore android.keystore -alias android
<पी> उपनाम नाम वह मान होना चाहिए जो आपने बनाया है। एक बार जब आप यह कमांड दर्ज करेंगे, तो यह कुंजी स्टोर पासवर्ड मांगेगा। उसे दर्ज करें, और आपको अपना SHA256 मिल जाएगा अंगुली की छाप. उसे कॉपी करें और assetslinks.json में पेस्ट करें sha256_cert_fingerprints में फ़ाइल करें सरणी. अब इन परिवर्तनों को उत्पादन में धकेलें। आप डिजिटल एसेट लिंक में सत्यापन सत्यापित कर सकते हैं <पी> बस इतना ही! अब आप ऐप इंस्टॉल कर उसका परीक्षण कर सकते हैं। चरण 6 (वैकल्पिक) - इन-ऐप अनुभव को अनुकूलित करें
<पी> अब, इसके अतिरिक्त, ऐसे कुछ मामले होंगे जहां हम वेबसाइट बनाम मोबाइल ऐप पर उपयोगकर्ताओं को अलग-अलग सामग्री दिखाना चाहते हैं। क्या हम ऐसा कर सकते हैं? हाँ! <पी> आपके एंड्रॉइड बिल्ड फ़ोल्डर में, twa-manifest.json में , वहां startUrl नामक एक फ़ील्ड होगी . यदि नहीं, तो इसे जोड़ें और मान "startUrl": "/?twa=true" जोड़ें . startUrl प्रवेश बिंदु है. मेरे पास मान twa=true का एक क्वेरी पैरामीटर है . <पी> bubblewrap build --universalApk के साथ बिल्ड को फिर से चलाएँ . <पी> अब, यदि आप अपना ऐप खोलते हैं, तो यह yourwebsitedomain.com/?twa=true के रूप में प्रवेश यूआरएल के साथ ऐप खोलेगा . <पी> आपके फ़्रंटएंड में: const twaParam = queryParams.get("twa");
const [isTwa, setIsTwa] = useState<boolean>(() => {
return localStorage.getItem("isTwa") === "true";
});
useEffect(() => {
if (twaParam === "true") {
localStorage.setItem("isTwa", "true"); // set the value to local storage
setIsTwa(true);
}
}, [twaParam]);
{isTwa? (
<Link to="/contact" className="underline hover:text-primary">
Contact
</Link>
) : (
<Link to="/download" className="underline hover:text-primary">
Download App
</Link>
)}
<पी> उपरोक्त कोड में, हम twa=true की जांच करते हैं URL में क्वेरी पैरामीटर. यदि यह मौजूद है, तो हम उस जानकारी को स्थानीय भंडारण में सहेजते हैं, और फिर हम उपयोगकर्ता के लिए सामग्री को सशर्त रूप से प्रस्तुत करते हैं। <पी> बस इतना ही. हमने एक ऐप बनाया है। <पी> यदि आप कोई नाम, रंग या स्प्लैश स्क्रीन बदलना चाहते हैं, तो आप इसे twa-manifest.json में बदल सकते हैं और बिल्ड को फिर से चलाएँ। समापन
<पी> बबलरैप केवल एंड्रॉइड के लिए है। यदि आप चाहते हैं कि ऐप क्रॉस-प्लेटफ़ॉर्म का समर्थन करे, तो कैपेसिटर जैसे कुछ अन्य प्लेटफ़ॉर्म हैं, जिनके बारे में मैं किसी अन्य लेख में लिखूंगा। <पी> वैसे, आप मेरे द्वारा बबलरैप का उपयोग करके बनाए गए ऐप को यहां देख सकते हैं:स्ट्रेंजर टॉक। <पी> यदि कोई गलती हो या आपके कोई प्रश्न हों, तो मुझसे लिंक्डइन या इंस्टाग्राम पर संपर्क करें। <पी> पढ़ने के लिए धन्यवाद! <पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें