I have made a Second Hand Book Recycler Application in Android. I used Firebase for the real time online DB. But the problem is I cannot perform a proper and powerful search. Firebase only supports a few starAt and endAt functions. When I was trying to embed a search, I have searched and got a few names, which are in the paid domain. Algolia etc. Are there any free and easy alternative. Is the AWS better than Firebase in this sense ?

I have a FloatingActionButton button, when I press it I want to display +€1 that is fading out. If user presses the button quickly 10 times, I want to display 10 texts that show +€1. Right now if I press the button again, the animation is cancelled and started again in the new position. Is there anyway I could do it the way I am trying to? My current code:

                int w = ThreadLocalRandom.current().nextInt(200,900+1);
                int h = ThreadLocalRandom.current().nextInt(1300,1900+1);
                coin.setX(w);
                coin.setY(h);
                AnimationSet set = new AnimationSet(false);
                set.addAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fadeinout));
                coin.startAnimation(set);
                coin.setVisibility(View.GONE);
                coin.setText("€"+String.valueOf(Math.round(p.getPlayerTap())));

I want to detect latin characters with umlaut mark anywhere in given string by using informatica. Requirement is whenever I found atleast one Latin character with umlaut mark anywhere in a string, I'll give output as Fail else pass.

I'm trying to make a react native application that takes screenshots of the camera preview with the overlay components included in the screenshot. (A kind of lazy/pragmatic attempt at making a sticker-camera that includes images in your photos). When I first tried { captureScreen } from "react-native-view-shot"; with a static image saving the current screen in the state, it worked well, saving into the android gallery (CameraRoll) written in the App.js as below: (return for render) return ( <View style={styles.MainContainer}> <Image source={{uri : this.state.imageURI}} style={{width: 200, height: 300, resizeMode: 'contain', marginTop: 5}} /> <Button title="Press to screenshot" onPress={this.takeScreenShot} /> <Button title="Press to save to CameraRoll" onPress={()=>CameraRoll.saveToCameraRoll(this.state.imageURI)}/> </View>);

However, when I tried using the same code but only with a Camera preview as the background, the files that saved to the gallery app (CameraRoll) did not show the overlaying components. To summarize, capturing the current viewed screen as a whole through react-native-view-shot's {captureScreen} method worked when used on a blank view, containing the components on top of it. However, once used with a camera preview as the background, the overlaying components were not captured in the saved .jpg files. The code for the camera screen capture is as below.

  render() {
    const { hasPermission } = this.state;
    if (hasPermission === null) {
      return <Text />;
    }
    if (hasPermission === false) {
      return <Text>Please Give Permission</Text>;
    }
    return (
      <View style={{ flex: 1, padding: 0, zIndex: 0 }}>
        <Text style={{ zIndex: 2, top: 50, left: 100 }}>overlay1</Text>
        <Camera style={{ width: width, height: height, zIndex: 1 }}>
          <Text style={{ zIndex: 1, top: 50, left: 100 }}>overlay2</Text>
        </Camera>

        <TouchableOpacity
          style={{
            position: "absolute",
            bottom: 10,
            alignItems: "center",
            zIndex: 2
          }}
          onPress={this.takeScreenShot}
        >
          <Text style={{ fontSize: 18, marginBottom: 10, color: "black" }}>
            {""}capture{""}
          </Text>
        </TouchableOpacity>
        <TouchableOpacity
          style={{
            position: "absolute",
            bottom: 20,
            alignItems: "center",
            zIndex: 2
          }}
          onPress={() => CameraRoll.saveToCameraRoll(this.state.imageURI)}
        >
          <Text style={{ fontSize: 18, marginBottom: 10, color: "black" }}>
            {""}save{""}
          </Text>
        </TouchableOpacity>

        <View
          style={{
            zIndex: 2,
            position: "absolute",
            top: 50,
            left: 50,
            width: 100,
            height: 100,
            backgroundColor: "black"
          }}
        />
      </View>
    );
  }
}

