jitsi / jitsi-meet

Jitsi Meet - Secure, Simple and Scalable Video Conferences that you use as a standalone app or embed in your web application.
https://jitsi.org/meet
Apache License 2.0
23.34k stars 6.77k forks source link

Black screen when I join a meeting on an iOS device. #11420

Closed harsh47sharma closed 2 years ago

harsh47sharma commented 2 years ago

Description:

I have created a fresh flutter application and have used jitsi_meet. 4.0.0 flutter package. I have used the example code given in the flutter package. When I start the meeting, the ios device joins the meeting, but the whole screen goes complete black. Just to mention, I am able to hear and see audio and video of the ios device on my other android device which is also in the same meeting. I am not sure what is causing the issue but I suspect something wrong with the podfile which I am using.

Please let me know if any other information in required

Thanks.

Steps to reproduce:

  1. Create a new flutter application on android studio.
  2. Add the package jitsi_meet in your application.
  3. Add the podfile which I have added below in the additional information.
  4. Once the app is installed, start the meeting.

Expected behavior:

Once we click on the join meeting. We should see the meeting interface with all the participants and Jitsi UI.

Actual behavior:

For me, it is showing the black screen when I. join the meeting. The application freezes completely.

Versions

Here is the screenshot when I have joined the meeting in the application:

8AA5EC5A-6702-4D77-8A97-F50A8D35219A

Additional information:

Podfile:

platform :ios, '11.0'

ENV['COCOAPODS_DISABLE_STATS'] = 'true'

project 'Runner', {
  'Debug' => :debug,
  'Profile' => :release,
  'Release' => :release,
}

def flutter_root
  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
  unless File.exist?(generated_xcode_build_settings_path)
    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
  end

  File.foreach(generated_xcode_build_settings_path) do |line|
    matches = line.match(/FLUTTER_ROOT\=(.*)/)
    return matches[1].strip if matches
  end
  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end

require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)

flutter_ios_podfile_setup

def flutter_install_ios_plugin_pods(ios_application_path = nil)
  ios_application_path ||= File.dirname(defined_in_file.realpath) if self.respond_to?(:defined_in_file)
  raise 'Could not find iOS application path' unless ios_application_path

  symlink_dir = File.expand_path('.symlinks', ios_application_path)
  system('rm', '-rf', symlink_dir) # Avoid the complication of dependencies like FileUtils.

  symlink_plugins_dir = File.expand_path('plugins', symlink_dir)
  system('mkdir', '-p', symlink_plugins_dir)

  plugins_file = File.join(ios_application_path, '..', '.flutter-plugins-dependencies')
  plugin_pods = flutter_parse_plugins_file(plugins_file)
  plugin_pods.each do |plugin_hash|
    plugin_name = plugin_hash['name']
    plugin_path = plugin_hash['path']
    if (plugin_name && plugin_path)
      symlink = File.join(symlink_plugins_dir, plugin_name)
      File.symlink(plugin_path, symlink)

      if plugin_name == 'flutter_ffmpeg'
          pod 'flutter_ffmpeg/full-lts', :path => File.join('.symlinks', 'plugins', plugin_name, 'ios')
      else
          pod plugin_name, :path => File.join('.symlinks', 'plugins', plugin_name, 'ios')
      end
    end
  end
end

