CocoaPods Trunk: یہ کیا ہے، Trunk کے ذریعے لائبریریاں شائع کرنا

مصنف: IT Sectr اشاعت: 2026-02-13 مطالعے کا وقت: 9 منٹ

CocoaPods Trunk CocoaPods ایکو سسٹم کی ایک سرور سائڈ سروس ہے جو pod لائبریریوں کی اشاعت، میزبانی اور انتظام کے لیے ڈیزائن کی گئی ہے۔ Trunk نے GitHub ریپوزٹریوں اور forks کے ذریعے اشاعت کے پرانے طریقہ کار کو تبدیل کر دیا، جس سے تصدیق، سیشن مینجمنٹ، ورژننگ اور اشاعت سے پہلے توثیق کے ساتھ ایک مرکزی انفراسٹرکچر فراہم کیا گیا۔ iOS اور macOS ڈویلپر عوامی رجسٹری میں لائبریریاں بھیجنے کے لیے pod trunk push استعمال کرتے ہیں۔

اہم نکات

  • CocoaPods Trunk — pod لائبریریوں کی اشاعت کے لیے مرکزی سروس، Git ریپوزٹری پابندی کو تبدیل کر دیا
  • رجسٹریشن — ای میل تصدیق کے ساتھ pod trunk register کے ذریعے ایک بار کی تصدیق
  • اشاعتpod trunk push کمانڈ توثیق، لنٹنگ اور رجسٹری میں اپ لوڈ سے گزرتی ہے
  • انتظام — pod انتظامیہ کے لیے pod trunk me، pod trunk add-owner، pod trunk deprecate
  • سیکیورٹی — سیشن ٹوکن، API کلیدز، اشاعت سے پہلے podspec کی توثیق

CocoaPods Trunk کیا ہے؟

CocoaPods Trunk pod لائبریریوں کی مرکزی اشاعت کے لیے 2015 میں شروع کیا گیا ایک سرور انفراسٹرکچر ہے۔ Trunk سے پہلے، ہر pod Git ریپوزٹری کے ذریعے تقسیم کیا جاتا تھا: ڈویلپر کو ایک عوامی ریپوزٹری بنانی ہوتی تھی، podspec فائل شامل کرنی ہوتی تھی اور مرکزی ریپوزٹری CocoaPods/Specs میں Pull Request بھیجنی ہوتی تھی۔ اس طریقہ کار میں دستی نگرانی درکار تھی اور اپ ڈیٹس کی اشاعت میں تاخیر ہوتی تھی۔

Trunk نے اشاعت، اپ ڈیٹ اور pod کے انتظام کے لیے ایک متحد API فراہم کرکے ان مسائل کو حل کیا۔ سروس چار اہم اجزاء پر مشتمل ہے:

  • تصدیق — ای میل تصدیق کے ساتھ رجسٹریشن اور سیشن ٹوکن کا انتظام۔ ہر ڈویلپر کو اپنے اکاؤنٹ اور آلات سے منسلک ایک منفرد ٹوکن ملتا ہے۔
  • توثیق — نحو کا تجزیہ، انحصار لنٹنگ اور پلیٹ فارم مطابقت کی جانچ سمیت اشاعت سے پہلے podspec کی خودکار جانچ۔
  • میزبانی — CocoaPods سرورز پر pod میٹا ڈیٹا اور ورژن کا ذخیرہ۔ سورس کوڈ ڈویلپر کی Git ریپوزٹری میں رہتا ہے، Trunk صرف podspec فائلیں اور لنکس ذخیرہ کرتا ہے۔
  • رسائی کا انتظام — pod مالکان کو شامل کرنے اور ہٹانے، اشاعت کے حقوق منتقل کرنے، pod کو متروک قرار دینے کی صلاحیت۔

Trunk کا فن تعمیر PostgreSQL ڈیٹا بیس کے ساتھ Ruby on Rails اسٹیک پر بنایا گیا ہے۔ سروس تمام کارروائیوں کے لیے JSON فارمیٹ کے ساتھ HTTP API استعمال کرتی ہے، اور CLI کلائنٹ pod trunk CocoaPods تقسیم کا حصہ ہے، جو مرکزی cocoapods جیم کے ساتھ انسٹال ہوتا ہے۔