I am trying to Retrieve data from phpMyAdmin Database using Php script as Api its working fine on localhost, But when i upload that file to my online server it run for first time and after that it give the same data always even i have changed the values in the Database but it gives the same results, I tried accessing the same file through another device and it runs for the first time with updated results and from second it gives the same results. Please Help.🙁

I am using WordPress version 5.0.3 and PHP version 7.2

Below is my Php File.

<?php 

 //database constants
 define('DB_HOST', 'MyHostName');
 define('DB_USER', 'MyUserName');
 define('DB_PASS', 'MyPassword');
 define('DB_NAME', 'MyDatabase');

 //connecting to database and getting the connection object
 $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

 //Checking if any error occured while connecting
 if (mysqli_connect_errno()) {
 echo "Failed to connect to MySQL: " . mysqli_connect_error();
 die();
 }

 //creating a query
 $stmt = $conn->prepare("SELECT * FROM orders;");

 //executing the query 
 $stmt->execute();

 //binding results to the query 
 $stmt->bind_result($order_id, $cust_id, $emp_image, $emp_name, $service_name, $order_date, $order_amt);

 $products = array(); 

 //traversing through all the result 
 while($stmt->fetch()){
 $temp = array();
 $temp['order_id'] = $order_id; 
 $temp['cust_id'] = $cust_id; 
 $temp['emp_image'] = $emp_image; 
 $temp['emp_name'] = $emp_name; 
 $temp['service_name'] = $service_name; 
 $temp['order_date'] = $order_date; 
 $temp['order_amt'] = $order_amt; 
 array_push($products, $temp);
 }

 //displaying the result in json format 

echo json_encode($products);

$stmt->close();
$conn->close();

?>

I am in the process of making a game. I have everything set up for the movements. I have two separate views for left direction and right direction. In order to move left and right you have to press down on one lift off and press down on the other which is fine. I want to also give the user the ability to slide from one to the other and get the same results. While in the process of ACTION_DOWN slide to the other view and trigger ACTION_DOWN. Is this possible using ACTION_MOVE?

private void initializeLogic() {
    walk = 0;
    timer = new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    int bw = board.getMeasuredWidth()/2;

                    width = bw;
                }
            });
        }
    };
    _timer.schedule(timer, (int)(1000));
    left.setOnTouchListener(new View.OnTouchListener() {
        @Override public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_MOVE:

                return true;
                case MotionEvent.ACTION_DOWN:
                leftTimer = new TimerTask() {
                    @Override public void run() {
                        runOnUiThread(new Runnable() {
                            @Override public void run() {
                                android.setTranslationX((float)(android.getTranslationX() - SketchwareUtil.getDip(getApplicationContext(), (int)(2))));
                                android.requestFocus();
                                direction = 1;
                                if (switch_img == 0) {
                                    _updateFrameLeft(walk % 20);
                                    walk++;
                                }
                            }});}};
                _timer.scheduleAtFixedRate(leftTimer, (int)(0), (int)(25));
                return true;
                case MotionEvent.ACTION_UP:
                walk = 0;
                if (switch_img == 0) {
                    android.setImageResource(R.drawable.androidstand_left);
                }
                leftTimer.cancel();
                return true;
            } return false; }});
    right.setOnTouchListener(new View.OnTouchListener() {
        @Override public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_MOVE:

                return true;
                case MotionEvent.ACTION_DOWN:
                rightTimer = new TimerTask() {
                    @Override public void run() {
                        runOnUiThread(new Runnable() {
                            @Override public void run() {
                                android.setTranslationX((float)(android.getTranslationX() + SketchwareUtil.getDip(getApplicationContext(), (int)(2))));
                                android.requestFocus();
                                direction = 0;
                                if (switch_img == 0) {
                                    _updateFrame(walk % 20);
                                    walk++;
                                }
                            }});}};
                _timer.scheduleAtFixedRate(rightTimer, (int)(0), (int)(25));
                return true;
                case MotionEvent.ACTION_UP:
                walk = 0;
                if (switch_img == 0) {
                    android.setImageResource(R.drawable.androidstand);
                }
                rightTimer.cancel();
                return true;
            } return false; }});
}

