Xcode 11-iOS 13でUISceneDelegate / SwiftUIをオプトアウト


106

現在Xcode 11 Beta 5を使用しています。私のアプリケーション内では、iOS 12以下で問題なく動作します。ただし、iOS 13では、デフォルトでUISceneを使用しているように見えます。これは私のアプリが何もしない原因となっています。

アプリを新規インストールで起動すると、ユーザーが同意する必要のある利用規約があります。同意した後、ロード画面に移動し、メイン画面に移動します。私が投稿したスクリーンショットでは、現在のフォアグラウンドでの背後にあるビューはスプラッシュロード画面です。

アプリケーション全体に複数のビューのシーンサポートを追加することを検討しますが、現在、私たちはより優先度の高い作業を行う必要があります。

https://imgur.com/i0qLhAL

「複数ウィンドウのサポート」は、アプリのターゲットの一般設定ですでに無効になっています。また、info.plistファイルで「複数のウィンドウを有効にする」を「いいえ」に設定しています。

これまでのところ、実際には何も機能していません。基本的に、iOS 10-12で元の動作を復元するために、複数のウィンドウとUIScene / SwiftUIをオプトアウト/無効化したいと考えています。これはiOS 13で可能ですか、それとも更新する必要がありますか?

更新:

これは、ビューのデバッグ階層のスクリーンショットです。左側はiOS 12、右側はiOS 13です。Info.plistにもシーンデリゲートクラスやメソッドにも何も追加しないと、なぜ違うのですか?Xcode 11の既存の本番環境対応コードで実行しただけです。

https://imgur.com/C3aLsDo


iOS 13以降のみをサポートする必要がありますか、それともiOS 13とiOS 12をサポートする必要がありますか?
rmaddy

iOS 11-13以降(将来のバージョン)間の@rmaddyサポート。
DavidA

メインUIはコードまたはストーリーボード経由ですか?
rmaddy

ストーリーボードで行われる@rmaddyには、参照されるxib ViewControllersにセグエがあります。
DavidA

アプリが何をいつ何をしているのかについての具体的な詳細がなければ、わかりにくいです。viewWill|DidAppearたとえば、表示されたビューコントローラーを閉じると、iOS 13ではなどのビューコントローラーメソッドが同じように呼び出されないことに注意してください。多数のライフサイクルデバッグメッセージとブレークポイントを追加し、iOS 12と13の間のフローを比較して、どこが異なるかを確認します。
rmaddy

回答:


295

あなたがいる間すべきアプリがiOSの13の下で実行され、後にされたときのシーンを使用して受け入れるあなたはまだiOSの12またはそれ以前のバージョンをサポートしながら、あなたは完全にオプトアウトすることができます。

  • Info.plistから「Application Scene Manifest」エントリを完全に削除します。

  • シーンデリゲートクラスがある場合は、削除してください。

  • アプリのデリゲートにシーン関連のメソッドがある場合は、それらのメソッドを削除してください。

  • 見つからない場合は、プロパティvar window: UIWindow?をアプリのデリゲートに追加します。

これで、アプリはアプリデリゲートのみを使用し、iOS 13ではiOS 12と同じライフサイクルを持つはずです。

注:これはSwiftまたはSwiftUIに固有のものではありません。


同時に回答も掲載しました。:-) 1つの質問- AppDelegate私が対処したその行の欠落。あなたが説明したこのプロセスでそれは自動的に戻ってきますか?(私はそれがシーンを完全に無視するので、私はあなたの答えをよりよく好きです。)
dfd

1
同じことが私にも起こり、Info.plistにマニフェストエントリも、AppDelegateメソッドも、SceneDelegateクラスもありません。私はデイビッドの「契約条件」のように自分のコントローラーをrootViewControllerとして設定していますが、上記の質問でここに示したものと同じように見えます。このUIの不具合に悩まされて前進できないので、助けてください。
Mohsin Khubaib Ahmed

1
@MohsinKhubaibAhmedあなたは完全に異なる問題について質問しています。stackoverflow.com/questions/56435510/…を
rmaddy

1
こんにちは!3ステップの指示に従いましたが、起動画面が表示された後、黒い画面が表示されました。メインストーリーボードが選択され、初期ビューコントローラも選択されています。何か提案はありますか?
user3191334

1
@ user3191334黒い画面も表示されました。私の場合、それは私にデフォルトの黒い背景を与える暗いモードでした。ベースのストーリーボードにコンテンツを追加すると、すべてが表示されます。
Gordon Dove

40

回答を使用して、うまくいけばコメントよりも書式を整えます。(コメントは自由に編集してください。)