آج تک، Trunk کے ذریعے 100,000 سے زیادہ pod شائع ہو چکے ہیں، کل ڈاؤن لوڈ 50 بلین سے تجاوز کر گیا ہے۔ سروس دنیا بھر کے ڈویلپرز سے روزانہ ہزاروں اشاعت اور اپ ڈیٹ کی درخواستوں پر کارروائی کرتی ہے۔

رجسٹریشن اور تصدیق

pod شائع کرنے سے پہلے، آپ کو Trunk میں رجسٹر ہونا ہوگا۔ عمل ایک ہی مرحلے پر مشتمل ہے — pod trunk register کمانڈ:

bash
pod trunk register your@email.com 'Your Name' --description='MacBook Pro، iOS ڈویلپمنٹ'

کمانڈ چلانے کے بعد، مخصوص کردہ ای میل پر ایک تصدیقی لنک بھیجا جاتا ہے۔ لنک پر کلک کرنے سے اکاؤنٹ فعال ہو جاتا ہے اور ایک سیشن ٹوکن بنتا ہے جو سسٹم کی چین (macOS پر Keychain، Linux پر gnome-keyring یا مساوی) میں محفوظ ہو جاتا ہے۔ ٹوکن بعد میں آنے والی تمام pod trunk کارروائیوں میں خود بخود استعمال ہوتا ہے۔

--description پیرامیٹر اختیاری ہے لیکن تجویز کردہ ہے — یہ pod trunk me کے ذریعے فعال سیشن دیکھتے وقت سیشن کی شناخت میں مدد کرتا ہے۔ اگر آپ متعدد مشینوں (ورک سٹیشن، CI سرور) سے کام کرتے ہیں، تو وضاحت ایک سیشن کو دوسرے سے ممتاز کرنے میں مدد دیتی ہے۔

تصدیق کی حیثیت جانچنے کے لیے، کمانڈ استعمال کریں:

bash
pod trunk me

آؤٹ پٹ ای میل، نام، آپ کی pod فہرست (اگر پہلے شائع کیا ہے) اور فعال سیشن دکھاتا ہے۔ نتیجے کی مثال:

bash
  - Name: Your Name
  - Email: your@email.com
  - Since: 2024-03-15 10:30 UTC
  - Pods:
    - MyLibrary
    - AnotherPod
  - Sessions:
    - 2024-03-15 10:30 UTC - MacBook Pro, iOS ڈویلپمنٹ

CI سرورز (GitHub Actions، GitLab CI، Jenkins) پر، تصدیق COCOAPODS_TRUNK_TOKEN ماحولیاتی متغیر کے ذریعے بھیجے گئے ٹوکن سے کی جاتی ہے۔ ٹوکن کمانڈ سے حاصل کیا جا سکتا ہے:

bash
pod trunk me --token-only

یہ ٹوکن CI سیٹنگز میں ایک خفیہ متغیر کے طور پر محفوظ کیا جاتا ہے، اور بار بار رجسٹریشن کے بغیر اشاعت کے مرحلے میں استعمال ہوتا ہے۔ GitHub Actions کے لیے مثال:

bash
env:
  COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}

اہم: ٹوکن اکاؤنٹ سے منسلک pod کے انتظام تک مکمل رسائی فراہم کرتا ہے۔ اسے کبھی عوامی ریپوزٹریوں میں شائع نہ کریں یا تیسرے فریق کے ساتھ شیئر نہ کریں۔ اگر سمجھوتہ ہو جائے تو، ٹوکن کو pod trunk remove-session کے ذریعے یا CocoaPods ویب سائٹ کنٹرول پینل کے ذریعے تمام سیشن حذف کرکے منسوخ کیا جا سکتا ہے۔

Podspec کی تیاری

podspec فائل (.podspec یا .podspec.json) لائبریری کا مینی فیسٹ ہے جس میں میٹا ڈیٹا، انحصار، پلیٹ فارم کی معلومات اور سورس کوڈ کی تفصیلات ہوتی ہیں۔ Trunk اس فائل کو توثیق اور pod رجسٹریشن کے لیے استعمال کرتا ہے۔ اشاعت کے لیے کم سے کم podspec اس طرح دکھتا ہے:

bash
Pod::Spec.new do |s|
  s.name         = 'MyLibrary'
  s.version      = '0.1.0'
  s.summary      = 'لائبریری کا مختصر تعارف'
  s.description  = 'خصوصیات کی وضاحت کے ساتھ تفصیلی تعارف'
  s.homepage     = 'https://github.com/username/MyLibrary'
  s.license      = { :type => 'MIT', :file => 'LICENSE' }
  s.author       = { 'Your Name' => 'your@email.com' }
  s.source       = { :git => 'https://github.com/username/MyLibrary.git', :tag => s.version.to_s }
  s.source_files = 'Sources/**/*.{swift,h,m}'
  s.platform     = :ios, '12.0'
  s.swift_version = '5.7'
end

podspec کے اہم فیلڈز:

  • name — pod کا نام، Trunk رجسٹری میں منفرد ہونا چاہیے۔ نام پہلے آیا پہلے پا یا کی بنیاد پر رجسٹر ہوتے ہیں — اگر نام لیا گیا ہے تو اشاعت مسترد کر دی جائے گی۔
  • versionMAJOR.MINOR.PATCH فارمیٹ میں سیمینٹک ورژن۔ Trunk ایک ہی ورژن کی دوبارہ اشاعت قبول نہیں کرتا — نمبر بڑھانا ہوگا۔
  • source — Git ریپوزٹری لنک اور ٹیگ۔ Trunk سورس کوڈ ذخیرہ نہیں کرتا، اس لیے ریپوزٹری کلوننگ کے لیے دستیاب ہونی چاہیے۔
  • platform — ہدف پلیٹ فارم (iOS، macOS، tvOS، watchOS) اور کم از کم SDK ورژن۔
  • license — لائسنس کی قسم۔ MIT، Apache-2.0، BSD یا دیگر اوپن سورس لائسنس بتانے کی سفارش کی جاتی ہے۔

اشاعت سے پہلے، لنٹر سے podspec کی درستگی چیک کریں:

bash
pod lib lint MyLibrary.podspec

لنٹر نحو، لازمی فیلڈز، فائل پاتھ کی درستگی اور انحصار کے حل کی جانچ کرتا ہے۔ اگر لنٹنگ کے عمل میں پرائیویٹ سورس استعمال ہوتے ہیں تو --sources جھنڈا شامل کیا جاتا ہے۔ نیٹ ورک ڈاؤن لوڈ چھوڑنے کے لیے (صرف مقامی جانچ)، --local-only جھنڈا استعمال کیا جاتا ہے۔

pod trunk push کے ذریعے اشاعت

pod شائع کرنے کا مرکزی کمانڈ pod trunk push ہے۔ یہ podspec فائل Trunk سرور کو بھیجتا ہے، جہاں یہ مکمل توثیق سے گزرتی ہے اور عوامی رجسٹری میں رجسٹر ہوتی ہے۔ نحو:

bash
pod trunk push MyLibrary.podspec

--allow-warnings جھنڈا انتباہات کی موجودگی میں اشاعت کی اجازت دیتا ہے۔ بطور ڈیفالٹ، کوئی بھی انتباہ اشاعت کو روکتا ہے۔ اگر آپ کی لائبریری میں معروف انتباہات ہیں جو فعالیت کو متاثر نہیں کرتے، تو آپ یہ جھنڈا استعمال کر سکتے ہیں۔ اہم: غلطیاں ہمیشہ اشاعت کو روکتی ہیں، جھنڈوں سے قطع نظر۔

--synchronous جھنڈا درخواست کو ہم آہنگ بناتا ہے — ٹرمینل سرور سائڈ توثیق مکمل ہونے کا انتظار کرتا ہے۔ بطور ڈیفالٹ، کمانڈ جمع کروانے کے فوراً بعد کنٹرول واپس کر دیتی ہے، اور سرور اشاعت کو غیر ہم آہنگ طریقے سے پروسیس کرتا ہے۔ ہم آہنگ موڈ CI/CD میں مفید ہے جب پائپ لائن کا اگلا مرحلہ کامیاب اشاعت پر منحصر ہو۔

