Xcode 11 - Chọn không tham gia UISceneDelegate / SwiftUI trên iOS 13


106

Tôi hiện đang sử dụng Xcode 11 Beta 5. Trong ứng dụng của tôi, nó chạy tốt trên iOS 12 trở xuống. Tuy nhiên, trên iOS 13, có vẻ như nó đang sử dụng UIScene theo mặc định. Điều này khiến ứng dụng của tôi không hoạt động được.

Khi ứng dụng khởi chạy khi cài đặt mới, có các điều khoản và điều kiện mà người dùng phải chấp nhận. Sau khi đồng ý, họ đi đến màn hình tải, sau đó hướng họ đến chế độ xem chính. Trong ảnh chụp màn hình tôi đã đăng, chế độ xem đằng sau hình hiện tại ở phía trước là màn hình tải giật gân.

Chúng tôi sẽ sớm xem xét thêm hỗ trợ cảnh nhiều chế độ xem trong toàn ứng dụng, nhưng ngay bây giờ chúng tôi có những thứ cần ưu tiên cao hơn.

https://imgur.com/i0qLhAL

"Hỗ trợ nhiều cửa sổ" đã bị tắt trong Cài đặt chung của mục tiêu của ứng dụng. Ngoài ra, tôi đã đặt Bật nhiều Windows thành KHÔNG trong tệp info.plist.

Cho đến nay vẫn chưa có gì thực sự hiệu quả. Về cơ bản, tôi muốn tắt / tắt nhiều cửa sổ và UIScene / SwiftUI để khôi phục hành vi ban đầu trong iOS 10-12. Điều này có thể xảy ra trong iOS 13 hay chúng ta phải cập nhật nó?

Cập nhật:

Đây là ảnh chụp màn hình của hệ thống phân cấp gỡ lỗi chế độ xem. Bên trái là iOS 12, bên phải là iOS 13. Không thêm bất kỳ thứ gì vào Info.plist cũng như bất kỳ lớp hoặc phương thức ủy nhiệm cảnh nào, tại sao nó lại khác nhau? Khá nhiều chỉ chạy nó trong mã sẵn sàng sản xuất hiện có của nó trên Xcode 11.

https://imgur.com/C3aLsDo


Bạn có cần chỉ hỗ trợ iOS 13 trở lên hay bạn cần hỗ trợ iOS 13 và iOS 12?
rmaddy

Hỗ trợ @rmaddy giữa iOS 11-13 + (các phiên bản trong tương lai).
DavidA

Giao diện người dùng chính của bạn thông qua mã hay bảng phân cảnh?
rmaddy

@rmaddy nó được hoàn thành trong bảng phân cảnh có một sự cố gắng đối với nó được tham chiếu xib ViewControllers.
DavidA

Nếu không có chi tiết cụ thể về những gì ứng dụng của bạn đang làm và khi nào, thật khó để nói. Lưu ý rằng các phương thức bộ điều khiển chế độ xem chẳng hạn như viewWill|DidAppearkhông được gọi giống nhau trong iOS 13 khi loại bỏ bộ điều khiển chế độ xem đã trình bày, chẳng hạn. Thêm nhiều thông báo gỡ lỗi vòng đời và các điểm ngắt và so sánh luồng giữa iOS 12 và 13 và xem nó khác nhau ở điểm nào.
rmaddy

Câu trả lời:


295

Mặc dù bạn nên sử dụng các cảnh khi ứng dụng của bạn chạy dưới iOS 13 trở lên, nhưng bạn hoàn toàn có thể chọn không tham gia khi vẫn hỗ trợ iOS 12 trở lên.

  • Xóa hoàn toàn mục nhập “Tệp kê khai cảnh ứng dụng” khỏi Info.plist.

  • Nếu có một lớp đại biểu cảnh, hãy xóa nó.

  • Nếu có bất kỳ phương thức nào liên quan đến cảnh trong đại biểu ứng dụng của bạn, hãy xóa các phương thức đó.

  • Nếu thiếu, hãy thêm thuộc tính var window: UIWindow?vào đại biểu ứng dụng của bạn.

Ứng dụng của bạn hiện chỉ nên sử dụng ứng dụng ủy quyền và dưới iOS 13, ứng dụng phải có cùng vòng đời với iOS 12.