これも私が直面した問題であり、ここにはいくつかのシナリオがあります。

  • Xcode 11の既存のUIKitアプリで作業する場合は、それを開くだけで問題なく動作します。すべての私のアプリはで、持っていない SceneDelegateファイルもへの変更AppDelegateやストーリーボード。
  • iOS 13をターゲットとする新しいUIKITアプリを作成する場合は、[Use SwiftUI]チェックボックスをオフのままにして、アプリを作成します。

しかし、あなたが3番目のシナリオに直面しているのではないかと思っています。iOS 13より前のバージョンをターゲットとする新しい `UIKitアプリを作成します。(私は実際にiOS 9をターゲットにしました!)

はい、テンプレートでは15のエラー(ベータ5以降)とSceneDelegateファイル/クラスが表示されます。幸い、Xcodeを使用すると、1つを除くすべてを自動修正できます。

最後の1つは、SceneDelegateクラスの一部である1行を追加することですが、残念ながらAppleはそれをAppDelegateクラスから除外しました-ダース@available(iOS 13.0, *)句を超えると、SceneDelegateiOS 12を実行しているかどうかをオプトアウトして何を推測したのですか?それはだないでそこにApDelegate

これをAppDelegateに追加します。

var window: UIWindow?

その時点で、UIKitiOS 12以前を対象とした実行中のアプリが作成されているはずです。


これをありがとう。私のシナリオは、ほとんどあなたが言った最初のポイント、Xcode 11の既存のUIKitアプリですが、それを開いてもうまくいきません。追加したビューのデバッグ階層の更新を見てください。
DavidA

また、AppDelegateでは、var window:UIWindow?
DavidA

あなたは私を心配させました!(そして、私はまだ少し心配しています。)既存のアプリについてはほとんど更新していません-先週はSwiftUIに不満があり、UIKit for iOS 13のみでレイアウトを試すことに興味がありました。しかし、私の既存のアプリは?iPadマルチタスクをサポートしますが、Xcode 11では変更ませんでした。SceneDelegateテストしていないことは、(a)iOS 13で動作し、(b)複数のウィンドウをまったくサポートしておらず、2つのアプリ間でビューを分割するだけです。(私もドラッグアンドドロップをサポートしていません。)あなたの側で何か他のことはありますか?
dfd

繰り返すには、私は単にXcodeの11無しに私のXcodeの10のアプリを開いてSceneDelegate、いいえSwiftUI、私のiOS 9+アプリケーションの複数のインスタンスを作成する能力。パフォーマンスはいつもと同じです-それらはすべてCoreImageリアルタイムで更新されるカスタムフィルターです-そして、まあ、私にとっては?ビュー階層のシーンに関連するOS関連の残骸がある場合、それがシーンをサポートしていない場合、それは意味がありません。(そして最後に、ええ、私はまだ少し心配です。しかし、それはベータ5でもあります。)うまくいけば、私が見ているものを再現できる優れたバックアップがあります。
dfd

ありがとう。私はそれがライフサイクルの中で何かを疑っています。アプリケーションのデバッグに時間を費やします。これを
見つけたら

4

わかりましたので、それを理解しました。Appleの新しいデフォルトのカードプレゼンテーションスタイルのiOS 13での変更により、ストーリーボードでは、スプラッシュスクリーンからカスタムフローナビゲーションコントローラーへのセグメンテーションがデフォルトで新しいプレゼンテーションになりました(下のスクリーンショットを参照)。

セゲ

私がそれを修正した方法は、デフォルトで古いライフサイクルになった古いスタイルに戻ることでした。下のスクリーンショットを参照してください。

絵コンテの種類

これが私のアプリケーションでこれを引き起こした唯一の場所だったので、なぜそうなのかわかりません(かなり大きなアプリなので、すべてのストーリーボードを確認するために少し時間を費やす必要があります)。


2
あなたの質問は、シーンの使用をオプトアウトする方法を尋ねます。この回答は、シーンをオプトアウトするソリューションを提供しません。これは受け入れられる答えではありません。新しいカード形式のプレゼンテーションを避けることだけが目的の場合は、その質問に対処するために、いくつかの重複でその答えを見つけることができます。
rmaddy

4

私はこれをdfdの答えを使用して動作させるようにしましたが、私のアプリはObjective-Cであるため、1つの変更を加える必要がありました。

Objective-Cでは、

@property (strong, nonatomic) UIWindow *window;

AppDelegate.h内(.m内ではない)


2

Xcode 11-Swift 5.3

Xcode 11以降、およびSwift 5.3およびの助けを借り@mainて、SceneDelegateイベントを持たないマルチプラットフォームアプリを作成できますAppDelegate。次のような単純なファイルのみが存在します。

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.