target 'Runner' do
  use_frameworks!
  use_modular_headers!
  pod 'JitsiMeetSDK', '~> 3.3.0'
  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
        config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
                '$(inherited)',

                ## dart: PermissionGroup.calendar
                # 'PERMISSION_EVENTS=1',

                ## dart: PermissionGroup.reminders
                # 'PERMISSION_REMINDERS=1',

                ## dart: PermissionGroup.contacts
                'PERMISSION_CONTACTS=1',

                ## dart: PermissionGroup.camera
                # 'PERMISSION_CAMERA=1',

                ## dart: PermissionGroup.microphone
                # 'PERMISSION_MICROPHONE=1',

                ## dart: PermissionGroup.speech
                # 'PERMISSION_SPEECH_RECOGNIZER=1',

                ## dart: PermissionGroup.photos
                # 'PERMISSION_PHOTOS=1',

                ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
                # 'PERMISSION_LOCATION=1',

                ## dart: PermissionGroup.notification
                # 'PERMISSION_NOTIFICATIONS=1',

                ## dart: PermissionGroup.mediaLibrary
                # 'PERMISSION_MEDIA_LIBRARY=1',

                ## dart: PermissionGroup.sensors
                # 'PERMISSION_SENSORS=1',

                ## dart: PermissionGroup.bluetooth
                # 'PERMISSION_BLUETOOTH=1',

                ## dart: PermissionGroup.appTrackingTransparency
                # 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',

                ## dart: PermissionGroup.criticalAlerts
                # 'PERMISSION_CRITICAL_ALERTS=1'
              ]

        config.build_settings['ENABLE_BITCODE'] = 'NO'
        config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
    end
  end
end