Lưu ý: Không cái nào trong số này dành riêng cho Swift hoặc SwiftUI.


Chúng tôi đã đăng câu trả lời cùng một lúc. :-) Một câu hỏi - dòng còn thiếu AppDelegatemà tôi đã giải quyết. Điều đó có tự động quay lại trong quá trình này như bạn đã mô tả không? (Tôi thích câu trả lời của bạn hơn, vì nó hoàn toàn không quan tâm đến các cảnh quay.)
dfd

1
Điều tương tự cũng đang xảy ra với tôi và tôi không có mục nhập tệp kê khai nào trong Info.plist của mình cũng như không có bất kỳ phương thức AppDelegate nào và cũng không có lớp SceneDelegate. Tôi đang đặt bộ điều khiển của mình như "điều khoản và điều kiện" cho David làm rootViewController và nó xuất hiện giống như được hiển thị ở đây trong câu hỏi ở trên. Vui lòng giúp đỡ vì tôi đang gặp sự cố với giao diện người dùng này và không thể tiến lên .. ugh!
Mohsin Khubaib Ahmed

1
@MohsinKhubaibAhmed Bạn đang hỏi về một vấn đề hoàn toàn khác. Xem stackoverflow.com/questions/56435510/…
rmaddy

1
Xin chào! Tôi đã làm theo hướng dẫn 3 bước nhưng có màn hình đen sau khi màn hình khởi chạy xuất hiện. Bảng phân cảnh chính được chọn và cũng là bộ điều khiển chế độ xem ban đầu. Bạn có đề nghị nào không?
user3191334

1
@ user3191334 Tôi cũng bị màn hình đen. Trong trường hợp của tôi, đó là chế độ tối cho tôi nền đen mặc định. Thêm một số nội dung vào bảng phân cảnh cơ sở của bạn và tất cả sẽ xuất hiện.
Gordon Dove

40

Sử dụng câu trả lời để hy vọng định dạng mọi thứ tốt hơn một bình luận. (Hãy bình luận và tôi sẽ chỉnh sửa.)

Đây là điều mà tôi cũng phải đối mặt và có một vài tình huống đang diễn ra ở đây:

  • Nếu bạn muốn làm việc trên một ứng dụng hiện cóUIKit trong Xcode 11, chỉ cần mở nó lên và nó sẽ hoạt động tốt. Tất cả các ứng dụng của tôi đều có, không có SceneDelegate tệp cũng như bất kỳ thay đổi nào đối với AppDelegatehoặc bảng phân cảnh.
  • Nếu bạn muốn tạo một ứng dụng mới UIKITnhắm mục tiêu iOS 13 , chỉ cần tạo ứng dụng đó trong khi đảm bảo bạn bỏ chọn hộp kiểm "Sử dụng SwiftUI".

Nhưng tôi tự hỏi liệu bạn có đang đối mặt với kịch bản thứ ba - một kịch bản mà tôi đã làm cách đây khoảng một tuần. Tạo ứng dụng UIKit mới nhắm mục tiêu thứ gì đó sớm hơn iOS 13 . (Tôi thực sự đã nhắm mục tiêu iOS 9!)

Đúng, mẫu của bạn sẽ cung cấp cho bạn 15 lỗi (kể từ phiên bản beta 5), ​​cùng với SceneDelegate tệp / lớp. May mắn thay, Xcode sẽ giúp bạn tự động sửa tất cả trừ một lỗi.

Điều cuối cùng là thêm một dòng là một phần của SceneDelegatelớp học nhưng tiếc là Apple đã bỏ nó ra khỏi AppDelegatelớp học - điều này sau hơn một chục @available(iOS 13.0, *)mệnh đề có nghĩa là bạn đã chọn không tham gia SceneDelegatenếu chạy iOS 12 và hãy đoán xem? Nó không có ở đó ApDelegate!

Thêm cái này vào AppDelegate của bạn:

var window: UIWindow?

Tại thời điểm đó, bạn nên có một UIKitứng dụng đang chạy được nhắm mục tiêu cho iOS 12 trở xuống.


Cảm ơn vì điều đó. Kịch bản của tôi khá giống với điểm đầu tiên bạn đã nói, một ứng dụng UIKit hiện có trong Xcode 11. Nhưng khi tôi mở nó lên, nó không hoạt động tốt. Xem bản cập nhật tôi đã thêm của hệ thống phân cấp gỡ lỗi chế độ xem.
DavidA