I'm using JobIntentService which uses mHandler.post(new Runnable()) to show a 'floating window'.
I want the window to be shown for x seconds and then disappear, up until now I've used Service and not JobIntentService so it was easy (no handler/runnable required), now that the Runnable shows the window, I've noticed the window isn't actually shown until the runnable completes its run.

Runnable code

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
    @Override public void run() {
        labelsLayer.show();
        Thread.sleep(5000);
        //labelsLayer.hide();
    }
    // window attached only after run() completes
}

Here is the code for showing the window

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            getWindowFlag(),
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);

params.gravity = Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM;

windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowManager.addView(frameLayout, params);

LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rootView = layoutInflater.inflate(R.layout.overlay_labels_list_layout, frameLayout);

linearLayout = rootView.findViewById(R.id.overlay_labels_layout);
linearLayout.setVisibility(View.GONE);

Animation in = AnimationUtils.loadAnimation(context, 
android.R.anim.fade_in);
in.setDuration(500);
linearLayout.setVisibility(VISIBLE);
linearLayout.startAnimation(in);

I've been asked by Saudi Arabia to exclude some features sensitive in their country (specifically features identifying homosexuality, if your curious).

So I'd like to localize the app based on which app store the user is connected to.

I've tried using NSLocale on iOS and java.util.Locale for Android but these appear to be more closely tied to the country of localization the user picks on their device (in the same general area where they pick the language for the device)

The problem with this, is that many people in Saudi Arabia buy their phones over seas (Great Britain being a common example) and they end up just changing the language to Arabic, but leaving the Locale as GB. Or they just leave it in English with a Locale of GB.

So Locale seems like a poor choice for doing this type of localization. Is anyone aware of an API that lets you determine which store your device is connected to?

Couple days ago I’ve changed targetSdkVersion from 27 to 28 and, accordingly, appcompat-v7 version from 27 to 28. After that some users reported bad performance.
A small study showed that the reason for the deterioration of performance was appcompat-v7 library For example the statement

val chb = AppCompatCheckBox(this)

now takes 55.7 msec vs 0,91 ms in previous version (60 times slowly)

variants.addView(chb, LinearLayout.LayoutParams(lHeight, lWidth))

20 times slowly. Does anybody know how to fix this?

I'm new to Xamarn and C#, and I tried to make an app with a database. And I try to select every row at the table and it worked. But when I tried to insert no errors show up but and I can't see the new row that I added on SQLite browser. Also when I tried to select all the row the new did show up :).

I'm trying to make a database where anyone adds something they can see it more like store if someone adds item everyone can see it.

one more thing I always get this error when I try to select a table Unhandled Exception: Android.Database.Sqlite.SQLiteException: occurred enter image description here

this my connection

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.Database.Sqlite;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using Java.Interop;
using Java.Lang;
using SQLite;
using Boolean = System.Boolean;
using Byte = System.Byte;
using SQLiteException = SQLite.SQLiteException;

namespace AppDatabase.Resources
{
    public class DBdiagnoseX : SQLiteOpenHelper
    {
        private static readonly string DB_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        private static string DB_name = "Diagnose.db";
        private static int VERSION = 1;
        public Context context;

        public DBdiagnoseX(Context context) :base(context, DB_name, null, VERSION)
        {
            this.context = context;
        }


        public string GetSqlPath()
        {
            return Path.Combine(DB_path, DB_name);
        }

        public override SQLiteDatabase WritableDatabase
        {
            get
            {
                return CreateSQLiteDB();
            }
        }