Here are the logs from xcode: 2022-04-23 18:48:26.706999+0530 Runner[3954:50777] Metal API Validation Enabled 2022-04-23 18:48:26.949276+0530 Runner[3954:51427] flutter: Observatory listening on http://127.0.0.1:50094/RseGnPAyjrw=/ 2022-04-23 18:49:14.937556+0530 Runner[3954:51408] flutter: JitsiMeetingOptions: JitsiMeetingOptions{room: plugintestroom, serverURL: null, subject: My Plugin Test Meeting, token: null, audioMuted: true, audioOnly: true, videoMuted: true, userDisplayName: Plugin Test User, userEmail: fake@email.com, iosAppBarRGBAColor :#0080FF80, featureFlags: {FeatureFlagEnum.WELCOME_PAGE_ENABLED: false, FeatureFlagEnum.PIP_ENABLED: false} } 2022-04-23 18:49:15.593149+0530 Runner[3954:52533] sessionActivationDidCompleteWithState: 2 2022-04-23 18:49:15.593468+0530 Runner[3954:52533] dispatch WatchStateChanged: { state = WCSessionActivationStateActivated; } 2022-04-23 18:49:15.715789+0530 Runner[3954:52533] [WC] -[WCSession onqueue_handleUpdateSessionState:]_block_invoke dropping as pairingIDs no longer match. pairingID (null), client pairingID: (null) 2022-04-23 18:49:15.715865+0530 Runner[3954:52534] [JitsiMeetSDK] Sending WatchStateChanged with no listeners registered. 2022-04-23 18:49:15.719658+0530 Runner[3954:52533] [WC] WCSession is not paired 2022-04-23 18:49:16.192991+0530 Runner[3954:52526] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x6000039cc620> F8BB1C28-BAE8-11D6-9C31-00039315CD46 2022-04-23 18:49:16.250651+0530 Runner[3954:51394] [JitsiMeetSDK] '2022-04-23T13:19:16.249Z', '[modules/browser/BrowserCapabilities.js]', 'This appears to be react-native, ver: 0.61.5-jitsi.2' 2022-04-23 18:49:16.686225+0530 Runner[3954:51394] [JitsiMeetSDK] [features/base/lastn] There is no active conference, not updating last N 2022-04-23 18:49:16.693349+0530 Runner[3954:52427] [JitsiMeetSDK] [features/base/lastn] There is no active conference, not updating last N 2022-04-23 18:49:16.693549+0530 Runner[3954:52427] [JitsiMeetSDK] [features/base/net-info] Network changed {"isOnline":null,"details":{"isConnectionExpensive":false},"networkType":"wifi"} 2022-04-23 18:49:16.693776+0530 Runner[3954:52427] [JitsiMeetSDK] [modules/connectivity/NetworkInfo.js] updateNetworkInfo { isOnline: null } 2022-04-23 18:49:16.701619+0530 Runner[3954:52587] [JitsiMeetSDK] [RNCallKit][setProviderConfiguration:] dictionary = { iconTemplateImageName = CallKitIcon; localizedName = Jitsimeetdemo; } 2022-04-23 18:49:16.701808+0530 Runner[3954:52587] [JitsiMeetSDK] [features/base/connection] No connection found while disconnecting. 2022-04-23 18:49:16.702112+0530 Runner[3954:52427] [JitsiMeetSDK] [RNCallKit][providerConfigurationFromDictionary: { iconTemplateImageName = CallKitIcon; localizedName = Jitsimeetdemo; }] 2022-04-23 18:49:16.948862+0530 Runner[3954:52533] [JitsiMeetSDK] [features/base/lastn] There is no active conference, not updating last N 2022-04-23 18:49:17.253196+0530 Runner[3954:52533] [boringssl] boringssl_metrics_log_metric_block_invoke(151) Failed to log metrics 2022-04-23 18:49:17.327338+0530 Runner[3954:52533] [boringssl] boringssl_metrics_log_metric_block_invoke(151) Failed to log metrics 2022-04-23 18:49:17.354097+0530 Runner[3954:52587] [boringssl] boringssl_metrics_log_metric_block_invoke(151) Failed to log metrics 2022-04-23 18:49:17.421381+0530 Runner[3954:52427] [JitsiMeetSDK] [features/base/lib-jitsi-meet] Config loaded from https://meet.jit.si/config.js?room=plugintestroom 2022-04-23 18:49:17.421676+0530 Runner[3954:52427] [JitsiMeetSDK] [features/base/config] Extending config with: {"startAudioOnly":true,"startWithAudioMuted":true,"startWithVideoMuted":true,"subject":"My Plugin Test Meeting"} 2022-04-23 18:49:17.448607+0530 Runner[3954:52587] [JitsiMeetSDK] [modules/connectivity/NetworkInfo.js] updateNetworkInfo { isOnline: null } 2022-04-23 18:49:17.454190+0530 Runner[3954:52587] [JitsiMeetSDK] [features/analytics] Initialized 1 analytics handlers 2022-04-23 18:49:17.454447+0530 Runner[3954:52587] [JitsiMeetSDK] [features/base/media] Start muted: audio, video 2022-04-23 18:49:17.462465+0530 Runner[3954:52427] [JitsiMeetSDK] [features/base/media] Start audio only set to true 2022-04-23 18:49:17.462758+0530 Runner[3954:52427] [JitsiMeetSDK] [features/base/audio-only] Audio-only enabled 2022-04-23 18:49:17.462983+0530 Runner[3954:52427] [JitsiMeetSDK] [features/base/lastn] There is no active conference, not updating last N 2022-04-23 18:49:17.472330+0530 Runner[3954:52536] [JitsiMeetSDK] [modules/xmpp/xmpp.js] P2P STUN servers: [ { urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' } ] 2022-04-23 18:49:17.472533+0530 Runner[3954:52536] [JitsiMeetSDK] [modules/xmpp/xmpp.js] (TIME) Strophe connecting: 1650719957471 2022-04-23 18:49:17.479445+0530 Runner[3954:51408] flutter: _onConferenceWillJoin broadcasted with message: {event: onConferenceWillJoin, url: https://meet.jit.si/plugintestroom} 2022-04-23 18:49:17.480340+0530 Runner[3954:51408] flutter: plugintestroom will join with message: {event: onConferenceWillJoin, url: https://meet.jit.si/plugintestroom} 2022-04-23 18:49:17.490724+0530 Runner[3954:52587] [JitsiMeetSDK] [modules/RTC/RTCUtils.js] Available devices: [] 2022-04-23 18:49:17.491200+0530 Runner[3954:50777] Using jitsi-preferences suite for userDefaults 2022-04-23 18:49:17.495049+0530 Runner[3954:52427] [JitsiMeetSDK] [features/base/net-info] Network changed {"isOnline":true,"details":{"isConnectionExpensive":false},"networkType":"wifi"} 2022-04-23 18:49:17.495242+0530 Runner[3954:52427] [JitsiMeetSDK] [modules/connectivity/NetworkInfo.js] updateNetworkInfo { isOnline: true } 2022-04-23 18:49:18.355289+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/XmppConnection.js] Stream resume enabled, but WebSockets are not enabled 2022-04-23 18:49:18.355494+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/strophe.ping.js] XMPP pings will be sent every 10000 ms 2022-04-23 18:49:18.355646+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/xmpp.js] (TIME) Strophe connected: 1650719958348 2022-04-23 18:49:18.355794+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/xmpp.js] My Jabber ID: 55d9401b-1e2b-4a64-b746-e5b7702a3d7d@meet.jit.si/ESufORGhcwPE 2022-04-23 18:49:18.355951+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/RTC/CodecSelection.js] Codec preferences for the conference are JVB: vp9, P2P: vp9 2022-04-23 18:49:18.368863+0530 Runner[3954:51394] [JitsiMeetSDK] [modules/xmpp/xmpp.js] JID 55d9401b-1e2b-4a64-b746-e5b7702a3d7d@meet.jit.si/ESufORGhcwPE using MUC nickname 55d9401b 2022-04-23 18:49:18.370681+0530 Runner[3954:51394] [JitsiMeetSDK] [modules/xmpp/ChatRoom.js] Joined MUC as plugintestroom@conference.meet.jit.si/55d9401b 2022-04-23 18:49:18.370867+0530 Runner[3954:51394] [JitsiMeetSDK] [modules/e2eping/e2eping.js] Initializing e2e ping; pingInterval=10000, analyticsInterval=60000. 2022-04-23 18:49:18.371048+0530 Runner[3954:51394] [JitsiMeetSDK] [modules/connectivity/ParticipantConnectionStatus.js] RtcMuteTimeout set to: 10000 2022-04-23 18:49:18.395446+0530 Runner[3954:51394] [JitsiMeetSDK] [JitsiConference.js] No VAD Processor was provided. Talk while muted detection service was not initialized! 2022-04-23 18:49:18.395660+0530 Runner[3954:51394] [JitsiMeetSDK] [JitsiConference.js] No VAD Processor was provided. Noisy microphone detection service was not initialized! 2022-04-23 18:49:18.395806+0530 Runner[3954:51394] [JitsiMeetSDK] [modules/qualitycontrol/ReceiveVideoController.js] Updating ReceiverVideoConstraints lastN(25) 2022-04-23 18:49:18.395902+0530 Runner[3954:51394] [JitsiMeetSDK] [modules/statistics/AvgRTPStatsReporter.js] Avg RTP stats will be calculated every 15 samples 2022-04-23 18:49:18.396078+0530 Runner[3954:51394] [JitsiMeetSDK] [JitsiConference.js] backToP2PDelay: 5 2022-04-23 18:49:18.403737+0530 Runner[3954:52533] [JitsiMeetSDK] [modules/videosipgw/VideoSIPGW.js] creating VideoSIPGW 2022-04-23 18:49:18.403947+0530 Runner[3954:52533] [JitsiMeetSDK] [features/base/lastn] There is no active conference, not updating last N 2022-04-23 18:49:18.408360+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/moderator.js] Focus jid set to: undefined 2022-04-23 18:49:18.408621+0530 Runner[3954:52534] [JitsiMeetSDK] [RNCallKit][startCall] callUUID = DF49EB8E-B5D3-494A-8705-96AAD7EAF5FA 2022-04-23 18:49:18.410293+0530 Runner[3954:52534] [JitsiMeetSDK] [RNCallKit][requestTransaction] transaction = <CXTransaction 0x6000039569e0 UUID=6B1F794C-BDF3-4E10-B13F-2113F5841B95 isComplete=0 actions=( "<CXStartCallAction 0x600000b6c3f0 UUID=10236C98-3884-4CB5-937D-FB0F54E42673 state=0 commitDate=(null) callUUID=DF49EB8E-B5D3-494A-8705-96AAD7EAF5FA handle=<CXHandle 0x6000039f5e60 type=Generic value=https://meet.jit.si/plugintestroom> contactIdentifier=(null) video=0 relay=0 upgrade=0 retry=0 emergency=0 isVoicemail=0 ttyType=0 localLandscapeAspectRatio={0, 0} localPortraitAspectRatio={0, 0} dateStarted=(null) localSenderIdentityUUID=(null) shouldSuppressInCallUI=0>" )> 2022-04-23 18:49:18.411081+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/moderator.js] Session ID: null machine UID: 50d8b0567f7298a70680b91e1b3f97f9 2022-04-23 18:49:18.423456+0530 Runner[3954:52533] [JitsiMeetSDK] [RNCallKit][updateCall] callUUID = DF49EB8E-B5D3-494A-8705-96AAD7EAF5FA options = { displayName = "My Plugin Test Meeting"; hasVideo = 0; } 2022-04-23 18:49:18.426865+0530 Runner[3954:52427] [JitsiMeetSDK] [RNCallKit][CXProviderDelegate][provider:performStartCallAction:] 2022-04-23 18:49:18.567788+0530 Runner[3954:52427] [JitsiMeetSDK] [RNCallKit][CXProviderDelegate][provider:didActivateAudioSession:] 2022-04-23 18:49:18.602437+0530 Runner[3954:52427] [boringssl] boringssl_metrics_log_metric_block_invoke(151) Failed to log metrics 2022-04-23 18:49:18.614028+0530 Runner[3954:52533] [JitsiMeetSDK] [features/base/redux] redux state persisted. 3c58105e376d019f6a9e5e6d17d1595e -> 72474debc04bea28a245c3172dc8dcc5 2022-04-23 18:49:18.677845+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/moderator.js] Focus jid set to: focus@auth.meet.jit.si 2022-04-23 18:49:18.678037+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/moderator.js] Authentication enabled: false 2022-04-23 18:49:18.678179+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/moderator.js] External authentication enabled: false 2022-04-23 18:49:18.678339+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/moderator.js] Sip gateway enabled: false 2022-04-23 18:49:18.763350+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/ChatRoom.js] entered plugintestroom@conference.meet.jit.si/focus { affiliation: 'owner', role: 'moderator', jid: 'focus@auth.meet.jit.si/focus', isFocus: true, isHiddenDomain: false } 2022-04-23 18:49:18.771298+0530 Runner[3954:52588] [JitsiMeetSDK] [modules/version/ComponentsVersions.js] Got focus version: 1.0.874 2022-04-23 18:49:18.771544+0530 Runner[3954:52588] [JitsiMeetSDK] [modules/xmpp/ChatRoom.js] Jicofo supports restart by terminate: true 2022-04-23 18:49:18.771722+0530 Runner[3954:52588] [JitsiMeetSDK] [modules/xmpp/ChatRoom.js] (TIME) MUC joined: 1650719958766 2022-04-23 18:49:18.771860+0530 Runner[3954:52588] [JitsiMeetSDK] [features/video-quality] setReceiverVideoConstraint: 180 2022-04-23 18:49:18.776475+0530 Runner[3954:52533] [JitsiMeetSDK] [features/base/lastn] Setting last N to: 0 2022-04-23 18:49:18.776745+0530 Runner[3954:52533] [JitsiMeetSDK] [modules/qualitycontrol/ReceiveVideoController.js] Updating ReceiverVideoConstraints lastN(0) 2022-04-23 18:49:18.778637+0530 Runner[3954:51408] flutter: _onConferenceJoined broadcasted with message: {event: onConferenceJoined, url: https://meet.jit.si/plugintestroom} 2022-04-23 18:49:18.779204+0530 Runner[3954:51408] flutter: plugintestroom joined with message: {event: onConferenceJoined, url: https://meet.jit.si/plugintestroom} 2022-04-23 18:49:18.783597+0530 Runner[3954:52427] [JitsiMeetSDK] [JitsiConference.js] P2P? peerCount: 0, hasBotPeer: false => false 2022-04-23 18:49:18.783780+0530 Runner[3954:52427] [JitsiMeetSDK] [modules/xmpp/ChatRoom.js] Subject is changed to 2022-04-23 18:49:18.788232+0530 Runner[3954:52588] [JitsiMeetSDK] [RNCallKit][setMuted] callUUID = DF49EB8E-B5D3-494A-8705-96AAD7EAF5FA 2022-04-23 18:49:18.788500+0530 Runner[3954:52588] [JitsiMeetSDK] [RNCallKit][requestTransaction] transaction = <CXTransaction 0x600003955680 UUID=66CF2251-42D2-4B8D-A947-D1E1A7662AE7 isComplete=0 actions=( "<CXSetMutedCallAction 0x600002c2e800 UUID=832475D5-0001-40F5-A848-350C70AC0C0D state=0 commitDate=(null) callUUID=DF49EB8E-B5D3-494A-8705-96AAD7EAF5FA muted=1>" )> 2022-04-23 18:49:18.965166+0530 Runner[3954:52534] [JitsiMeetSDK] [modules/xmpp/ChatRoom.js] Subject is changed to My Plugin Test Meeting 2022-04-23 18:57:52.170299+0530 Runner[3954:60183] [connection] nw_connection_add_timestamp_locked_on_nw_queue [C3] Hit maximum timestamp count, will start dropping events

Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>$(DEVELOPMENT_LANGUAGE)</string>
    <key>CFBundleDisplayName</key>
    <string>Jitsimeetdemo</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>jitsimeetdemo</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>$(MARKETING_VERSION)</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>$(CURRENT_PROJECT_VERSION)</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>NSCameraUsageDescription</key>
    <string>$(PRODUCT_NAME) MyApp needs access to your camera for meetings.</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>$(PRODUCT_NAME) MyApp needs acFcess to your microphone for meetings.</string>
    <key>UIBackgroundModes</key>
    <array>
        <string>audio</string>
        <string>voip</string>
    </array>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIMainStoryboardFile</key>
    <string>Main</string>
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>
</dict>
</plist>