--skip-import-validation جھنڈا لائبریری کو ٹیسٹ پروجیکٹ میں درآمد کرنے کی جانچ چھوڑ دیتا ہے۔ اس سے اشاعت تیز ہوتی ہے لیکن اس بات کی ضمانت نہیں دیتا کہ لائبریری واقعی کمپائل ہوتی ہے۔ یہ جھنڈا صرف اس وقت استعمال کریں جب آپ بلڈ کی درستگی کے بارے میں پراعتماد ہوں۔

عام اختیارات کے ساتھ اشاعت کی مثال:

bash
pod trunk push MyLibrary.podspec \
  --allow-warnings \
  --synchronous \
  --skip-import-validation

کامیاب اشاعت کے بعد، Trunk تفصیلات کے ساتھ JSON واپس کرتا ہے:

bash
  Congrats

  MyLibrary (0.1.0) successfully published

  Pod URL: https://cocoapods.org/pods/MyLibrary

لائبریری کسی بھی iOS یا macOS پروجیکٹ میں Podfile کے ذریعے انسٹالیشن کے لیے دستیاب ہو جاتی ہے۔ عام طور پر، CocoaPods سرچ انڈیکس چند منٹوں میں اپ ڈیٹ ہو جاتا ہے، لیکن نایاب صورتوں میں انڈیکسنگ میں ایک گھنٹہ لگ سکتا ہے۔

اہم حد: ایک بار شائع شدہ pod ورژن حذف نہیں کیا جا سکتا۔ یہ ان پروجیکٹوں کو ٹوٹنے سے روکنے کے لیے ہے جو پہلے سے اس ورژن کو استعمال کر رہے ہیں۔ اگر اشاعت غلط تھی، تو آپ اصلاح کے ساتھ اگلا ورژن شائع کر سکتے ہیں، لیکن واپسی ناممکن ہے۔ استثنا pod trunk delete ہے، جو صرف CocoaPods عملے کے لیے دستیاب ہے اور انتہائی صورتوں (لائسنس کی خلاف ورزی، نقصان دہ کوڈ) میں استعمال ہوتا ہے۔

ریلیز اور رسائی کا انتظام

CocoaPods Trunk شائع شدہ pod کے انتظام کے لیے کئی کمانڈ فراہم کرتا ہے:

مالکان کا اضافہ

کسی دوسرے ڈویلپر کو pod کے اشاعت کے حقوق منتقل کرنے کے لیے، کمانڈ استعمال کریں:

bash
pod trunk add-owner MyLibrary developer@email.com

عملدرآمد کے بعد، نیا مالک pod کے انتظام تک مکمل رسائی حاصل کرتا ہے: نئے ورژن شائع کرنا، دوسرے مالکان کو شامل کرنا اور ہٹانا، pod کو متروک قرار دینا۔ کوئی بھی رجسٹرڈ Trunk صارف مالک ہو سکتا ہے — پیشگی رجسٹریشن لازمی ہے۔

مالکان کو ہٹانا

اگر کوئی ڈویلپر پروجیکٹ چھوڑ چکا ہے یا اسے pod تک رسائی نہیں ہونی چاہیے:

bash
pod trunk remove-owner MyLibrary developer@email.com

صرف موجودہ مالک کسی مالک کو ہٹا سکتا ہے۔ pod کے آخری مالک کو نہیں ہٹایا جا سکتا — پہلے ایک نیا مالک شامل کرنا ہوگا۔ یہ pod کو بغیر مالک کے اور لاوارث ہونے سے روکتا ہے۔

pod کو متروک قرار دینا

اگر لائبریری مزید تعاون یافتہ نہیں ہے، تو آپ اسے متروک (deprecated) قرار دے سکتے ہیں۔ یہ pod کو رجسٹری سے نہیں ہٹاتا، لیکن انسٹالیشن کے وقت صارفین کے لیے ایک انتباہ شامل کرتا ہے:

bash
pod trunk deprecate MyLibrary

اختیاری طور پر، آپ ایک متبادل pod بتا سکتے ہیں:

bash
pod trunk deprecate MyLibrary --in-favor-of=NewLibrary

متروک pod انسٹال کرتے وقت، CocoaPods ٹرمینل میں ایک انتباہ دکھاتا ہے اور متعین متبادل پر سوئچ کرنے کی سفارش کرتا ہے۔ موجودہ پروجیکٹ بلڈز کو توڑے بغیر لائبریری کی معاونت ختم کرنے کا یہ صحیح طریقہ ہے۔

