Tworzę bardzo prostą aplikację wideo. Używam oficjalnej kontrolki: UIImagePickerController.
Tu jest problem. Podczas prezentowania UIImagePickerController po raz pierwszy system iOS zapyta o pozwolenie. Użytkownik może kliknąć tak lub nie. Jeśli użytkownik kliknie przycisk nie, formant nie zostanie odrzucony. Zamiast tego, jeśli użytkownik ciągle kliknie przycisk Start, liczniki czasu włączają się, gdy ekran jest zawsze czarny, a użytkownik nie może zatrzymać liczników ani wrócić. Jedyne, co użytkownik może zrobić, to zabić aplikację. Następnym razem, gdy UIImagePickerController jest prezentowany, nadal jest to czarny ekran i użytkownik nie może wrócić po kliknięciu przycisku Start.
Zastanawiałem się, czy to błąd. Czy jest jakiś sposób, abyśmy mogli wykryć pozwolenie kamery, abyśmy mogli zdecydować o wyświetleniu UIImagePickerController, czy nie?
źródło
UIImageViewController
jest odnotowany jako dodany w iOS 2.0, a dokumenty nigdy nie były opatrzone adnotacjami, aby odzwierciedlić, że należy użyć AVAuthorizationStatus, ale żyje w innej strukturze.Odpowiedzi:
Sprawdź
AVAuthorizationStatus
i odpowiednio postępuj ze skrzynkami.źródło
#import <AVFoundation/AVFoundation.h>
lub podobnegoBundle ID
za każdym razem, gdy chcę to przetestować, zmieniałem aplikację. Ból pośladków, ale przynajmniej coś. Pamiętaj tylko, abySwift 4 i nowsze
Upewnij się:
Poniższy kod sprawdza wszystkie możliwe stany uprawnień:
Od iOS 10 musisz określić
NSCameraUsageDescription
klucz w swoim Info.plist, aby móc poprosić o dostęp do kamery, w przeciwnym razie Twoja aplikacja ulegnie awarii w czasie wykonywania. Zobacz opisy interfejsów API wymagające użycia .Ciekawostką na marginesie: czy wiesz, że iOS zabija aplikację, jeśli jest uruchomiona, podczas gdy zmieniasz uprawnienia aparatu w Ustawieniach?
Z forum programistów Apple:
źródło
Szybkie rozwiązanie
A potem, aby go użyć, robisz
źródło
Jako dodatek do odpowiedzi od @Raptor należy wspomnieć o następujących kwestiach. Zaczynając od systemu iOS 10 może pojawić się następujący błąd:
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
Aby to naprawić, postępuj z wynikami z głównego wątku w następujący sposób (Swift 3):
źródło
Najpierw określ klucz NSCameraUsageDescription w Info.plist. Następnie sprawdź AVAuthorizationStatus, jeśli jest autoryzowany, a następnie przedstaw UIImagePickerController. To będzie działać.
źródło
Swift: Korzystanie z AVFoundation
@IBAction func cameraButtonClicked (sender: AnyObject) {
źródło