main.dart:

import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:jitsi_meet/jitsi_meet.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(debugShowCheckedModeBanner: false, home: Meeting());
  }
}

class Meeting extends StatefulWidget {
  const Meeting({Key? key}) : super(key: key);

  @override
  _MeetingState createState() => _MeetingState();
}

class _MeetingState extends State<Meeting> {
  final serverText = TextEditingController();
  final roomText = TextEditingController(text: "plugintestroom");
  final subjectText = TextEditingController(text: "My Plugin Test Meeting");
  final nameText = TextEditingController(text: "Plugin Test User");
  final emailText = TextEditingController(text: "fake@email.com");
  final iosAppBarRGBAColor =
  TextEditingController(text: "#0080FF80"); //transparent blue
  bool? isAudioOnly = true;
  bool? isAudioMuted = true;
  bool? isVideoMuted = true;

  @override
  void initState() {
    super.initState();
    JitsiMeet.addListener(JitsiMeetingListener(
        onConferenceWillJoin: _onConferenceWillJoin,
        onConferenceJoined: _onConferenceJoined,
        onConferenceTerminated: _onConferenceTerminated,
        onError: _onError));
  }

  @override
  void dispose() {
    super.dispose();
    JitsiMeet.removeAllListeners();
  }

  @override
  Widget build(BuildContext context) {
    double width = MediaQuery.of(context).size.width;
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Container(
          padding: const EdgeInsets.symmetric(
            horizontal: 16.0,
          ),
          child: kIsWeb
              ? Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Container(
                width: width * 0.30,
                child: meetConfig(),
              ),
              Container(
                  width: width * 0.60,
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Card(
                        color: Colors.white54,
                        child: SizedBox(
                          width: width * 0.60 * 0.70,
                          height: width * 0.60 * 0.70,
                          child: JitsiMeetConferencing(
                            extraJS: [
                              // extraJs setup example
                              '<script>function echo(){console.log("echo!!!")};</script>',
                              '<script src="https://code.jquery.com/jquery-3.5.1.slim.js" integrity="sha256-DrT5NfxfbHvMHux31Lkhxg42LY6of8TaYyK50jnxRnM=" crossorigin="anonymous"></script>'
                            ],
                          ),
                        )),
                  ))
            ],
          )
              : meetConfig(),
        ),
      ),
    );
  }

  Widget meetConfig() {
    return SingleChildScrollView(
      child: Column(
        children: <Widget>[
          SizedBox(
            height: 16.0,
          ),
          TextField(
            controller: serverText,
            decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: "Server URL",
                hintText: "Hint: Leave empty for meet.jitsi.si"),
          ),
          SizedBox(
            height: 14.0,
          ),
          TextField(
            controller: roomText,
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: "Room",
            ),
          ),
          SizedBox(
            height: 14.0,
          ),
          TextField(
            controller: subjectText,
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: "Subject",
            ),
          ),
          SizedBox(
            height: 14.0,
          ),
          TextField(
            controller: nameText,
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: "Display Name",
            ),
          ),
          SizedBox(
            height: 14.0,
          ),
          TextField(
            controller: emailText,
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: "Email",
            ),
          ),
          SizedBox(
            height: 14.0,
          ),
          TextField(
            controller: iosAppBarRGBAColor,
            decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: "AppBar Color(IOS only)",
                hintText: "Hint: This HAS to be in HEX RGBA format"),
          ),
          SizedBox(
            height: 14.0,
          ),
          CheckboxListTile(
            title: Text("Audio Only"),
            value: isAudioOnly,
            onChanged: _onAudioOnlyChanged,
          ),
          SizedBox(
            height: 14.0,
          ),
          CheckboxListTile(
            title: Text("Audio Muted"),
            value: isAudioMuted,
            onChanged: _onAudioMutedChanged,
          ),
          SizedBox(
            height: 14.0,
          ),
          CheckboxListTile(
            title: Text("Video Muted"),
            value: isVideoMuted,
            onChanged: _onVideoMutedChanged,
          ),
          Divider(
            height: 48.0,
            thickness: 2.0,
          ),
          SizedBox(
            height: 64.0,
            width: double.maxFinite,
            child: ElevatedButton(
              onPressed: () {
                _joinMeeting();
              },
              child: Text(
                "Join Meeting",
                style: TextStyle(color: Colors.white),
              ),
              style: ButtonStyle(
                  backgroundColor:
                  MaterialStateColor.resolveWith((states) => Colors.blue)),
            ),
          ),
          SizedBox(
            height: 48.0,
          ),
        ],
      ),
    );
  }

  _onAudioOnlyChanged(bool? value) {
    setState(() {
      isAudioOnly = value;
    });
  }

  _onAudioMutedChanged(bool? value) {
    setState(() {
      isAudioMuted = value;
    });
  }

  _onVideoMutedChanged(bool? value) {
    setState(() {
      isVideoMuted = value;
    });
  }

  _joinMeeting() async {
    String? serverUrl = serverText.text.trim().isEmpty ? null : serverText.text;

    // Enable or disable any feature flag here
    // If feature flag are not provided, default values will be used
    // Full list of feature flags (and defaults) available in the README
    Map<FeatureFlagEnum, bool> featureFlags = {
      FeatureFlagEnum.WELCOME_PAGE_ENABLED: false,
    };
    if (!kIsWeb) {
      // Here is an example, disabling features for each platform
      if (Platform.isAndroid) {
        // Disable ConnectionService usage on Android to avoid issues (see README)
        featureFlags[FeatureFlagEnum.CALL_INTEGRATION_ENABLED] = false;
      } else if (Platform.isIOS) {
        // Disable PIP on iOS as it looks weird
        featureFlags[FeatureFlagEnum.PIP_ENABLED] = false;
      }
    }
    // Define meetings options here
    var options = JitsiMeetingOptions(room: roomText.text)
      ..serverURL = serverUrl
      ..subject = subjectText.text
      ..userDisplayName = nameText.text
      ..userEmail = emailText.text
      ..iosAppBarRGBAColor = iosAppBarRGBAColor.text
      ..audioOnly = isAudioOnly
      ..audioMuted = isAudioMuted
      ..videoMuted = isVideoMuted
      ..featureFlags.addAll(featureFlags)
      ..webOptions = {
        "roomName": roomText.text,
        "width": "100%",
        "height": "100%",
        "enableWelcomePage": false,
        "chromeExtensionBanner": null,
        "userInfo": {"displayName": nameText.text}
      };

    debugPrint("JitsiMeetingOptions: $options");
    await JitsiMeet.joinMeeting(
      options,
      listener: JitsiMeetingListener(
          onConferenceWillJoin: (message) {
            debugPrint("${options.room} will join with message: $message");
          },
          onConferenceJoined: (message) {
            debugPrint("${options.room} joined with message: $message");
          },
          onConferenceTerminated: (message) {
            debugPrint("${options.room} terminated with message: $message");
          },
          genericListeners: [
            JitsiGenericListener(
                eventName: 'readyToClose',
                callback: (dynamic message) {
                  debugPrint("readyToClose callback");
                }),
          ]),
    );
  }

  void _onConferenceWillJoin(message) {
    debugPrint("_onConferenceWillJoin broadcasted with message: $message");
  }

  void _onConferenceJoined(message) {
    debugPrint("_onConferenceJoined broadcasted with message: $message");
  }

  void _onConferenceTerminated(message) {
    debugPrint("_onConferenceTerminated broadcasted with message: $message");
  }

  _onError(error) {
    debugPrint("_onError broadcasted: $error");
  }
}