        private SQLiteDatabase CreateSQLiteDB()
        {
            SQLiteDatabase sqliteDB=null;
            string path = GetSqlPath();
            Stream streamSQLite = null;
            FileStream streamWriter = null;
            Boolean IsSQLiteInit = false;
            try
            {
                if (File.Exists(path))
                    IsSQLiteInit = true;
                else
                {
                    streamSQLite = context.Resources.OpenRawResource(Resource.Raw.Diagnose);
                    streamWriter = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
                    if(streamSQLite!=null && streamWriter != null)
                    {
                        if(CopySQLiteDB(streamSQLite,streamWriter))
                            IsSQLiteInit = true;
                    }
                }

                if (IsSQLiteInit)
                    sqliteDB =SQLiteDatabase.OpenDatabase(path, null, DatabaseOpenFlags.OpenReadonly);
            }
            catch{ }
            return sqliteDB;
        }

i am trying to make my custom timelineview for android so i have two views like time and one image in between I want something like when I get type from list for ex. "driving" so I want to change current positions lineview color as well as its next positions top line color I tried but when I scroll it changes and not perfectly added in views so how to do that?

When I attempted to sync my project in Android Studio I got this compiling error

[== "CMake Server" ==[

{"cookie":"","inReplyTo":"configure","message":"Configuring incomplete, errors occurred!\nSee also \"C:/Users/Seshgopal/AndroidStudioProjects/MyApplication/mobile/.externalNativeBuild/cmake/debug/x86/CMakeFiles/CMakeOutput.log\".","type":"message"}

]== "CMake Server" ==]

Configuring incomplete, errors occurred!
See also "C:/Users/Seshgopal/AndroidStudioProjects/MyApplication/mobile/.externalNativeBuild/cmake/debug/x86/CMakeFiles/CMakeOutput.log".
Configuring incomplete, errors occurred!

I am trying to create a gif effect by changing the ImageView's resource with this code:

public class ActivityBeijo extends AppCompatActivity {

private Intent voucher;

private ImageView imagePlinio;
private Integer[] photos = {R.drawable.plinio1, R.drawable.plinio2, R.drawable.plinio3, R.drawable.plinio4, R.drawable.plinio5, R.drawable.plinio6, R.drawable.plinio7, R.drawable.plinio8};

private byte photo = -1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_beijo);

    voucher = new Intent(ActivityBeijo.this, ActivityVoucher.class);

    imagePlinio = findViewById(R.id.beijoImagePlinio);

    changePhoto.run();
}

public void beijoBtnProxOnClick(View v){
    startActivity(voucher);
    finish();
}

private Runnable changePhoto = new Runnable() {
    @Override
    public void run() {
        if(photo == 7)
        {
            photo = 0;
        }
        else
        {
            photo++;
        }

        imagePlinio.setImageResource(photos[photo]);
        imagePlinio.postDelayed(changePhoto, 100);
    }
};
}

In the first time it works, but from the secon time on it starts to crash. I couldn't find any usefull article or answer, so if anyone could help me i'd be very grateful.

My preference is to use stand-alone Gradle (as opposed to wrapper).

Since about Android Studio 3.2 I'm seeing a lot of issues with AS not accepting its recommended Gradle version.

I already filed a bug report with Google and have been adding updates, but got no help there.

https://issuetracker.google.com/issues/79640842

There are screenshots in the bug report, but I'll also recap:

  • I have let's say currently Gradle 5.1.1 installed (unzipped into a directory)

  • After opening a project in AS, there is an error message that "Gradle 5.1.1 is not supported, please select Gradle 5.1.1 or newer or Cancel to set up Gradle wrapper"

  • I am not able to select my Gradle 5.1.1 directory, it's not accepted with same or similar error

  • I am able to enter Gradle 5.1.1 directory in AS Settings / Gradle, but after doing "project sync" the error comes up again.

enter image description here

I am sure that I'm selecting the right directory with the right Gradle version.

$ gradle --version

Gradle 5.1.1

Build time:   2019-01-10 23:05:02 UTC Revision:    
3c9abb645fb83932c44e8610642393ad62116807

Kotlin DSL:   1.1.1
Kotlin:       1.3.11
Groovy:       2.5.4
Ant:     Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:     1.8.0_191 (Oracle Corporation 25.191-b12)
OS:      Linux 4.20.7-1-default amd64

And

$ which gradle
/home/kman/Android/gradle-5.1.1/bin/gradle

The issue happens on three (!) different Linux installs: Fedora 29, SuSE Tumbleweed, Ubuntu 18.10. All are 64-bit.

In my app, I use PayGateGlobal to let users pay and get some files.