pod کی معلومات دیکھنا

pod کی معلومات pod trunk info کمانڈ کے ذریعے دستیاب ہے:

bash
pod trunk info MyLibrary

کمانڈ تمام pod ورژن، اشاعت کی تاریخیں، مالکان کی فہرست اور حیثیت (فعال/متروک) دکھاتا ہے۔ کسی مخصوص ورژن کی تفصیلات دیکھنے کے لیے، pod spec cat MyLibrary 0.1.0 استعمال کریں۔

غلطیاں اور حل

Trunk کے ساتھ کام کرتے وقت، ڈویلپرز اکثر عام غلطیوں کا سامنا کرتے ہیں۔ آئیے سب سے عام غلطیوں کا جائزہ لیتے ہیں:

تصدیق کی غلطی

علامت: [!] Authentication failed. You need to register a session first.
وجہ: سیشن ٹوکن غائب یا میعاد ختم۔ ٹوکن کی محدود میعاد ہوتی ہے (بطور ڈیفالٹ بغیر سرگرمی کے 30 دن)۔
حل: pod trunk register your@email.com 'Your Name' دوبارہ چلائیں۔ اگر آپ CI استعمال کر رہے ہیں تو COCOAPODS_TRUNK_TOKEN ماحولیاتی متغیر کی تازگی چیک کریں اور اگر ضرورت ہو تو نیا ٹوکن بنائیں۔

ورژن کا تصادم

علامت: [!] You have already pushed version 0.1.0 for MyLibrary.
وجہ: موجودہ ورژن کو دوبارہ شائع کرنے کی کوشش۔ Trunk ورژن پر دوبارہ لکھنے کی اجازت نہیں دیتا۔
حل: سیمینٹک ورژننگ کے مطابق podspec میں ورژن بڑھائیں۔ اگر podspec میں غلطی ہوئی ہے تو اصلاح کے ساتھ اگلا ورژن شائع کریں۔

Podspec توثیق کی غلطی

علامت: [!] The spec did not pass validation. ERROR | [iOS] file patterns: Source files did not match any file.
وجہ: source_files فیلڈ میں سورس فائلوں کا غلط راستہ۔
حل: podspec میں راستے چیک کریں، تمام غلطیوں کے حل ہونے تک مقامی طور پر pod lib lint چلائیں، پھر اشاعت دہرائیں۔ گلوب پیٹرن استعمال کریں: Classes/**/*.{h,m}، Sources/MyLibrary/**/*.swift۔

کنکشن ٹائم آؤٹ

علامت: [!] Connection to trunk.cocoapods.org failed. Timeout.
وجہ: نیٹ ورک کے مسائل یا Trunk سرور کی عارضی غیر دستیابی۔
حل: سرور کی دستیابی چیک کریں: curl -I https://trunk.cocoapods.org۔ اگر سرور جواب دیتا ہے تو کچھ منٹوں میں کمانڈ دہرائیں۔ آپ کا IP مسدود ہو سکتا ہے — کسی دوسرے کنکشن یا VPN سے کوشش کریں۔

pod تک رسائی نہیں

علامت: [!] You do not have permission to push to MyLibrary.
وجہ: آپ pod کے مالک نہیں ہیں۔ یہ اس وقت ہوتا ہے جب کسی نے پہلے سے اس نام سے pod رجسٹر کر لیا ہو۔
حل: موجودہ pod مالک سے رابطہ کریں (pod trunk info MyLibrary کے ذریعے پتہ کریں) اور ان سے کہیں کہ وہ آپ کو pod trunk add-owner کے ذریعے شامل کریں۔ اگر pod کا نام لیا گیا ہے تو متبادل نام پر غور کریں۔

اکثر پوچھے گئے سوالات

CocoaPods Trunk اور Specs ریپوزٹری کے ذریعے پرانی اشاعت کے طریقہ کار میں کیا فرق ہے؟

پرانی طریقہ کار میں CocoaPods/Specs ریپوزٹری میں دستی Pull Request درکار تھی۔ Trunk عمل کو خودکار بناتا ہے: آپ ایک ہی pod trunk push کمانڈ چلاتے ہیں، اور سرور خود podspec کی توثیق کرتا ہے، اسے رجسٹری میں شامل کرتا ہے اور سرچ انڈیکس اپ ڈیٹ کرتا ہے۔ Trunk نے رسائی کا انتظام (متعدد مالکان)، سیشن ٹوکن اور مرکزی میٹا ڈیٹا اسٹوریج بھی شامل کیا۔

