Flutter 6: iOS bilan integratsiya va Platform Channels
💙 Flutter — Mobile (iOS, Android) & Desktop (macOS, Windows)
Flutter 6: iOS bilan integratsiya va Platform Channels
Holat: 2026-yil sentabr. Krossplatforma dasturchining eng kuchli ustunligi — kerak bo'lganda to'g'ridan-to'g'ri operatsion tizimning nativ imkoniyatlariga chiqa olishidir. Ushbu darsda Flutter va iOS (Swift) o'rtasida ma'lumot almashish (MethodChannel, Pigeon 29.0.4), mavjud iOS ilovasiga Flutter qo'shish (Add-to-App), Swift Package Manager (SwiftPM) integratsiyasi hamda qaysi funksiyalar sof Swift kodini talab qilishi ko'rsatiladi.
Mundarija
- Platform Channels arxitekturasi: Dart va Swift ko'prigi
- MethodChannel amaliyoti: Swift tomoni va MainActor
- Tip-xavfsiz aloqa: Pigeon 29.0.4
- Mavjud iOS loyihasiga Flutter ulash (Add-to-App)
- Paketlar boshqaruvi: CocoaPods'dan SwiftPM'ga o'tish
- Faqat nativ Swift talab qiluvchi funksiyalar
- Liquid Glass dizayn bo'shlig'i va vaqtinchalik yechim
- Reliz: flutter build ipa va App Store Connect
- Xulosa
- Manbalar
1. Platform Channels arxitekturasi: Dart va Swift ko'prigi](#platform-channels)
Flutter ilovasi operatsion tizimning o'ziga xos imkoniyatlariga (Bluetooth, kamera, batareya holati, maxsus datchiklar) murojaat qilish uchun Platform Channels mexanizmidan foydalanadi:
+------------------------+ +------------------------+
| Flutter (Dart) | | iOS (Swift) |
| | | |
| MethodChannel.invoke | == binariy ===> | FlutterMethodChannel |
| (xabar yuborish) | xabarlar | (handler / delegate) |
| | <== (javob) === | |
+------------------------+ +------------------------+
Xabarlar standart koder (StandardMessageCodec) orqali binariy ko'rinishga o'giriladi: Dart'dagi String, int, Map, List avtomatik ravishda Swift'dagi String, Int, [String: Any], [Any] turlariga aylanadi.
2. MethodChannel amaliyoti: Swift tomoni va MainActor {#method-channel}
Dart tomoni:
import 'package:flutter/services.dart';
class BatteryService {
static const MethodChannel _channel = MethodChannel('uz.azimjondev.battery');
static Future<int> getBatteryLevel() async {
try {
final int level = await _channel.invokeMethod('getBatteryLevel');
return level;
} on PlatformException {
return -1;
}
}
}
Swift tomoni (iOS 26 / Swift 6 xavfsizligi):
Swift 6 da UIDevice ob'ekti @MainActor ga bog'langan. Shuning uchun platforma xabarlarini qayta ishlashda oqim xavfsizligini ta'minlash uchun MainActor.assumeIsolated qo'llaniladi:
@preconcurrency import Flutter
import UIKit
public final class BatteryPlugin: NSObject, @preconcurrency FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(
name: "uz.azimjondev.battery",
binaryMessenger: registrar.messenger()
)
let instance = BatteryPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
@MainActor
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
if call.method == "getBatteryLevel" {
let device = UIDevice.current
device.isBatteryMonitoringEnabled = true
if device.batteryState == .unknown {
result(FlutterError(code: "UNAVAILABLE", message: "Batareya darajasi noma'lum", details: nil))
} else {
result(Int(device.batteryLevel * 100))
}
} else {
result(FlutterMethodNotImplemented)
}
}
}
3. Tip-xavfsiz aloqa: Pigeon 29.0.4 {#pigeon}
MethodChannel ning eng katta kamchiligi — satrlar (string) orqali chaqirilishi va tiplar xavfsiz emasligidir (agar Dart tomonida metod nomida xato qilsangiz, faqat runtime'da ma'lum bo'ladi).
Buning oldini olish uchun Google rasmiy Pigeon kod-generatorini yaratgan (Pigeon pub.dev).
Pigeon kirish fayli (pigeons/messages.dart):
import 'package:pigeon/pigeon.dart';
@ConfigurePigeon(
PigeonOptions(
dartOut: 'lib/src/messages.g.dart',
swiftOut: 'ios/Runner/Messages.g.swift',
),
)
@HostApi()
abstract class DeviceHostApi {
int getBatteryLevel();
}
Ushbu shablon asosida Pigeon Dart uchun ham, Swift uchun ham kompilyatsiya vaqtida qat'iy tiplangan protokol va chaqiruvlarni avtomatik generatsiya qiladi.
4. Mavjud iOS loyihasiga Flutter ulash (Add-to-App) {#add-to-app}
Katta korporativ iOS ilovasini birdaniga Flutter'ga ko'chirish shart emas. Apple ilovasi ichiga Flutterni bitta yoki bir nechta ekran ko'rinishida qo'shish mumkin (Add-to-App):
- **
FlutterEngine:** Flutter runtime'ni xotirada boshqaradi. Ilova ishga tushganda oldindan qizdirib (pre-warm) qo'yiladi. - **
FlutterViewController:** StandartUIViewControllervorisi bo'lib, SwiftUI'dagiUIViewControllerRepresentableyoki UIKit UINavigationController zanjiriga oddiy ekran kabi ulanadi.
5. Paketlar boshqaruvi: CocoaPods'dan SwiftPM'ga o'tish {#swiftpm}
Tarixiy jihatdan Flutter plaginlari CocoaPods orqali o'rnatilar edi. Biroq 2026-yilda jiddiy o'zgarishlar yuz berdi:
- Flutter 3.44 (2026-05-20): Swift Package Manager (SwiftPM) plaginlar uchun rasmiy sukut bo'yicha paket menejeriga aylandi.
- CocoaPods kelajagi: CocoaPods jamoasi rasman e'lon qilganidek, uning Master Trunk ombori 2026-yil 2-dekabrdan boshlab faqat o'qish (Read-only) rejimiga o'tadi (CocoaPods Blog).
- Google ma'lumotlariga ko'ra, eng ommabop top 100 ta Flutter plaginining 92 tasi allaqachon SwiftPM'ga to'liq moslashtirilgan.
- iOS talabi: Flutter 3.47 dan boshlab minimal qo'llab-quvvatlanadigan tizim versiyasi iOS 15 qilib belgilandi.
- UIScene: Flutter 3.41 dan boshlab
UIScenesukut bo'yicha integratsiya qilingan bo'lib, Apple'ning iOS 27 uchun e'lon qilgan talablariga to'liq javob beradi.
6. Faqat nativ Swift talab qiluvchi funksiyalar {#native-features}
Har qanday Flutter dasturchisi bilishi kerak: quyidagi imkoniyatlar sof Flutter widgetlari orqali qurilmaydi va baribir nativ Swift/SwiftUI kodini talab qiladi:
- WidgetKit (Asosiy ekran va qulflangan ekran vidjetlari): Vidjet interfeysi faqat SwiftUI'da chiziladi.
home_widget(0.10.0) plagini faqat App Group orqali Dart'dan SwiftUI vidjetiga ma'lumot uzatish vazifasini bajaradi. - Live Activities va Dynamic Island:
live_activities(2.6.0) yordamida buyurtma holati kabi hodisalar boshqariladi, lekin vizual taqdimot SwiftUI ActivityConfiguration ichida yoziladi. - Fon ishlari (Background Processing): Apple tizimida qat'iy vaqt chegaralari (BGTaskScheduler) mavjud bo'lib, uzoq davom etuvchi fon jarayonlarini boshqarishda
workmanager(0.10.10) nativ cheklovlarga duch keladi.
7. Liquid Glass dizayn bo'shlig'i va vaqtinchalik yechim {#liquid-glass}
Apple'ning eng so'nggi Liquid Glass dizayn tili Cupertino widgetlariga hali kiritilmagan (#191058 masalasi ochiq turibdi). Shunga qaramay, Flutter'ning BackdropFilter widgeti orqali unga juda yaqin shishasimon vizual effekt hosil qilish mumkin:
import 'dart:ui';
import 'package:flutter/material.dart';
Widget buildGlassCard({required Widget child}) {
return ClipRRect(
borderRadius: BorderRadius.circular(20),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 15, sigmaY: 15),
child: Container(
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: 0.15),
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: Colors.white.withValues(alpha: 0.25),
width: 1.5,
),
),
padding: const EdgeInsets.all(20),
child: child,
),
),
);
}
8. Reliz: flutter build ipa va App Store Connect {#release}
Ilovani App Store'ga topshirish uchun tayyorlash:
flutter build ipa --release
Ushbu buyruq avtomatik ravishda:
- Dart kodini AOT rejimida mashina kodiga kompilyatsiya qiladi;
- SwiftPM orqali barcha bog'liqliklarni yig'adi;
build/ios/archive/*.xcarchivearxivini hosil qiladi vabuild/ios/ipa/katalogiga tayyor.ipafaylini eksport qiladi.
9. Xulosa {#xulosa}
- MethodChannel oddiy xabarlar almashish uchun xizmat qiladi, ammo jamoaviy loyihalarda tip-xavfsiz Pigeon 29.0.4 tavsiya etiladi.
- Swift 6 oqim xavfsizligi sharoitida platforma xabarlarida UIDevice bilan ishlashda
@MainActorinobatga olinishi zarur. - CocoaPods Master ombori 2026-yil oxirida read-only rejimga o'tishi sababli, Flutter'ning SwiftPM'ga to'liq o'tgani eng to'g'ri strategik qadam bo'ldi.
- WidgetKit, Live Activities va Dynamic Island har doim nativ SwiftUI bilimini talab qiladi — bu esa iOS dasturchisi uchun katta raqobatbardosh ustunlikdir.