#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. Я смог проверить теорию, и это было не так. Спасибо, однако. Однако я решил это. Это была проблема с потоками.