Flutter doctor:

apple@APPLEs-MacBook-Pro ios % flutter doctor -v [✓] Flutter (Channel stable, 2.10.2, on macOS 12.3.1 21E258 darwin-x64, locale en-GB) • Flutter version 2.10.2 at /Users/apple/Documents/development/flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 097d3313d8 (9 weeks ago), 2022-02-18 19:33:08 -0600 • Engine revision a83ed0e5e3 • Dart version 2.16.1 • DevTools version 2.9.2

[✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1) • Android SDK at /Users/apple/Library/Android/sdk • Platform android-32, build-tools 32.1.0-rc1 • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 11.0.11+0-b60-7590822) • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 13.2.1) • Xcode at /Applications/Xcode.app/Contents/Developer • CocoaPods version 1.11.3

[✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2021.1) • Android Studio at /Applications/Android Studio copy.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 11.0.11+0-b60-7590822)

[✓] Android Studio (version 2021.1) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 11.0.11+0-b60-7590822)

[✓] Connected device (2 available) • iPhone 13 (mobile) • 0FBC1F29-156C-4613-AC24-0930D7B56700 • ios • com.apple.CoreSimulator.SimRuntime.iOS-15-2 (simulator) • Chrome (web) • chrome • web-javascript • Google Chrome 100.0.4896.127

[✓] HTTP Host Availability • All required HTTP hosts are available

• No issues found!

saghul commented 2 years ago

Please report this to the Flutter plugin, we don't maintain it. The Jitsi Meet SDK that plugin is using is quite old, we are on 5.X now.