Today I got an email (please refer to image below image) from Google and my app is rejected from Google Play Console. Even after submitting updated policy content by adding payment informations, I got the same message. This is my policy url

How to fix it please ?

The issue details

I built a small education app useful for kids. So i map subjects and concepts like below:

enter image description here

Then a kid can click on the link, then in the next activity I am streaming YouTube video in YouTubePlayer:

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <com.google.android.youtube.player.YouTubePlayerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/youtubePlayerID"
         android:layout_marginTop="35dp"
         android:gravity="center"
        />

    <ImageView
        android:id="@+id/closeLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|right"
        android:adjustViewBounds="true"
        android:scaleType="fitStart"
        android:src="@mipmap/close_32" />


</FrameLayout>

YouTubeActivity

Then i am using below code to play the video in above YouTubePlayerView:

ypView.initialize(strYoutubeKey, new YouTubePlayer.OnInitializedListener() {
           @Override
            public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult result) {
                Log.d("onInitializationFailure","Unable to load");
            }

            @Override
            public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
               if(!wasRestored)
                player.loadVideo(**strVideoURL**);
                //player.cueVideo(strVideoURL,1);
            }
        });

The strVideoURL is any video URL corresponds to the topic developed by creators available in YouTube(Ex: https://www.youtube.com/watch?v=_B5dhVPeqSg for the first topic from above picture)

I have published this app in Playstore and now Google has removed the app from Playstore.

I follow up with them couple of times and they replied saying below: Thanks for reaching out to the Google Play Team.

We reviewed your app (com.udayrepo.classelearn) and the initial takedown decision was confirmed. Your app will not be reinstated because it violates our Device and Network Abuse policy by downloading, monetizing, or otherwise accessing YouTube videos in violation of the YouTube Terms of Service or YouTube API Terms of Service.

> For example, your app is able to stream copyrighted works from YouTube illegally.

You'll need to make changes to your app before submitting it for another review. If you choose to submit your app again, you may want to review the Device and Network Abuse policy and the Developer Program Policies for additional guidance.

Please let me know if you have any other questions.

  1. Can someone help what is the right way to use YouTube videos in our app?
  2. When a kid clicks on the link, cant we play that video in our app?
  3. Can i redirect that video directly play in YouTube and not in my app.

Suggest me better which i can do.

Looking forward all your help.

I need to make a new build of an iOS app and upload it to the App Store. The provisioning profile has expired. I get also errors

No signing certificate "iOS Development" found No "iOS Development" signing certificate matching team ID "TeamID" with a private key was found.

and

No profile for team "TeamID" matching 'iOS Distribution Provisioning Profile' found Xcode couldn't find any provisioning profiles matching 'TeamID/iOS Distribution Provisioning Profile'.

The app in itunesconnect is connected to a team that I don't see in developer.apple.com . The app is also not visible there and I cannot create the needed provisioning profile. For the same reason I cannot create the provisioning profile with Automatically managed signing.

Does this mean I don't have access / rights in developer.apple.com to this app? Or I am completely misunderstanding what is happening. Any help will be appreciated.

I want to give users an option to customize header view of my custom view component library.

So I would like to follow the UITableViewDataSource protocol and trying to implement something like that.

// CustomView.swift

protocol CustomViewDatasource: class {
   func heightForHeader(in view: CustomView) -> CGFloat
   func headerView(in view: CustomView) -> UIView
}

class CustomView: UIView {
   weak var dataSource: CustomViewDatasource?
   /// How can I draw the custom header view passing by dataSource?
}

// ViewController.swift

extension ViewController: CustomViewDatasource {

  ...

  func headerView(in view: CustomView) -> UIView {
    let headerView = UIView()
    headerView.backgroundColor = .green
    return headerView
  }

  func heightForHeader(in view: CustomView) -> CGFloat {
    return 150
  }
}

How can I draw the header view passing by dataSource?

I've no idea. I'd appreciate any help.

Thanks.

I am able to move the system keyboard above the tab bar by moving its window up when keyboardWillShowNotification is sent. However when the view controller is embedded in a navigation controller and I'm slowly swiping back, the tab bar appears twice. Also the offset resets to normal if the swipe is cancelled (obviously since kyeboardWillShow event is not triggered). Observing keyboardWillChangeFrame also doesn't apply.

enter image description here

Here is some sample code to show exactly what I'm doing:

import UIKit
import Foundation

class ViewController: UIViewController { }

class SecondViewController: UIViewController {

    let textField = UITextField(frame: CGRect(x: 150, y: 150, width: 150, height: 150))

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.keyboardType = .decimalPad
        view.addSubview(textField)

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        textField.becomeFirstResponder()
    }
}