شائع شدہ pod ورژن کو کیسے منسوخ کروں؟

یہ ممکن نہیں ہے — Trunk انحصار کی سالمیت برقرار رکھنے کے لیے شائع شدہ ورژنز کو حذف کرنے سے منع کرتا ہے۔ اگر کسی ورژن میں سنگین خرابی ہے تو اصلاح کے ساتھ نیا ورژن شائع کریں اور پریشانی والے ورژن کو pod trunk deprecate کے ذریعے متروک قرار دیں۔ مکمل حذف صرف غیر معمولی صورتوں میں CocoaPods منتظمین کے لیے دستیاب ہے۔

کیا میں podspec میں ای میل بتائے بغیر pod شائع کر سکتا ہوں؟

نہیں، s.author فیلڈ میں ای میل ہونا ضروری ہے۔ Trunk اسے pod کو مالک کے اکاؤنٹ سے منسلک کرنے کے لیے استعمال کرتا ہے۔ پتہ pod trunk register کے دوران استعمال کردہ ای میل سے ملنا چاہیے۔ اگر podspec میں ای میل مختلف ہے تو اشاعت مسترد کر دی جائے گی۔

اشاعت کے بعد pod کی انڈیکسنگ میں کتنا وقت لگتا ہے؟

عام طور پر، pod 5–15 منٹ میں CocoaPods تلاش میں ظاہر ہو جاتا ہے۔ نایاب صورتوں میں، انڈیکسنگ میں ایک گھنٹہ لگ سکتا ہے۔ تاہم، pod Trunk سے کامیاب جواب ملنے کے فوراً بعد Podfile کے ذریعے انسٹالیشن کے لیے دستیاب ہوتا ہے — آپ کو صرف Podfile میں درست ورژن یا رینج بتانی ہوتی ہے۔

اگر میں رجسٹریشن کے وقت استعمال کردہ ای میل تک رسائی کھو دوں تو کیا کروں؟

اگر آپ کے پاس فعال سیشن ہے (ٹوکن کی میعاد ختم نہیں ہوئی) تو pod trunk register new@email.com کے ذریعے اپنا ای میل تبدیل کریں — نیا رجسٹریشن pod کو نئے پتے سے منسلک کر دے گا۔ اگر سیشن کی میعاد ختم ہو گئی ہے تو GitHub Issues کے ذریعے CocoaPods سپورٹ سے رابطہ کریں۔ pod کی ملکیت کا ثبوت pod کی Git ریپوزٹری میں کمٹ بنانے کی صلاحیت ہو سکتی ہے۔

خلاصہ

  • CocoaPods Trunk — pod لائبریریوں کی اشاعت اور انتظام کے لیے ایک مرکزی سرور سروس، دستی Specs ریپوزٹری عمل کو تبدیل کیا
  • رجسٹریشن — ای میل تصدیق اور خودکار سیشن ٹوکن اسٹوریج کے ساتھ pod trunk register کے ذریعے ایک بار کی جاتی ہے
  • Podspec — میٹا ڈیٹا، انحصار اور پلیٹ فارم سیٹنگز پر مشتمل Ruby DSL یا JSON فارمیٹ میں لائبریری مینی فیسٹ
  • اشاعتpod trunk push کمانڈ سرور سائڈ توثیق سے گزرتی ہے؛ ایک بار شائع ہونے کے بعد ورژن حذف نہیں کیا جا سکتا
  • رسائی کا انتظام — مالکان pod trunk add-owner اور pod trunk remove-owner کے ذریعے شامل اور ہٹائے جاتے ہیں
  • CI/CD انضمام — پائپ لائنوں میں خودکار اشاعت کے لیے COCOAPODS_TRUNK_TOKEN ماحولیاتی متغیر کے ذریعے تصدیق
  • سیکیورٹی — محدود مدت کے سیشن ٹوکن، ورژن حذف کرنے کی ناممکنیت، دوبارہ اشاعت کے خلاف تحفظ

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں