iOS میں Keychain: یہ کیا ہے، فن تعمیر اور رازوں کے ساتھ کام کرنا

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

Keychain iOS میں ایک محفوظ ذخیرہ ہے جو پاس ورڈز، خفیہ نگاری کی کنجیاں، اسناد اور خفیہ نوٹس کو محفوظ طریقے سے ذخیرہ کرنے کے لیے ڈیزائن کیا گیا ہے۔ Apple Security Documentation (2025) کے مطابق، Keychain A7 چپ اور نئے والے تمام آلات پر Secure Enclave کے ذریعے ہارڈویئر انکرپشن استعمال کرتا ہے۔ iOS Keychain کے فن تعمیر کو سمجھنا ہر ڈیولپر کے لیے ایپلیکیشن ٹوکنز اور رازوں کو صحیح طریقے سے ذخیرہ کرنے کے لیے ضروری ہے۔

اہم نکات

  • iOS Keychain Secure Enclave کے ذریعے ہارڈویئر تحفظ کے ساتھ رازوں کو ذخیرہ کرنے کے لیے ایک خفیہ کردہ SQLite ڈیٹابیس ہے۔
  • Protection Class یہ طے کرتی ہے کہ ڈیٹا کب دستیاب ہے: جب ڈیوائس انلاک ہو، پہلے انلاک کے بعد، یا ہمیشہ۔
  • Access Control List (ACL) ایک طریقہ کار ہے جو Keychain آئٹمز تک رسائی کو محدود کرتا ہے، بشمول بائیو میٹرک تصدیق۔
  • SecItemAdd اور SecItemCopyMatching آئٹمز لکھنے اور پڑھنے کے لیے Security framework کے اہم APIs ہیں۔
  • kSecAttrSynchronizable وہ جھنڈا ہے جو صارف کے تمام آلات پر رسائی کے لیے iCloud کے ذریعے Keychain مطابقت پذیری کو فعال کرتا ہے۔

iOS میں Keychain کیا ہے؟

iOS Keychain Apple کے آپریٹنگ سسٹم میں شامل خفیہ ڈیٹا کو ذخیرہ کرنے کا ایک محفوظ طریقہ کار ہے۔ UserDefaults یا عام فائلوں کے برعکس، Keychain تمام آئٹمز کو ہارڈویئر سطح پر انکرپٹ کرتا ہے اور سیکیورٹی پالیسیوں کی بنیاد پر باریک رسائی کنٹرول فراہم کرتا ہے۔

Keychain iOS 2.0 میں متعارف کرایا گیا تھا اور تب سے اس میں اہم تبدیلیاں آئی ہیں: iOS 7 میں Secure Enclave کے ذریعے ہارڈویئر کلیدی معاونت شامل کی گئی، iOS 9 میں Access Groups کے ذریعے ایپس کے درمیان Keychain شیئرنگ متعارف کرائی گئی، iOS 13 میں LAContext کے ذریعے بائیو میٹرک بائنڈنگ سپورٹ شامل کی گئی۔ Apple WWDC Session (2024) کے مطابق، App Store کے ٹاپ 100 میں 90% سے زیادہ iOS ایپس تصدیقی ٹوکنز ذخیرہ کرنے کے لیے Keychain استعمال کرتی ہیں۔

فن تعمیر کے لحاظ سے، Keychain ایپلیکیشن سینڈ باکس کے باہر واقع ایک خفیہ کردہ SQLite ڈیٹابیس ہے۔ ہر آئٹم (SecItem) کو علیحدہ کلید سے انکرپٹ کیا جاتا ہے، جو بدلے میں Secure Enclave ہارڈویئر کلید سے محفوظ ہوتی ہے۔ سسٹم سروس Securityd ایپلیکیشن کے اختیارات اور درخواست کردہ تحفظ کی کلاس کی بنیاد پر Keychain تک رسائی کا انتظام کرتی ہے۔

