Azimjon Abdurasulov

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

  1. Platform Channels arxitekturasi: Dart va Swift ko'prigi
  2. MethodChannel amaliyoti: Swift tomoni va MainActor
  3. Tip-xavfsiz aloqa: Pigeon 29.0.4
  4. Mavjud iOS loyihasiga Flutter ulash (Add-to-App)
  5. Paketlar boshqaruvi: CocoaPods'dan SwiftPM'ga o'tish
  6. Faqat nativ Swift talab qiluvchi funksiyalar
  7. Liquid Glass dizayn bo'shlig'i va vaqtinchalik yechim
  8. Reliz: flutter build ipa va App Store Connect
  9. Xulosa
  10. 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:** Standart UIViewController vorisi bo'lib, SwiftUI'dagi UIViewControllerRepresentable yoki 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 UIScene sukut 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:

  1. 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.
  2. Live Activities va Dynamic Island: live_activities (2.6.0) yordamida buyurtma holati kabi hodisalar boshqariladi, lekin vizual taqdimot SwiftUI ActivityConfiguration ichida yoziladi.
  3. 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/*.xcarchive arxivini hosil qiladi va build/ios/ipa/ katalogiga tayyor .ipa faylini 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 @MainActor inobatga 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.

Manbalar {#manbalar}

  1. Writing Custom Platform-Specific Code — Flutter Docs
  2. Pigeon Code Generation Tool — pub.dev
  3. Integrating Flutter into Existing iOS Apps (Add-to-App)
  4. CocoaPods Trunk Plans (2026-12-02)
  5. Flutter Swift Package Manager Integration

Markdown manba

iOS Lessons