Почему мое приложение iOS может застрять на заставке для обозревателей Apple, а не для меня? - PullRequest
2 голосов
/ 15 мая 2019

Я создаю новое приложение для 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 - нет?

1 Ответ

3 голосов
/ 15 мая 2019

Возможно, это связано с тем, что обновление вашего пользовательского интерфейса не выполняется в главном потоке.

Попробуйте:

DispatchQueue.main.async {
    //Update rootViewController now
}

Я однажды совершил аналогичную ошибку.Это случайная проблема, так как обновление пользовательского интерфейса не гарантируется, так как это явно не в основном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...