دیگر اسٹوریج طریقوں کے مقابلے Keychain کا ایک اہم فائدہ: ڈیٹا OS کے ذریعے خود بخود انکرپٹ اور ڈیکرپٹ ہوتا ہے۔ ڈیولپر کو دستی طور پر خفیہ نگاری لاگو کرنے کی ضرورت نہیں ہے - صرف صحیح پیرامیٹرز کے ساتھ SecItemAdd کو کال کریں۔ iOS اس بات کی ضمانت دیتا ہے کہ Keychain کا ڈیٹا دوسری ایپلیکیشنز نہیں پڑھ سکتیں (جب Access Groups صحیح طریقے سے ترتیب دیے گئے ہوں)۔

Keychain کا فن تعمیر

Keychain کے فن تعمیر میں کئی سطحیں شامل ہیں: فزیکل (Secure Enclave)، سسٹم (Security.framework)، ایپلیکیشن (SecItem* API) اور منطقی (Access Groups, Protection Classes)۔ ہر سطح کو سمجھنا رازوں کے ذخیرہ کو صحیح طریقے سے ڈیزائن کرنے میں مدد کرتا ہے۔

SecItemAdd اور SecItemCopyMatching

Keychain کے ساتھ کام کرنے کے لیے اہم API Security framework کے فنکشنز ہیں: شامل کرنے کے لیے SecItemAdd، پڑھنے کے لیے SecItemCopyMatching، اپ ڈیٹ کرنے کے لیے SecItemUpdate اور حذف کرنے کے لیے SecItemDelete۔ ہر فنکشن ایک query ڈکشنری لیتا ہے جو تلاش یا ذخیرہ کرنے والے آئٹم کی صفات کو بیان کرتی ہے۔

اہم query صفات: kSecClass - آئٹم کی قسم (kSecClassGenericPassword، kSecClassKey، kSecClassCertificate)، kSecAttrAccount - کلاس کے اندر منفرد شناخت کنندہ، kSecValueData - ذخیرہ کردہ ڈیٹا (Data)، kSecAttrAccessible - تحفظ کی کلاس۔ SecItemCopyMatching kSecReturnData جھنڈے کے ساتھ آئٹم کا ڈیٹا لوٹاتا ہے، kSecMatchLimit کے ساتھ - نتائج کی تعداد۔

اہم: تمام فنکشنز ایک OSStatus لوٹاتے ہیں۔ کامیاب آپریشن errSecSuccess (0) لوٹاتا ہے۔ غلطیاں: errSecItemNotFound (-25300) - آئٹم نہیں ملا، errSecDuplicateItem (-25299) - آئٹم پہلے سے موجود ہے، errSecAuthFailed (-25293) - بائیو میٹرک تصدیق ناکام۔ ڈیولپر کو ہر حالت کو صحیح طریقے سے سنبھالنا چاہیے۔

تحفظ کی کلاسیں (Protection Class)

Protection Class kSecAttrAccessible وصف ہے جو یہ طے کرتی ہے کہ Keychain میں ڈیٹا پڑھنے کے لیے کب دستیاب ہے۔ iOS دستیابی اور حفاظت کی مختلف سطحوں کے ساتھ چھ تحفظ کی کلاسوں کو سپورٹ کرتا ہے۔

زیادہ تر منظرناموں کے لیے تجویز کردہ کلاس kSecAttrAccessibleWhenUnlockedThisDeviceOnly ہے: ڈیٹا صرف اس وقت دستیاب ہوتا ہے جب ڈیوائس انلاک ہو اور iCloud Backup میں کاپی نہیں ہوتا۔ ریبوٹ کے بعد دستیاب ہونے والے ڈیٹا کے لیے (لیکن صرف پہلے انلاک کے بعد)، kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly استعمال کریں۔ اہم ڈیٹا کے لیے جسے ہر رسائی پر بائیو میٹرک تصدیق کی ضرورت ہو، kSecAttrAccessibleWhenUnlockedThisDeviceOnly کو بائیو میٹری کی ضرورت والے ACL کے ساتھ جوڑیں۔

ThisDeviceOnly لاحقہ کے بغیر کلاسیں (kSecAttrAccessibleWhenUnlocked، kSecAttrAccessibleAfterFirstUnlock) iCloud Backup میں کاپی کرنے کی اجازت دیتی ہیں۔ یہ صارف کے لیے آسان ہے لیکن حفاظت کم کرتا ہے - ڈیٹا بیک اپ سے بحال کیا جا سکتا ہے۔ تصدیقی ٹوکنز کے لیے، ہمیشہ ThisDeviceOnly استعمال کریں۔

رسائی کنٹرول کی فہرستیں (ACL)

Access Control List (ACL) ایک طریقہ کار ہے جو صارف کی تصدیق کی بنیاد پر Keychain آئٹم پر کارروائیوں کو محدود کرتا ہے۔ ACL کو SecAccessControlCreateWithFlags کے ذریعے سیٹ کیا جاتا ہے اور آئٹم محفوظ کرتے وقت kSecAttrAccessControl وصف میں منتقل کیا جاتا ہے۔

معاون جھنڈے: kSecAccessControlUserPresence - کوئی بھی تصدیق (Face ID، Touch ID، یا پاس کوڈ)، kSecAccessControlBiometryCurrentSet - صرف بائیو میٹری (موجودہ رجسٹرڈ فنگر پرنٹس یا چہرہ)، kSecAccessControlDevicePasscode - صرف پاس کوڈ۔ ACL ہر کارروائی پر لاگو ہوتا ہے: آئٹم کو پڑھنا، اپ ڈیٹ کرنا اور حذف کرنا بھی تصدیق کی ضرورت ہے۔

iOS 15+ پر جھنڈا kSecAccessControlWatch ظاہر ہوا - Apple Watch کے لیے، جو جوڑی گھڑی کے ذریعے تصدیق کی اجازت دیتا ہے۔ ACL کو ملایا جا سکتا ہے: مثال کے طور پر، kSecAccessControlUserPresence یا kSecAccessControlBiometryAny اختیاری پاس کوڈ (.or واقفیت) کے ساتھ۔

Keychain میں ڈیٹا کی اقسام

iOS Keychain چار اہم آئٹم کلاسز (kSecClass) کو سپورٹ کرتا ہے، ہر ایک اپنی ڈیٹا کی قسم کے لیے ڈیزائن کیا گیا ہے۔ صحیح کلاس کا انتخاب تنظیم اور آئٹم کی تلاش کو آسان بناتا ہے۔

kSecClassGenericPassword - عام پاس ورڈ: سب سے زیادہ استعمال ہونے والی کلاس۔ ایک منفرد کلید (kSecAttrAccount) کے ساتھ صوابدیدی بائنری ڈیٹا (Data) ذخیرہ کرتی ہے۔ ٹوکنز، API کنجیاں، PIN کوڈز کے لیے موزوں۔ استعمال کے لیے اضافی اختیارات کی ضرورت نہیں ہے۔

kSecClassInternetPassword - انٹرنیٹ پاس ورڈ: نیٹ ورک وسائل سے منسلک ڈیٹا ذخیرہ کرتی ہے۔ اضافی صفات: kSecAttrServer (سرور ڈومین)، kSecAttrProtocol (https، ftp)، kSecAttrPort، kSecAttrAuthenticationType۔ iOS AutoFill کے ذریعے ایسے پاس ورڈز خود بخود بھر سکتا ہے۔

kSecClassKey - خفیہ نگاری کی کلید: انکرپشن کنجیاں (AES, RSA, EC) ذخیرہ کرنے کے لیے۔ کلید Data کے بجائے SecKeyRef کے طور پر محفوظ کی جاتی ہے۔ kSecClassCertificate - ڈیجیٹل اسناد کو ذخیرہ کرنے اور تصدیق کرنے کے لیے X.509 سند۔ دونوں کلاسوں کو خفیہ نگاری کے کاموں کی سمجھ اور صفات کی صحیح ترتیب کی ضرورت ہے۔

عملی طور پر، موبائل ایپس میں Keychain کے 95% استعمال تصدیقی ٹوکنز ذخیرہ کرنے کے لیے kSecClassGenericPassword اور نجی انکرپشن کنجیاں ذخیرہ کرنے کے لیے kSecClassKey سے پورے ہوتے ہیں۔ kSecClassCertificate شاذ و نادر ہی استعمال ہوتا ہے - عام طور پر اپنے PKI والی انٹرپرائز ایپس میں۔

کوڈ کی مثالیں: Swift میں Keychain کے ساتھ کام کرنا

آئیے Security framework استعمال کرتے ہوئے Swift میں Keychain کے ساتھ کام کرنے کی عملی مثالیں دیکھتے ہیں۔ ہر مثال میں غلطی سے نمٹنے اور درست Protection Class ترتیب شامل ہے۔

ٹوکن محفوظ کرنا اور پڑھنا

ایک بنیادی مثال WhenUnlockedThisDeviceOnly تحفظ کے ساتھ Keychain میں تصدیقی ٹوکن محفوظ کرتی ہے۔ کلید (kSecAttrAccount) سروس شناخت کنندہ ہے، ڈیٹا (kSecValueData) Data فارمیٹ میں ٹوکن ہے۔

swift
import Security

enum KeychainError: Error {
    case unexpectedStatus(OSStatus)
}

func saveToken(token: String, service: String) throws {
    let data = Data(token.utf8)
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: "auth_token",
        kSecValueData as String: data,
        kSecAttrAccessible as String:
            kSecAttrAccessibleWhenUnlockedThisDeviceOnly
    ]
    SecItemDelete(query as CFDictionary)
    let status = SecItemAdd(query as CFDictionary, nil)
    guard status == errSecSuccess else {
        throw KeychainError.unexpectedStatus(status)
    }
}

func readToken(service: String) throws -> String {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: "auth_token",
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    var result: AnyObject?
    let status = SecItemCopyMatching(
        query as CFDictionary, &result
    )
    guard status == errSecSuccess,
        let data = result as? Data else {
        throw KeychainError.unexpectedStatus(status)
    }
    return String(decoding: data, as: UTF8.self)
}

بائیو میٹرک بائنڈنگ کے ساتھ محفوظ کرنا

مثال کلید کو بائیو میٹری سے جوڑنے کے لیے SecAccessControlCreateWithFlags کے استعمال کو ظاہر کرتی ہے۔ آئٹم تک ہر رسائی کے لیے Face ID یا Touch ID کی ضرورت ہوگی۔

swift
import LocalAuthentication

func saveWithBiometry(data: Data, key: String) throws {
    let accessControl = SecAccessControlCreateWithFlags(
        nil,
        kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
        .biometryCurrentSet,
        nil
    )

    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecValueData as String: data,
        kSecAttrAccessControl as String: accessControl as Any
    ]

    SecItemDelete(query as CFDictionary)
    let status = SecItemAdd(query as CFDictionary, nil)
    guard status == errSecSuccess else {
        throw KeychainError.unexpectedStatus(status)
    }
}

ایپس کے درمیان Keychain شیئرنگ

مثال ایک ہی ڈیولپر کی ایپس کے درمیان مشترکہ Keychain رسائی کے لیے Access Group کی ترتیب دکھاتی ہے۔ keychain-access-groups کے اختیار کی ضرورت ہے۔

swift
// Capabilities: Keychain Sharing فعال
// App IDs: group.com.example.shared

func saveSharedToken(token: Data) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: "shared_token",
        kSecValueData as String: token,
        kSecAttrAccessGroup as String:
            "group.com.example.shared",
        kSecAttrAccessible as String:
            kSecAttrAccessibleWhenUnlockedThisDeviceOnly
    ]
    SecItemAdd(query as CFDictionary, nil)
}

Keychain کے ساتھ کام کرنے کے بہترین طریقے

iOS Keychain کا صحیح استعمال کئی اہم قواعد پر عمل کرنے کی ضرورت ہے جو عام کمزوریوں اور ڈیٹا کے نقصان کو روکتے ہیں۔

تمام تصدیقی رازوں کے لیے ThisDeviceOnly استعمال کریں: kSecAttrAccessibleWhenUnlockedThisDeviceOnly اس بات کو یقینی بناتا ہے کہ ٹوکن iCloud Backup میں نہ جائیں۔ اگر کوئی حملہ آور بیک اپ تک رسائی حاصل کر لے تو اس جھنڈے والا Keychain ڈیٹا دستیاب نہیں ہوگا۔ مستثنیٰ وہ ڈیٹا ہے جو صارف کے تمام آلات پر دستیاب ہونا چاہیے (مثلاً، ملکیتی خدمات کے لیے انکرپشن کنجیاں)، جس کے لیے kSecAttrAccessibleWhenUnlocked کو kSecAttrSynchronizable کے ساتھ استعمال کریں۔

خام پاس ورڈز ذخیرہ نہ کریں - ہیشز یا سیشن ٹوکن ذخیرہ کریں۔ Apple Security Guide (2025) سفارش کرتا ہے کہ صارف کا پاس ورڈ Keychain میں کبھی سادہ متن میں محفوظ نہ کریں۔ اس کے بجائے، OAuth 2.0 کے ذریعے کامیاب تصدیق کے بعد سرور سے موصول ہونے والا ریفریش ٹوکن محفوظ کریں۔ پاس ورڈ صرف ٹوکن حاصل کرنے کے لیے استعمال ہوتا ہے اور فوری طور پر میموری سے ہٹا دیا جاتا ہے۔

Keychain کی غلطیوں کو صحیح طریقے سے سنبھالیں: ہر Keychain آپریشن ایک OSStatus لوٹاتا ہے جسے جانچنا ضروری ہے۔ خاص توجہ errSecItemNotFound (ٹوکن کی میعاد ختم یا حذف) اور errSecAuthFailed (بائیو میٹری ناکام) پر دیں۔ پہلی صورت میں، ایپ کو نئی تصدیق کی درخواست کرنی چاہیے؛ دوسری صورت میں، صارف کو متبادل طریقہ (پاس کوڈ) دکھائیں۔ کبھی بھی errSecItemNotFound کی حالت کو نظر انداز نہ کریں - nil پڑھنے کی کوشش کرنے سے ایپ کریش ہو جائے گی۔

Keychain کو حقیقی ڈیوائس پر جانچیں: سمیلیٹر میں Secure Enclave نہیں ہے اور بائیو میٹرک ACLs کو سپورٹ نہیں کرتا۔ ہمیشہ منظرناموں کی جانچ کریں: پہلا لانچ، بیک اپ سے بحالی، ڈیوائس پاس ورڈ تبدیل کرنا، ایپ کو حذف کرنا اور دوبارہ انسٹال کرنا۔ حقیقی ڈیوائس پر، ایپ حذف ہونے پر Keychain برقرار رہتا ہے، لیکن صرف اس صورت میں جب kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly جھنڈا استعمال نہ کیا گیا ہو، جو پاس کوڈ ہٹائے جانے پر صاف ہو جاتا ہے۔

Keychain آپریشنز کی تعداد کو کم سے کم کریں: ہر پڑھنے یا لکھنے کا آپریشن سسٹم سروس Securityd کو کال ہے، جو تھریڈ کو روک سکتا ہے۔ سیشن کی مدت کے لیے پڑھے گئے ٹوکنز کو میموری میں کیش کریں اور صرف ایپ ری اسٹارٹ یا تصدیقی غلطی (سرور سے 401) پر Keychain تک دوبارہ رسائی حاصل کریں۔ iOS ڈیوائس کے لاک ہونے پر خود بخود Keychain کو لاک کر دیتا ہے، لہٰذا بائیو میٹرک درخواست کے ساتھ LAContext کے ذریعے پڑھنے کا منصوبہ بنائیں۔

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

کیا میں Keychain میں ڈیٹا محفوظ کر سکتا ہوں اور ریبوٹ کے بعد پڑھ سکتا ہوں؟

ہاں، تحفظ کی کلاس kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly یا kSecAttrAccessibleAfterFirstUnlock استعمال کریں۔ ڈیٹا ریبوٹ کے بعد پہلے ڈیوائس انلاک کے بعد دستیاب ہوگا۔ ایپ لانچ پر خودکار رسائی کے لیے (انلاک کے انتظار کے بغیر) kSecAttrAccessibleAlways استعمال کریں، لیکن یہ حفاظت کم کرتا ہے۔

