web-dev-qa-db-ja.com

iOS10でrequestAccessForMediaTypeがクラッシュする

私のアプリでは、card.ioを使用してクレジットカードをスキャンしています。 iOS 9では正常に動作します。iOS10では、アプリがクラッシュし、多くのガベージメッセージがスローされるため、xcode8ベータ2コンソールでクラッシュログを見つけることができません。

次に、プライバシー->設定をチェックして、アプリでカメラが無効になっているかどうかを確認しましたが、アプリがそのセクションに表示されていません。iOS10は、アプリがカメラを使用するための許可を取得していないようです。

次のコードを使用して許可をリクエストします。

-(BOOL)checkCameraPermissions{

    AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    if(authStatus == AVAuthorizationStatusAuthorized)
    {
        // start card-io
        return YES;
    }
    else if(authStatus == AVAuthorizationStatusNotDetermined)
    {

        [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted)
         {
             if(granted)
             {
                 //Start card-io
                 [self testIsNewCard];
             }

         }];
    }
    else if (authStatus == AVAuthorizationStatusRestricted)
    {
        //Alert
        // Alert camera denied

        UIAlertController *aCon=[UIAlertController alertControllerWithTitle:@"Camera denied" message:@"Camera cannot be used" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *ok =[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            [aCon dismissViewControllerAnimated:YES completion:nil];
        }];
        [aCon addAction:ok];
        [self presentViewController:aCon animated:YES completion:nil];

        return NO;

    }

    return NO;

}

このコードを実行すると、authStatusはAVAuthorizationStatusNotDeterminedとして返されます。

そして、アプリはブロックに入った直後にクラッシュしましたrequestAccessForMediaType:AVMediaTypeVideo

コンソールに表示されるガベージログが非常に多く、クラッシュメッセージを見つける手がかりがありません。

編集:xcode 8の不要なログをすべて無効にするオプションを見つけました。投稿された回答 ここに それでもxcodeはしませんでしたバックトレースデバッグを無効にした後でも、クラッシュログは表示されませんでした。

私のxcode8はこのメッセージを表示し、アプリは終了します。

  App[1124:226447] [access] <private>

場所とプライバシーもリセットしようとしましたが、メディアアクセスをリクエストしようとするとアプリがクラッシュします。

なぜこれが起こっているのか考えはありますか?

20
Teja Nandamuri

Info.plistファイルに"Privacy - Camera Usage Description"keyを追加しましたが、動作するようになりました。

27
pulse4life

iOS 10で、すべてのユーザープライベートデータ型へのアクセスを宣言する必要があります。これを行うには、アプリのInfo.plistに使用法キーを追加します。詳細については、以下の同じスクリーンショットをご覧ください。

Privacy-Camera Usage DescriptionキーをアプリのInfo.plistとその使用情報に追加する必要があります。

詳細については、以下のGIFをご覧ください。

GIF

または、info.plistを介して追加する場合は、NSCameraUsageDescriptionキーを追加する必要があります。

Info.plistの文字列の下にコピーして貼り付けるだけです。

<key>NSCameraUsageDescription</key>
<string>Take the photo</string>

詳細については、以下のGIFをご覧ください。

GIF

詳細については、 リンク を確認してください。

11

iOS 10はプライバシーポリシーを継続し、新しいプライバシールールを実装しました。そして、次のプロジェクトでそれらを実装することを忘れないでください。

問題については、info.plistに次の行を追加する必要があります

<!-- ???? Camera -->
<key>NSCameraUsageDescription</key>
<string><Your description goes here></string>

以下は、残りのプライバシールールです。

<!-- ???? Photo Library -->
<key>NSPhotoLibraryUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Camera -->
<key>NSCameraUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Microphone -->
<key>NSMicrophoneUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Location -->
<key>NSLocationUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Location When In Use -->
<key>NSLocationWhenInUseUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Location Always -->
<key>NSLocationAlwaysUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Calendars -->
<key>NSCalendarsUsageDescription</key>
<string><Your description goes here></string>

<!-- ⏰ Reminders -->
<key>NSRemindersUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Motion -->
<key>NSMotionUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Health Update -->
<key>NSHealthUpdateUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Health Share -->
<key>NSHealthShareUsageDescription</key>
<string><Your description goes here></string>

<!-- ᛒ???? Bluetooth Peripheral -->
<key>NSBluetoothPeripheralUsageDescription</key>
<string><Your description goes here></string>

<!-- ???? Media Library -->
<key>NSAppleMusicUsageDescription</key>
<string><Your description goes here></string>

お役に立てれば。 :)

7
Aadil Keshwani