Only iOS13 and up?

Hi, I can't change the version from my app... Xcode give me a error, when I try to change the version for older devices (under iOS13). I get error messages inside the codes there tell me, I can't use this code on older versions. Maybe somebody know how to fix it? The Apple Support can't/want help and say I need to ask here.


We have a restaurant app and we don't want it only for iOS 13 and up, because a lot of customer have maybe older devices like iPhone 6.


I use a WebView code/setting. So nothing special but yes... like xcode not availabel.


Screenshots:

https://ibb.co/w4prQnj

https://ibb.co/LvCtPwJ

https://ibb.co/C8FsrdX

https://ibb.co/nrRVyZj

Replies

Yes, you need to have conditional statements to make it work.


Here is a typical set up.


For AppDelegate


class AppDelegate: UIResponder, UIApplicationDelegate {

    // MARK: - Application lifecycle

    var window: UIWindow?   // For iOS 12

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Override point for customization after application launch.       
        return true
    }

    func applicationWillEnterForeground(_ application: UIApplication) {

        // Do what's needed there
    }

    // MARK: - UISceneSession Lifecycle

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }

}


For SceneDelegate


class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    @available(iOS 13.0, *)
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }
    }

    @available(iOS 13.0, *)
    func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
        // This occurs shortly after the scene enters the background, or when its session is discarded.
        // Release any resources associated with this scene that can be re-created the next time the scene connects.
        // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
    }

    @available(iOS 13.0, *)
    func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
    }

    @available(iOS 13.0, *)
    func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
    }

    @available(iOS 13.0, *)
    func sceneWillEnterForeground(_ scene: UIScene) {
        // Called as the scene transitions from the background to the foreground.
        // Use this method to undo the changes made on entering the background.
        // Do it here, not in app delegate (iOS 13)
        NotificationCenter.default.post(name: .kRefreshPrefs, object: self)
    }

    @available(iOS 13.0, *)
    func sceneDidEnterBackground(_ scene: UIScene) {
        // Called as the scene transitions from the foreground to the background.
        // Use this method to save data, release shared resources, and store enough scene-specific state information
        // to restore the scene back to its current state.
    }

}

Put `@available(iOS 13.0, *)` only for the class `SceneDelegate`. You have no need to put `@available(iOS 13.0, *)` for every method.

`SceneDelegate` is not used in iOS 12 or earlier.

I think Apple developer of Xcode team should learn from Google Android Studio and Microsoft Visual Studio a lot of thing. Android studio allow user select minSDK first , before code template generating is perform. Let see the template project from Google and Microsoft, Template code project between first and last version is almost same.