صارف لاگ آؤٹ پر Keychain کیسے صاف کروں؟

ہر ڈیٹا کی قسم کے لیے kSecClass والے query کے ساتھ SecItemDelete کو کال کریں۔ تمام ایپ آئٹمز کی مکمل صفائی کے لیے، یہ چلائیں: SecItemDelete([kSecClass as String: kSecClassGenericPassword] as CFDictionary)۔ kSecClassKey، kSecClassCertificate اور kSecClassInternetPassword کے لیے دہرائیں۔

kSecAttrAccessible اور kSecAttrAccessControl میں کیا فرق ہے؟

kSecAttrAccessible طے کرتا ہے کہ ڈیٹا کب دستیاب ہے (انلاک پر، پہلے انلاک کے بعد، وغیرہ)۔ kSecAttrAccessControl طے کرتا ہے کہ کون رسائی حاصل کر سکتا ہے (بائیو میٹری، پاس کوڈ، کوئی بھی تصدیق)۔ یہ مل جاتے ہیں: پہلے Protection Class، پھر ACL۔ مثال کے طور پر، ڈیٹا صرف انلاک پر اور صرف Face ID کے بعد دستیاب ہے۔

SecItemCopyMatching errSecItemNotFound کیوں لوٹاتا ہے؟

وجوہات: آئٹم کبھی محفوظ نہیں کیا گیا، پاس کوڈ ہٹانے پر آئٹم حذف ہو گیا (اگر kSecAttrAccessibleWhenPasscodeSet استعمال کیا گیا تھا)، ایپ دوبارہ انسٹال کی گئی (Keychain برقرار رہتا ہے لیکن نئے ڈیوائس پر بیک اپ سے بحال نہیں ہوتا)، Access Group یا ڈیولپر ٹیم شناخت کنندہ تبدیل ہو گیا۔ kSecAttrService اور kSecAttrAccount چیک کریں۔

میں کیسے جانچوں کہ ڈیوائس Keychain میں بائیو میٹری کو سپورٹ کرتی ہے؟

LocalAuthentication سے LAContext استعمال کریں: context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) کال کریں۔ اگر true لوٹاتا ہے - ڈیوائس Touch ID یا Face ID کو سپورٹ کرتی ہے۔ Keychain ACL کے لیے، biometryCurrentSet جھنڈا (صرف موجودہ بائیو میٹرک ڈیٹا) یا biometryAny (پہلے رجسٹرڈ کوئی بھی) استعمال کریں۔

خلاصہ

  • iOS Keychain Secure Enclave کے ذریعے انکرپشن اور ACL کے ذریعے رسائی کنٹرول کے ساتھ رازوں کے لیے ہارڈویئر محفوظ ذخیرہ ہے۔
  • Security framework آئٹمز کے ساتھ کام کرنے کے لیے SecItemAdd، SecItemCopyMatching، SecItemUpdate اور SecItemDelete فنکشنز فراہم کرتا ہے۔
  • Protection Class (kSecAttrAccessible) منظرنامے کی بنیاد پر منتخب کی جاتی ہے: WhenUnlockedThisDeviceOnly ٹوکنز کے لیے معیار ہے۔
  • بائیو میٹری کے ساتھ ACL (kSecAttrAccessControl) ہر پڑھنے کے آپریشن کے لیے Face ID یا Touch ID کی ضرورت شامل کرتا ہے۔
  • kSecClassGenericPassword 95% کیسز کو کور کرتا ہے - ٹوکنز، API کنجیاں، PIN کوڈز اور نوٹس کا ذخیرہ۔
  • ThisDeviceOnly رازوں کو iCloud Backup میں کاپی ہونے سے روکتا ہے - تصدیقی ٹوکنز کے لیے لازمی۔
  • OSStatus کی صحیح ہینڈلنگ اور حقیقی ڈیوائس پر جانچ قابل اعتماد Keychain استعمال کے لیے ضروری مشقیں ہیں۔

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

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

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

مزید پڑھیں