This app is not allowed to query for scheme fb in iOS

I wanted to open a Facebook Group page in the Facebook app on my iPhone but I was getting that error since I did not have any LSApplicationQueriesSchemes in my Info.plist file.

This is the code

let fbPage = "fb://profile/" + FB_GROUP_ID // Your Facebook group id e.g 8794808798015
let fbURL = URL(string:fbPage)
let canOpenURL = UIApplication.shared.canOpenURL(fbURL!)
if (canOpenURL) {
    UIApplication.shared.open(fbURL!, completionHandler: nil)
}

After adding ‘fb’ in my scheme it solves the issue.

My Info.plist file

This app is not allowed to query for scheme

Manually adding the rootViewController’s view to the view hierarchy is no longer supported. Please allow UIWindow to add the rootViewController’s view to the view hierarchy itself.

I was having this issue when setting a new rootViewController from loginViewController , which was a rootViewController in the storyboard before the transition.

SSAHomeViewController *homeViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"sIdHomeNavController"];

        [UIView transitionFromView:self.view
                            toView:homeViewController.view
                          duration:0.5
                           options:UIViewAnimationOptionTransitionFlipFromLeft
                        completion:^ (BOOL finished) {
                            if (finished) {
                                [[[UIApplication sharedApplication] windows] firstObject].rootViewController = homeViewController;
                            }
                        }];

I was not sure what was the problem. Since this works perfect on iOS 13 if I don’t use the [UIView transitionFromView] but I wanted to keep the animation effect, it looked good.

I decided to made a simple trick, by using a dummy view. Which solved this problem.

SSAHomeViewController *homeViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"sIdHomeNavController"];

        UIView *dummyView  = [[UIView alloc] initWithFrame:self.view.frame];
        dummyView.backgroundColor = [UIColor whiteColor];
        
        [UIView transitionFromView:self.view
                            toView:dummyView
                          duration:0.5
                           options:UIViewAnimationOptionTransitionFlipFromLeft
                        completion:^ (BOOL finished) {
                            if (finished) {
                                [[[UIApplication sharedApplication] windows] firstObject].rootViewController = homeViewController;
                            }
                        }];

instead of using homeViewController.view we use dummy view for the animation and white as its background, otherwise you will see black background between transitions.

Navigation in SwiftUI with multiple views

Navigation in SwiftUI video

Download Complete Login app with Laravel API

I was trying to build a simple app in iOS + SwiftUI with multiple views that uses NavigationView and NavigationLink.

This app is very simple and uses a model to navigate between destinations. Enum ViewType tracks all the destinations. If you want to have another view, View4, just add a new case in ViewType enum.

struct Menu: Identifiable {
    var id = UUID()
    var name: String
    var image: String
    var destination: ViewType
}

enum ViewType {
    case home
    case view1
    case view2
}

Our all views must have a property with menu type

struct HomeView: View {
    var menu: Menu
    
    var body: some View {
        Text("Home View")
    }
}

Our MasterView which is the main view in root ContentView. Also, we added HomeView as our default view here.

var body: some View {
        NavigationView {
            MasterView()
                .navigationBarTitle(
                    Text("Navigation Demo")
                )
            HomeView(menu: Menu(name:"Home",      image:"image",  destination:    .home))
        }.navigationViewStyle(DefaultNavigationViewStyle())
  }

In our MasterView we have an array of Menu with title and destination view case, which populated in a list view.

let  view1 =  Menu(name:"Home",      image:"image",  destination:    .home)
let  view2 =  Menu(name:"View 1",          image:"image",  destination:    .view1)
let  view3 =  Menu(name:"View 3",       image:"image",  destination:    .view2)

var body: some View {
        let menus: [Menu] = [view1, view2, view3]

        return List {
            ForEach(menus) { menu in
                self.destinationView(menu: menu)
            }
        }
}

function destinationView return a NavigationLink based on what item you choose on the list and take the user to the expected view.

func destinationView(menu: Menu) -> some View {
        
        switch menu.destination {
            case .view1:
                return NavigationLink(
                    destination: AnyView(View1(menu: menu))
                )
                {
                    Text("\(menu.name)")
                }
            case .view2:
                   return NavigationLink(
                       destination: AnyView(View2(menu: menu))
                   )
                   {
                       Text("\(menu.name)")
                   }
            default:
               return NavigationLink(
                   destination: AnyView(HomeView(menu: menu))
               )
               {
                   Text("\(menu.name)")
               }
        }
        
    }

Download the source code