CocoaPods — iOS, macOS, watchOS və tvOS layihələri üçün açıq mənbəli asılılıq meneceridir. CocoaPods Ruby dilində qurulub və 100 000-dən çox kitabxanası olan spesifikasiyalar reyestrindən (Specs) istifadə edir. İnteqrasiya layihənin bütün asılılıqlarını təsvir edən Podfile faylı vasitəsilə baş verir. Qurulumun nəticəsi əsas layihəni və bütün qoşulan modulları birləşdirən .xcworkspace-dir. CocoaPods iOS inkişafında ən populyar asılılıq meneceri olaraq qalır: Stack Overflow Survey (2025) sorğusuna görə, iOS tərtibatçılarının 34%-i ondan istifadə edir.
Əsas Məqamlar
pod install vasitəsilə .xcworkspace yaradır — yalnız bu fayl Xcode-da açılmalıdırCocoaPods — Apple ekosistemi üçün Ruby dilində yazılmış və 2011-ci ildə Eladio Lopez tərəfindən nəşr edilmiş asılılıq meneceridir. CocoaPods Xcode layihələrinə üçüncü tərəf kitabxanaların inteqrasiyası problemini həll edir: faylların əl ilə köçürülməsi və linker flags konfiqurasiyası əvəzinə, tərtibatçı asılılıqları Podfile-də təsvir edir və pod install işə salır. CocoaPods avtomatik olaraq mənbə fayllarını yükləyir, kompilator bayraqlarını konfiqurasiya edir və .xcworkspace iş məkanı yaradır.
CocoaPods memarlığı üç komponentdən ibarətdir: CocoaPods.app (CLI aləti), Specs (GitHub-da mərkəzi spesifikasiyalar reyestri) və Podfile (layihə konfiqurasiyası). Specs reyestri versiya tarixçəsi ilə 100 000-dən çox kitabxana ehtiva edir. pod install yerinə yetirilərkən, CocoaPods reyestrin ən son versiyasını yükləyir (pod repo update), asılılıqları tapır, versiya ağacını həll edir və bütün podların inteqrasiyası ilə .xcworkspace yaradır. Hər bir kitabxana ayrıca target kimi kompilyasiya olunur ki, bu da asılılıqları təcrid etməyə və ad konfliktlərinin qarşısını almağa imkan verir.
CocoaPods Xcode ilə sıx inteqrasiya olunub: o, başlıq yolları və linker bayraqları ilə Pods.xcconfig faylları yaradır, həmçinin User Script Sandboxing konfiqurasiya edir. macOS-da CocoaPods-dan istifadə etmək üçün Ruby 2.6+ (bütün Mac-lərdə əvvəlcədən quraşdırılıb) və Command Line Tools ilə Xcode tələb olunur. Statistikalar: 2025-ci ildə CocoaPods 10 milyarddan çox pod yüklənməsini emal etdi və orta iOS layihəsində CocoaPods vasitəsilə 15-dən 40-a qədər asılılıq var.
CocoaPods hər bir kitabxananı ayrıca Git deposu kimi yükləyir, onun .podspec spesifikasiyasını yoxlayır və statik freymvork və ya dinamik kitabxana kimi kompilyasiya edir. Podlar digər podlardan asılı ola bilər — CocoaPods asılılıq qrafəri qurur və versiya konfliktlərini həll edir. Əgər iki kitabxana eyni asılılığın müxtəlif versiyalarını tələb edərsə, CocoaPods uyğun versiya tapmağa çalışır və ya xəta bildirir. Bütün asılılıqlar və onların versiyaları Podfile.lock faylında təsbit edilir və versiya nəzarət sisteminə əlavə edilməlidir.
CocoaPods-un əl ilə inteqrasiya ilə müqayisədə üstünlükləri: asılılıqların avtomatik idarə edilməsi, mərkəzləşdirilmiş kitabxana reyestri, alt-spesifikasiyaların (subspecs) dəstəyi, şəxsi depolarların yaradılması imkanı və semantik nəzarət vasitəsilə versiyalaşdırma. Tərtibatçı komandası üçün CocoaPods bütün iştirakçıların eyni kitabxana versiyalarından istifadə etməsini təmin edir — Podfile.lock istənilən maşında qurumanın təkrarlana bilməsini təmin edir.
Podfile — Xcode layihəsinin asılılıqlarını təyin edən Ruby dilində konfiqurasiya faylıdır. Podfile layihənin kök qovluğunda .xcodeproj ilə yanaşı yerləşir. CocoaPods sintaksisi Ruby DSL-ə (Domain Specific Language) əsaslanır ki, bu da dəyişənlərdən, şərtlərdən və dövrlərdən istifadə etməyə imkan verir. Minimal Podfile platforma və ən azı bir asılılıq ehtiva edir.
platform :ios, '15.0'
target 'MyApp' do
pod 'Alamofire', '~> 5.9'
pod 'SnapKit', '~> 5.7'
pod 'Kingfisher', '~> 8.0'
endplatform :ios, '15.0' əsas sətri minimal iOS versiyasını təyin edir. target 'MyApp' direktivi konkret target üçün asılılıqları qruplaşdırır. Hər bir pod 'Name', '~> version' sətri kitabxananın adını və versiyasını göstərir. '~> 5.9' operatoru “5.9-dan 6.0-a qədər, 6.0 istisna olmaqla istənilən versiya” deməkdir — bu, breaking changes-dən qoruyan semantik versiyalaşdırmadır.
CocoaPods çevik versiya operatorlarını dəstəkləyir: '= 1.0' (dəqiq versiya), '>= 1.0' (minimal), '< 2.0' (maksimal), '~> 1.2.3' (yalnız patch). Kitabxananı lokal qovluqdan qoşmaq üçün pod 'MyLib', :path => '../MyLib' istifadə oluna bilər. Git-dən qoşmaq üçün: pod 'MyLib', :git => 'https://github.com/user/MyLib.git', :tag => '1.0.0'.
platform :ios, '15.0'
use_frameworks! :linkage => :static
inhibit_all_warnings!
target 'MyApp' do
pod 'Alamofire', '~> 5.9'
pod 'Firebase/Crashlytics', '~> 11.0'
target 'MyAppTests' do
inherit! :search_paths
pod 'Nimble', '~> 13.0'
end
end
target 'MyWatchExtension' do
platform :watchos, '9.0'
pod 'Alamofire', '~> 5.9'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
end
end
enduse_frameworks! podların statik kitabxanalar əvəzinə freymvork kimi kompilyasiyasını aktivləşdirir (Xcode 15+ üçün defolt davranış). :linkage => :static atributu freymvorkları məcburi olaraq statik edir və tətbiqin ölçüsünü azaldır. inhibit_all_warnings! podlardan xəbərdarlıqları söndürür — quruma jurnalının təmizliyi üçün faydalıdır. inherit! :search_paths ilə iç-içə targetlər (məsələn, testlər üçün) yalnız axtarış yollarını alır, bütün asılılıqları yenidən kompilyasiya etmir. post_install bloku bütün pod targetləri üçün quruma konfiqurasiyasını tənzimləyir — bu, vahid minimal iOS versiyası təyin etmək üçün standart nümunədir.
Podfile.lock pod install zamanı avtomatik yaradılır. O, keçidli asılılıqlar da daxil olmaqla, bütün quraşdırılmış asılılıqların dəqiq versiyalarını təsbit edir. Lock faylı depoda saxlanmalıdır — onsuz başqa maşında pod install fərqli versiyalar quraşdıra bilər. pod update PodName əmri konkret podu yeniləyərək Podfile.lock-u dəyişdirir. pod outdated daha yeni versiyaları mövcud olan podların siyahısını göstərir.
Podspec — CocoaPods üçün kitabxananı təsvir edən .podspec genişlənməli Ruby faylıdır. Podspec metadata (ad, versiya, müellif), mənbə kodu, asılılıqlar, sistem freymvorkları və platforma tələblərini ehtiva edir. CocoaPods reyestrdə nəşrdən əvvəl pod spec lint validasiyası ilə podspec-i yoxlayır.
Pod::Spec.new do |s|
s.name = 'NetworkingKit'
s.version = '1.2.0'
s.summary = 'Lightweight HTTP client for iOS'
s.description = 'NetworkingKit is a Swift HTTP client with async/await support, built-in caching, and automatic retry logic.'
s.homepage = 'https://github.com/user/NetworkingKit'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Developer' => 'dev@example.com' }
s.source = { :git => 'https://github.com/user/NetworkingKit.git', :tag => s.version.to_s }
s.ios.deployment_target = '15.0'
s.swift_version = '5.9'
s.source_files = 'Sources/**/*.swift'
s.dependency 'Alamofire', '~> 5.9'
ends.name — reyestrdə kitabxananın unikal adı. s.version Git teqinə uyğundur (nəşr üçün vacibdir). s.source_files — mənbə faylları daxil etmək üçün glob nümunəsi. s.dependency versiya ilə digər podlardan asılılığı göstərir. s.ios.deployment_target minimal dəstəklənən iOS versiyasını təyin edir — CocoaPods layihə köhnə versiyadan istifadə edərsə avtomatik xəbərdarlıq edəcək. Şəxsi podlar üçün reyestrdə nəşr əvəzinə Podfile-də :path istifadə oluna bilər.
Kitabxananın mərkəzi Specs reyestrinə nəşri pod trunk push NetworkingKit.podspec vasitəsilə hüyata keçirilir. Əvvəlcə pod trunk register dev@example.com 'Developer' vasitəsilə qeydiyyat tələb olunur. CocoaPods podspec-in düzgünlüyünü yoxlayır və Specs deposuna pull request göndərir. Alternativ şirkətin daxili kitabxanaları üçün pod repo push şəxsi reyestridir.
Subspecs kitabxananı istifadəçinin seçmə olaraq qoşa biləcəyi modullara bölməyə imkan verir. Məsələn, Firebase subspecs-dən istifadə edir: pod 'Firebase/Crashlytics' Firebase-in digər modulları olmadan yalnız Crashlytics-i qoşur. Subspec baza konfiqurasiyasını miras alır və öz source_files və asılılıqlarını əlavə edə bilər.
| Əmr | Fəaliyyət |
|---|---|
pod spec lint | Podspec-in düzgünlüyünün yoxlanılması |
pod trunk register | CocoaPods Trunk-də qeydiyyat |
pod trunk push | Podspec-in reyestrdə nəşri |
pod repo push | Şəxsi reyestrdə nəşr |
pod lib lint | Kitabxananın lokal validasiyası |
CocoaPods RubyGems — Ruby-nin standart paket meneceri vasitəsilə quraşdırılır. macOS-da Ruby əvvəlcədən quraşdırılıb, ona görə terminalda bir əmr kifayətdir. Alternativ üsul CocoaPods-u ayrıca formula kimi quraşdıran Homebrew-dir. Qurulumdan sonra layihənin inisializasiyası əsas konfiqurasiya ilə Podfile yaradan pod init əmri ilə hüyata keçirilir. Podfile-ı asılılıqlarla doldurduqdan sonra tərtibatçı pod install işə salır — CocoaPods kitabxanaları yükləyir və iş məkanı yaradır.
# Quraşdırma CocoaPods vasitəsilə RubyGems
sudo gem install cocoapods
# Alternativ quraşdırma vasitəsilə Homebrew
brew install cocoapods
# İnisiallaşdırma Podfile layihədə
cd /path/to/Project
pod init
# Asılılıqların quraşdırılması
pod installƏhəmiyyətli qayda: pod install-dan sonra həmişə .xcworkspace-i açın, .xcodeproj-u yox. Əgər .xcodeproj-u açsanız, Xcode podları görməyəcək və quruma link xətalarla nəticələnəcək. pod install əmri asılılıqları yalnız Podfile dəyişdikdə və ya ilk işə salınmada yükləyir. Bütün podların məcburi yenidən quraşdırılması üçün pod install --repo-update və ya pod deintegrate && pod install istifadə olunur.
Yenilənmə CocoaPods sudo gem update cocoapods və ya brew upgrade cocoapods vasitəsilə hüyata keçirilir. CocoaPods versiyası pod --version əmri ilə yoxlanılır. 1.12 versiyasından (2024) etibarən CocoaPods modulların ciddi yoxlanılması parametrləri və təkmilləşdirilmiş keçidli asılılıqların həlli ilə Xcode 15-i dəstəkləyir. mid-2025 üçün son sabit versiya Swift 6 dəstəyi və 50+ podlu layihələr üçün asılılıq qrafərinin həllinin təkmilləşdirilmiş performansı ilə 1.16-dır.
# Bütün podların ən son versiyalara yenilənməsi
pod update
# Konkret podun yenilənməsi
pod update Alamofire
# Köhnəlmiş asılılıqların yoxlanılması
pod outdated
# Silinmə CocoaPods layihədən
pod deintegratepod update arqumentsiz bütün podları Podfile-ə uyğun olaraq ən son uyğun versiyalara yeniləyir (~> operatorlarını nəzərə alaraq). pod outdated Podfile.lock-dakı cari versiya ilə ən son mövcud versiya arasındakı fərqi göstərir. pod deintegrate CocoaPods-u layihədən tamamilə silir — .xcworkspace, konfiqurasiya faylları və quruma parametrlərini silir. Bu, Swift Package Manager-ə miqrasiya zamanı faydalıdır.
Asılılıqların idarə edilməsi CocoaPods-da dörd aspekti əhatə edir: versiyaların təsbiti, konfliktlərin həlli, qurumanın optimallaşdırılması və keçidli asılılıqlarla iş. CocoaPods Podfile.lock əsasında asılılıq qrafəri qurur — layihədə hər ikisi C-dən asılı olan A və B kitabxanaları istifadə olunursa, CocoaPods hər ikisinin tələblərinə cavab verən C versiyasını tapır.
Konfliktlər iki asılılıq eyni kitabxananın uyğunsuz versiyalarını tələb etdikdə yaranır. CocoaPods ziddiyyətli tələbləri göstərən xəta bildirir. Həll yolları: asılılıqlardan birini uyğun versiyaya yeniləmək, konkret commit göstərən pod 'Lib', :git => ... istifadə etmək və ya asılılığı dəyişdirilmiş kitabxanalardan birini fork etmək. Böyük layihələr üçün hər pull request-də pod lib lint ilə CI validasiyasını konfiqurasiya etmək tövsiyə olunur.
CocoaPods bir neçə inkişaf etmiş imkan təklif edir: kitabxanaların lokal inkişafı üçün :path, fork-ları qoşmaq üçün :git, inkişaf budaqlarını sınamaq üçün :branch. use_frameworks! direktivi :linkage => :static ilə son ikilik faylın ölçüsünü minimuma endirir. A/B testləri və fürşət bayraqları üçün Podfile-də Ruby şərti konstruksiyaları vasitəsilə müxtəlif versiya podları qoşula bilər.
platform :ios, '15.0'
use_frameworks!
# Mühitin təyini
is_debug = defined?(DEBUG) && DEBUG
target 'MyApp' do
# Əsas asılılıqlar
pod 'Alamofire', '~> 5.9'
pod 'SnapKit', '~> 5.7'
# İnkişaf üçün lokal kitabxana
pod 'MyInternalLib', :path => '../MyInternalLib'
# Debug üçün şərti asılılıq
if is_debug
pod 'SwiftyBeaver', '~> 2.0'
else
pod 'CocoaLumberjack', '~> 3.8'
end
# Bug düzəlişi ilə fork
pod 'Kingfisher', :git => 'https://github.com/user/Kingfisher.git', :branch => 'fix-memory-leak'
end
abstract_target 'Pods' do
pod 'Alamofire'
endabstract_target konkret Xcode targetinə bağlanmadan ümumi asılılıqlar üçün virtual target yaradır. Ruby şərti konstruksiyaları Debug və Release konfiqurasiyaları üçün müxtəlif kitabxanaları qoşmağa imkan verir. Lokal kitabxana ilə :path inkişafı sürətləndirir — dəyişikliklər pod install-u yenidən işə salmadan tətbiq olunur. :branch rejimi rəsmi buraxılışdan əvvəl dəyişiklikləri sınamaq üçün faydalıdır.
CocoaPods, Swift Package Manager (SPM) və Carthage — iOS inkişafında üç əsas asılılıq meneceridir. Hər birinin öz memarlığı, inteqrasiya yanaşması və nəzarət səviyyəsi var. CocoaPods kitabxanaların sayına görə liderdir, SPM Xcode-da daxili dəstək sayəsində üstünlük qazanır, Carthage populyarlıq baxımından geri qalır, lakin maksimum nəzarət verir.
| Meyar | CocoaPods | SPM | Carthage |
|---|---|---|---|
| Konfiqurasiya dili | Ruby DSL | Package.swift (Swift) | Cartfile |
| Xcode ilə inteqrasiya | Workspace vasitəsilə | Daxili | Əl ilə (xcframeworks) |
| Kitabxanaların sayı | 100 000+ | ~65 000 | ~20 000 |
| Keçidli asılılıqlar | Avtomatik | Avtomatik | Əl ilə |
| Resurs dəstəyi | Bəli (resource bundles) | Bəli (Resources) | Xeyr |
| Qurulum sürəti | Orta | Sürətli | Sürətli |
| Versiyalaşdırma | Gemfile.lock | Package.resolved | Cartfile.resolved |
CocoaPods maksimum kitabxana uyğunluğunun tələb olunduğu layihələr üçün seçim olaraq qalır (bir çox köhnə kitabxanalar yalnız CocoaPods vasitəsilə mövcuddur). SPM yeni layihələr üçün tövsiyə olunur — o, Xcode-a daxildir, əlavə alətlərin quraşdırılmasını tələb etmir və Apple tərəfindən dəstəklənir. Carthage nadir hallarda, əsasən Xcode konfiqurasiyasına minimal müdaxilə tələb olunan layihələrdə istifadə olunur. 2024-cü ildən etibarən Apple SPM-i fəal şəkildə inkişaf etdirir və bir çox məşhur kitabxanalar (Alamofire, Firebase, SnapKit) artıq onu CocoaPods ilə bərabər dəstəkləyir.
CocoaPods-dan SPM-ə miqrasiya pod deintegrate (CocoaPods-un silinməsi) və Xcode-da File → Add Package Dependencies vasitəsilə paketlərin əlavə edilməsi ilə hüyata keçirilir. Əsas çətinliklər: resurslu kitabxanalar (şriftlər, şəkillər, storyboard) davranışda fərqlənə bilər, CocoaPods plaginlərinin (məsələn, kod yaratma üçün) SPM-də analoqu yoxdur. CocoaPods-spesifik imkanların tələb olunduğu layihələr üçün CocoaPods-un saxlanılması tövsiyə olunur: kod generasiyası, resurs paketləri və post_install hook-ları vasitəsilə fərdi quruma mərhələləri.
CocoaPods — sabit alətdir, lakin tərtibatçılar vaxtaşırı tipik problemlərlə qarşılaşır. Onların əksəriyyəti Ruby versiyaları, keşləmə və ya asılılıq konfliktləri ilə bağlıdır. Aşağıda ən tez-tez rast gəlinən ssenarilər və onların həll yolları verilmişdir.
«The sandbox is not in sync with the Podfile.lock» xətası — pod install-u işə salmazdan əvvəl depoda Podfile.lock dəyişdirildikdə baş verir. Həlli: pod install və ya pod deintegrate && pod install yerinə yetirmək. CI mühitləri üçün quruma skriptinə pod install əlavə etmək tövsiyə olunur. Digər tez-tez rast gəlinən səbəb tərtibatçılar arasında CocoaPods versiyasındakı fərqdir: bütün maşınlarda pod --version yoxlayın.
Specs reyestrinin yenilənməsində xəta — adətən şəbəkə problemləri və ya köhnəlmiş Git deposu səbəbindən yaranır. Həlli: pod repo update --verbose təfürratı göstərir. Specs zədələnibsə: rm -rf ~/.cocoapods/repos/master && pod repo add master https://github.com/CocoaPods/Specs.git. Yavaş internetdə CDN istifadə oluna bilər — CocoaPods 1.8+-dan defolt olaraq aktivdir.
Duplicate symbols xətası — bir kitabxananın iki dəfə qoşulması və ya podlar arasında simvol konflikti zamanı baş verir. Həlli: Podfile-ı təkrarlanma üçün yoxlayın, simvolları təcrid etmək üçün use_frameworks! :linkage => :static istifadə edin. Problem kitabxanadadırsa — müellifə bildirin. Bəzən Derived Data-nı təmizləmək və Xcode-u yenidən başlatmaq kömək edir.
CocoaPods Apple Silicon Mac-də quraşdırılmır — macOS-da əvvəlcədən quraşdırılmış Ruby Rosetta 2 vasitəsilə işləyir və bu, kompilyasiya xətalarına səbəb olur. Həlli: yerli ARM64 memarlığı üçün rbenv və ya asdf vasitəsilə Ruby quraşdırın. Alternativ — Homebrew istifadə edin: brew install cocoapods avtomatik olaraq ARM64 üçün kompilyasiya edir. Gems x86_64 üçün quraşdırılıbsa, arch -arm64 sudo gem install cocoapods əmri problemi həll edir.
Podların yavaş quraşdırılması — böyük layihələrdə pod install dəqiqələr çəkə bilər. Həlli: diaqnostika üçün --verbose aktivləşdirin. Specs artıq aktualdırsa --no-repo-update istifadə edin. CI serverləri üçün Pods/ və ~/.cocoapods qovluqlarını keşləyin. CocoaPods 1.12+-da install! 'cocoapods', :parallel_download => true vasitəsilə paralel yüklənmə əlavə edilib.
| Problem | Səbəb | Həll |
|---|---|---|
| Sandbox not in sync | Podfile.lock dəyişikliyi | pod install |
| Specs deposu zədələnib | Git xətası | Specs-i yenidən quraşdırın |
| Duplicate symbols | Kitabxana konflikti | use_frameworks! :static |
| Apple Silicon xətası | Rosetta altında Ruby | Homebrew / rbenv ARM |
| Yavaş qurulum | Böyük asılılıq qrafəri | Parallel download, keş |
Tez-tez verilən suallar
CocoaPods — Apple layihələri (iOS, macOS, watchOS, tvOS) üçün asılılıq meneceridir. O, üçüncü tərəf kitabxanaların yüklənməsini, konfiqurasiyasını və inteqrasiyasını avtomatlaşdırır. Faylların əl ilə köçürülməsi və kompilator bayraqlarının konfiqurasiyası əvəzinə, Podfile-a pod 'LibraryName' sətri əlavə etmək və pod install işə salmaq kifayətdir.
Podfile — tərtibatçı tərəfindən yazılan konfiqurasiya faylı: orada kitabxana adları və versiya operatorları (~> 5.9, >= 2.0, dəqiq versiya) göstərilir. Podfile.lock avtomatik yaradılır və bütün quraşdırılmış asılılıqların dəqiq versiyalarını təsbit edir. Podfile.lock Git-də saxlanmalıdır — bu, komandanın bütün üzvlərinin eyni versiyalardan istifadə etməsini təmin edir.
Layihə qovluğundan terminalda pod deintegrate yerinə yetirin — CocoaPods .xcworkspace, konfiqurasiya faylları və quruma parametrlərini siləcək. Sonra .xcodeproj-u Xcode-da açın, File → Add Package Dependencies bölməsinə keçin və lazımi paketləri əlavə edin. SPM əlavə quraşdırma tələb etməyən daxili Apple həllidir.
Bəli, CocoaPods və SPM bir layihədə birlikdə mövcud ola bilər. CocoaPods asılılıqların bir hissəsini .xcworkspace vasitəsilə idarə edir, SPM — Xcode-un Package Dependencies bölməsi vasitəsilə. Lakin keçidli asılılıq konfliktləri mümkündür: hər iki sistem eyni kitabxananın müxtəlif versiyalarını qoşmağa çalışarsa, quruma xəta verəcək. Bütün asılılıqlar üçün bir menecerdən istifadə etmək tövsiyə olunur.
Kitabxananın təsviri ilə .podspec faylı yaradın. Lokal validasiya üçün pod spec lint yerinə yetirin. pod trunk register email name vasitəsilə qeydiyyatdan keçin. Spec-i pod trunk push YourLib.podspec vasitəsilə nəşr edin. CocoaPods avtomatik olaraq kitabxananızı mərkəzi Specs reyestrinə əlavə edəcək — nəşrdən sonra bütün tərtibatçılar pod 'YourLib' vasitəsilə onu əldə edə bilər.
Nəticə
pod trunk push vasitəsilə kitabxananın reyestrdə nəşri üçün spesifikasiya faylıgem install cocoapods vasitəsilə, konfiqurasiya pod init və pod install vasitəsilə hüyata keçirilirpod install, keşin təmizlənməsi və freymvork konfiqurasiyası ilə həll olunurAçar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun