Я создаю новое приложение для iOS и после отправки в App Store для проверки оно было отклонено, а рецензент сказал:
Мы обнаружили одну или несколько ошибок в вашем приложении при просмотре на iPad под управлением iOS 12.3 по Wi-Fi.
В частности, приложение застряло на заставке. Никакой другой контент не загружен.
Однако лично я не смог воспроизвести эту проблему.
Я пробовал чистую установку на всех симуляторах с Xcode, а также на физическом iPhone XS Max на iOS 12.3 и на физическом iPad Pro 11in. под управлением iOS 12.3, и приложение всегда могло быстро и без проблем пройти мимо экрана заставки / запуска. Все мои установки выполняются через XCode, но я также попытался выполнить установку через TestFlight и снова не смог воспроизвести проблему.
Редактировать: Следует упомянуть, что я также пытался без сетевого подключения, и приложение успешно загружается.
код
Я использую раскадровку только для экрана запуска, который содержит только центрированное изображение логотипа приложения. Кроме этого, весь мой интерфейс сделан программно. В AppDelegate didFinishLaunchingWithOptions
я устанавливаю корневой viewcontroller, и первое, что он делает, проверяет аутентификацию Firebase Auth.auth().addStateDidChangeListener
. Если пользователя нет, я немедленно переключаюсь на контроллер входа в систему.
Поскольку любой, кто использует приложение в первый раз, не вошел в систему, я не могу понять, почему приложение зависло на заставке, если каким-либо образом прослушиватель аутентификации Firebase не делает никакого прогресса.
(отредактировано для включения) Актуальный код ниже.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Firebase
FirebaseApp.configure()
// Set custom root view controller
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = RootViewController()
window?.makeKeyAndVisible()
return true
}
class RootViewController: UIViewController {
private var current: UIViewController
init() {
self.current = SplashViewController()
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
addChild(current)
current.view.frame = view.bounds
view.addSubview(current.view)
current.didMove(toParent: self)
}
...
}
class SplashViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.white
let image = UIImageView(image: UIImage(named: "1024.png")!)
image.contentMode = .scaleAspectFit
image.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(image)
image.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
image.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
image.widthAnchor.constraint(equalToConstant: 128).isActive = true
image.heightAnchor.constraint(equalToConstant: 128).isActive = true
checkAuthenticationAndChangeScreens()
}
private func checkAuthenticationAndChangeScreens() {
Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
UserDefaults.standard.set(user.uid, forKey: "userEmail")
PushNotificationManager().registerForPushNotifications {
PartnerManager.shared.fetchPartnerEmail() {
AppDelegate.shared.rootViewController.switchToMainScreen()
}
}
} else {
AppDelegate.shared.rootViewController.switchToLogOut()
UIApplication.shared.unregisterForRemoteNotifications()
}
}
}
}
// Class PushNotificationManager
func registerForPushNotifications(completion: @escaping () -> Void) {
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
granted, error in
guard granted else { return }
DispatchQueue.main.async {
Messaging.messaging().delegate = self //Firebase Messaging
UIApplication.shared.registerForRemoteNotifications()
self.updateFirestorePushTokenIfNeeded() // Makes a single write to Firestore
completion()
}
}
}
// Class PartnerManager
func fetchPartnerEmail(completion: @escaping () -> Void) {
let userUID = UserDefaults.standard.string(forKey: "userEmail")
db.collection("users").document(userUID).getDocument() {
(document, error) in
if let partnerEmail = document!.get("partnerEmail") as? String {
UserDefaults.standard.set(partnerEmail, forKey: "partner")
}
completion()
}
}
Что-то странное
Последнее, что меня озадачило, это то, что, хотя моя заявка в App Store была отклонена из-за зависания приложения на заставке (вместе со скриншотом заставки), моя сборка для бета-тестирования была отклонено по другой причине - что я не предоставил данные для входа, как я должен был, но здесь они предоставили снимок экрана моего входа в экран. Но это будет означать, что приложение вышло за рамки заставки для обзора бета-тестирования.
Это наводит меня на мысль, что, возможно, проблема в какой-то среде тестирования в Apple.
Что-то другое в тестовой среде обзора Apple? Как мне лучше попытаться воспроизвести эту проблему с застрявшим заставкой? И почему обозреватель бета-тестирования может загружать приложение должным образом, а обозреватель App Store - нет?