extension SecondViewController {
    private var keyboardOffset: CGFloat {
        return -tabBarHeight
    }

    private var tabBarHeight: CGFloat {
        return tabBarController?.tabBar.frame.height ?? 0
    }

    private var keyboardWindowPredicate: (UIWindow) -> Bool {
        return { $0.windowLevel > UIWindow.Level.normal }
    }

    private var keyboardWindow: UIWindow? {
        return UIApplication.shared.windows.last(where: keyboardWindowPredicate)
    }

    @objc private func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue, let keyboardWindow = keyboardWindow {
            keyboardWindow.frame.origin.y = keyboardOffset

        }
    }

    @objc private func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue, let keyboardWindow = keyboardWindow {
            keyboardWindow.frame.origin.y = 0
        }
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        textField.resignFirstResponder()
    }
}

extension Sequence {
    func last(where predicate: (Element) throws -> Bool) rethrows -> Element? {
        return try reversed().first(where: predicate)
    }
}

Can anyone explain why does this happen? I know that moving the keyboard is not something usual in iOS, but it was not my decision and I'm trying to work with it.

I can't get the remote inspector to actually display any elements, its finding my device fine, the website on my phone will highlight when hovering over it in the develop menu, but when clicking through its just blank.

Both devices are on the latest OS. The issue is with my phone and not the Mac as I have tried another device and it worked as expected.

any ideas would be appreciated

develop menu

inspector

I have subclassed UITabBarController to allow for some customization specific to my app. It is the root view controller of my UIWindow and displays itself correctly on launch, and even shows the correct tab's view hierarchy as well.

The problem is with the selected tabbar item's tint color. Inside viewDidLoad of the custom tab bar controller subclass, I have set both the unselected and selected tint colors for the tab bar. See below:

override func viewDidLoad() {
    super.viewDidLoad()

    tabBar.tintColor = .tabBarItemActiveTint
    tabBar.unselectedItemTintColor = .tabBarItemInactiveTint
    tabBar.barTintColor = .tabBarBg

    let dashboardVC = DashboardViewController.build()
    let settingsVC = SettingsTableViewController.build()
    let settingsNavC = UINavigationController(rootViewController: settingsVC)
    settingsNavC.navigationBar.barStyle = .black

    viewControllers = [dashboardVC, settingsNavC]
    selectedViewController = dashboardVC

    // Accessing the view property of each tab's root view controller forces
    // the system to run "viewDidLoad" which will configure the tab icon and
    // title in the tab bar.
    let _ = dashboardVC.view
    let _ = settingsVC.view
}

As you can see, the controller has its child view hierarchies set, and the views are loaded at the bottom so their respective viewDidLoad methods run where I have code that sets the tabBarItem. Here's an example from the dashboard view controller:

tabBarItem = UITabBarItem(title: "Dashboard", image: UIImage(named: Theme.dashboardTabBarIcon), tag: 0)

Everything about this works except for the selected icon and title. When the app launches I can see the tab bar, the first view hierarchy (the dashboard) is visible onscreen and the tabs all function properly. But the dashboard's icon and title are in an unselected state. I have to actually tap the tab bar icon to get the state to change such that it is selected.

Once you tap one of the tabs, the selected state works as normal. The issue is only on the first presentation of the tab bar.

Here is an image showing the initial state of the tab bar on launch. Notice the dashboard icon is not selected, even though it is the presented view controller.

broken tab bar icon, nothing selected