Ngoài ra trong AppDelegate, nó đã có cửa sổ var: UIWindow?
DavidA

Bạn đã để tôi quan tâm! (Và tôi vẫn hơi lo lắng.) Tôi đã cập nhật rất ít cho các ứng dụng hiện có của mình - tuần trước đã rất thất vọng với SwiftUI và tôi tò mò về việc thử bố cục trong UIKit chỉ dành cho iOS 13. Nhưng các ứng dụng hiện có của tôi? Chúng hỗ trợ đa tác vụ trên iPad nhưng không thay đổi trong Xcode 11 Tôi không có SceneDelegatevà thử nghiệm xung quanh cho biết (a) chúng hoạt động trong iOS 13 và (b) chúng hoàn toàn không hỗ trợ nhiều cửa sổ, chỉ phân chia chế độ xem giữa hai ứng dụng. (Tôi cũng không hỗ trợ kéo và thả.) Có điều gì khác đang xảy ra ở phía bạn không?
dfd

Để lặp lại, tôi chỉ cần mở ứng dụng Xcode 10 của mình trong Xcode 11. Không SceneDelegate, không SwiftUI, không có khả năng tạo nhiều phiên bản ứng dụng iOS 9+ của tôi. Hiệu suất vẫn như mọi khi - tất cả đều là CoreImagebộ lọc tùy chỉnh cập nhật theo thời gian thực - và đối với tôi thì sao? Nếu có một số điểm mấu chốt liên quan đến hệ điều hành liên quan đến các cảnh trong hệ thống phân cấp chế độ xem, đó là tranh luận nếu nếu không hỗ trợ các cảnh. (Và để kết thúc, vâng, tôi vẫn hơi lo ngại. Nhưng nó cũng là phiên bản beta 5.) Hy vọng rằng bạn có một bản sao lưu tốt có thể tái tạo những gì tôi đang thấy.
dfd

Cảm ơn. Tôi nghi ngờ một cái gì đó của nó trong vòng đời. Tôi sẽ dành thời gian gỡ lỗi ứng dụng của mình. Tôi sẽ cập nhật thông tin này bất cứ khi nào tôi tìm ra nó để giúp đỡ bất kỳ ai trong tình huống tương tự
DavidA 13/08 '19

4

Được rồi, vì vậy tôi đã tìm ra nó. Do những thay đổi trong iOS 13 của phong cách trình bày thẻ mặc định mới của Apple, trong bảng phân cảnh của tôi, từ màn hình giật gân đến bộ điều khiển điều hướng luồng tùy chỉnh của tôi được đặt mặc định thành bản trình bày mới (xem ảnh chụp màn hình bên dưới).

Segue

Cách tôi đã sửa lỗi đó là quay lại kiểu cũ được mặc định cho vòng đời cũ. Xem ảnh chụp màn hình bên dưới.

Storyboard loại seque

Không chắc tại sao nó lại như vậy, vì đây là nơi duy nhất trong ứng dụng của tôi gây ra điều này (ứng dụng khá lớn nên tôi phải dành thời gian xem qua tất cả các bảng phân cảnh để chắc chắn).


2
Câu hỏi của bạn hỏi cách chọn không sử dụng cảnh. Câu trả lời này không cung cấp giải pháp để chọn không tham gia cảnh. Đây không phải là câu trả lời được chấp nhận. Nếu tất cả những gì bạn muốn làm là tránh cách trình bày kiểu thẻ mới, bạn có thể tìm thấy câu trả lời đó trong một số bản sao cho câu hỏi đó.
rmaddy

4

Tôi đã giải quyết vấn đề này bằng cách sử dụng câu trả lời của dfd, nhưng vì ứng dụng của tôi ở Objective-C, tôi phải thực hiện một thay đổi:

Trong Objective-C, bạn muốn đặt

@property (strong, nonatomic) UIWindow *window;

trong AppDelegate.h (không phải trong .m)


2

Xcode 11 - Swift 5.3

Kể từ Xcode 11 và với sự trợ giúp của Swift 5.3 và @main, bạn có thể có một ứng dụng đa nền không có SceneDelegatehoặc sự kiện AppDelegate. Sẽ chỉ có một tệp đơn giản như:

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.