AVWeakReferencingDelegateStorage: очередь делегирования сериализации

#ios #ios10

#iOS #ios10

Вопрос:

В настоящее время я столкнулся с проблемой, новой для моего приложения iOS после обновления iOS 10. Проблема возникла только на устройствах с iOS 10 и выше. Полный журнал сбоев выглядит следующим образом:

 Crashed: <AVWeakReferencingDelegateStorage: 0x170229fc0> delegate serialization queue
0  libdispatch.dylib              0x18f8121e8 _os_object_retain   72
1  libdispatch.dylib              0x18f8111c0 _dispatch_client_callout   16
2  libdispatch.dylib              0x18f822584 _dispatch_non_barrier_sync_f_invoke   84
3  AVFoundation                   0x1980e33ec -[AVWeakReferencingDelegateStorage getRetainedDelegate:retainedDelegateQueue:]   168
4  AVFoundation                   0x1980e3240 -[AVWeakReferencingDelegateStorage delegate]   36
5  AVFoundation                   0x1980ce244 -[AVCaptureVideoDataOutput _handleRemoteQueueOperation:]   76
6  AVFoundation                   0x1980ce168 __47-[AVCaptureVideoDataOutput _updateRemoteQueue:]_block_invoke   100
7  CoreMedia                      0x1932a0da8 __FigRemoteOperationReceiverCreateMessageReceiver_block_invoke   260
8  CoreMedia                      0x1932c0020 __FigRemoteQueueReceiverSetHandler_block_invoke.2   216
9  libdispatch.dylib              0x18f8111c0 _dispatch_client_callout   16
10 libdispatch.dylib              0x18f81e008 _dispatch_continuation_pop   576
11 libdispatch.dylib              0x18f82a648 _dispatch_source_latch_and_call   204
12 libdispatch.dylib              0x18f813164 _dispatch_source_invoke   820
13 libdispatch.dylib              0x18f81f278 _dispatch_queue_serial_drain   468
14 libdispatch.dylib              0x18f8149a8 _dispatch_queue_invoke   652
15 libdispatch.dylib              0x18f81f278 _dispatch_queue_serial_drain   468
16 libdispatch.dylib              0x18f8149a8 _dispatch_queue_invoke   652
17 libdispatch.dylib              0x18f8202ac _dispatch_root_queue_drain_deferred_item   248
18 libdispatch.dylib              0x18f826b0c _dispatch_kevent_worker_thread   816
19 libsystem_pthread.dylib        0x18fa19174 _pthread_wqthread   948
20 libsystem_pthread.dylib        0x18fa18db4 start_wqthread   4
  

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

Код приведен ниже:

 - (void)forwardToResultsVC:(NSDictionary *)results
{
    self.successfulTestResults = results;

    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
    [self.petTest updateTestWithTestElementParameters:results];
    [localContext MR_saveOnlySelfAndWait];
    [self performSegueWithIdentifier:kTestAnalyzeSeguge sender:nil];

    // Log successful test and time it took to take (Parse)
    NSDate *testCompleteDate = [NSDate date];
    NSTimeInterval timeToTakeTest = [testCompleteDate timeIntervalSinceDate:self.testStartDate];
    NSDictionary *params = @{ kPetnosticsAnalyticsTimeToTakeSuccesfulTest : [NSString stringWithFormat:@"%f", timeToTakeTest]};
    [PFAnalytics trackEvent:kPetnosticsAnalyticsTestSuccesfullyCompleted dimensions:params];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:kTestResultsSeguge]) {
        SPResultsViewController *resultsVC = segue.destinationViewController;
        resultsVC.test = self.petTest;
        resultsVC.ogHarrisFoundPointsImage = self.ogHarrisFoundPointsImage;
        resultsVC.foundTestPointsImage = self.foundTestPointsImage;
        resultsVC.analysisImage = self.analysisImage;
        resultsVC.croppedStripImage = self.croppedStripImage;
        resultsVC.test = self.petTest;
    } else if ([segue.identifier isEqualToString:kTestAnalyzeSeguge]) {
        SPAnalyzingViewController *analyzingVC = segue.destinationViewController;
        analyzingVC.pet = self.pet;
        analyzingVC.test = self.petTest;
        analyzingVC.ogHarrisFoundPointsImage = self.ogHarrisFoundPointsImage;
        analyzingVC.foundTestPointsImage = self.foundTestPointsImage;
        analyzingVC.analysisImage = self.analysisImage;
        analyzingVC.croppedStripImage = self.croppedStripImage;
        analyzingVC.backingCard = self.backingCard;
        if (self.testMethod == nil) {
            self.testMethod = @"Cup";
        }
        analyzingVC.testMethod = self.testMethod;
    } 
}
  

Затем в segue запрашивается следующее:

 - (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self saveTestUploadImage];
}

- (void)saveTestUploadImage
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        UIImage *debugImage = self.foundTestPointsImage;
        NSData *testImageData = nil;
        if (debugImage) {
            [debugImage saveImageTofileName:@"testImage.jpg"];
            testImageData = UIImageJPEGRepresentation(debugImage, 1);
        }
        if ([testImageData length] > 0) {
            PFFile *imageFile = [PFFile fileWithName:@"testImage.jpg" data:testImageData];
            [self uploadTestDataWithImage:imageFile];
        } else {
            // No Test Image Data... hmm...
            [PFAnalytics trackEvent:@"SPTestNoImageFound"];
            [self uploadTestDataWithImage:nil];
        }
    });
}
  

Однако он завершается сбоем до вызова saveTestUploadImage .
Есть идеи? Заранее благодарю.

Ответ №1:

Видя AVCaptureVideoDataOutput в вашей трассировке, добавили ли вы соответствующую авторизацию в свой файл plist ? NSCameraUsageDescription , NSPhotoLibraryUsageDescription , и особенно NSMicrophoneUsageDescription это, похоже, приводит к сбою приложения без правильной информации о сбое.

Комментарии:

1. Это очень хорошая догадка. Нам пришлось отследить подобную проблему, и мы были удивлены, обнаружив, что это было потому, что мы не указали одну из строк ** Privacy: ** в списке.

2. Спасибо за ваш вклад. К сожалению, поскольку это происходит не на всех устройствах iOS10 и не происходит каждый раз (оно приходит и уходит), я не могу проверить эту теорию. Приложение было выпущено до обновления iOS 10 в app Store. До iOS 10 конфиденциальность обеспечивалась автоматически, считаете ли вы, что новая iOS путает себя со старыми приложениями?

3. В моем случае приложение всегда зависало при новой установке на устройстве ios10. И я почти уверен, что это не сработало на устройстве, на котором приложение уже было установлено и запущено до обновления до iOS10.

4. Я смог проверить теорию, и это было не так. Спасибо, однако. Однако я решил это. Это была проблема с потоками.