Я работаю над приложением iOS, где я использую AVPlayer для воспроизведения разных видео mp4. В большинстве случаев он отлично работает. кроме случаев, когда приложение полностью замораживает телефон. Я не смог поймать его в том месте, где это происходит, но я думаю, что это обычно происходит сразу после этой строки. Я проверил это, поставив кучу NSLog где напечатать [[NSDate date] timeIntervalSince1970]
:, если мое приложение iOS заморозит весь телефон, считается ли это ошибкой в самой ОС?
mylayer =[AVPlayerLayer playerLayerWithPlayer:myplayer];
Замораживание происходит в течение нескольких секунд (иногда намного больше).
Даже если я нажимаю кнопку дома или кнопку блокировки, телефон не отвечает. Я должен в конце нажать кнопку блокировки в течение примерно 6-10 секунд, которая перезагружает весь телефон.
Обратите внимание, что во время этого использования процессор и память не всплескиваются.
Я понимаю, что мой код может быть неисправен, и все, но не должны быть достаточно умны, чтобы не позволить одному приложению полностью заморозить весь телефон? Будет ли это считаться ошибкой ОС? Если это так, я могу зарегистрировать DTS с Apple.
**** EDIT: добавлен код ****
Обратите внимание на комментарий, который говорит "// это линия, которая замораживает"
dispatch_queue_t LOADQUEUE = dispatch_queue_create("com.yolo.LOADQUEUE", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(LOADQUEUE, ^{
AVURLAsset *avAsset = [[AVURLAsset alloc] initWithURL:url options:nil];
NSLog(@"current time 4: %f",[[NSDate date] timeIntervalSince1970]);
if ([avAsset tracksWithMediaType:AVMediaTypeVideo] && [avAsset tracksWithMediaType:AVMediaTypeVideo].count>0) {
NSLog(@"current time 4.5: %f",[[NSDate date] timeIntervalSince1970]);
CGSize size = [[[avAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize];
NSLog(@"current time 5: %f",[[NSDate date] timeIntervalSince1970]);
CGRect r = self.topHeader.frame;
r.size.height=((size.height*self.view.frame.size.width)/size.width)+self.topheaderBottomView.frame.size.height+self.topheadertopview.frame.size.height+self.itemTitle.frame.size.height;
howMuchToScrollToShowCommentButton=r.size.height;
dispatch_async(dispatch_get_main_queue(), ^{
self.topHeader.frame=r;
[UIView animateWithDuration:0 animations:^{
[self.mytableview setTableHeaderView:self.topHeader];
}completion:^(BOOL finished) {
NSArray *keys = @[@"playable"];
NSLog(@"current time 6: %f",[[NSDate date] timeIntervalSince1970]);
[avAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"current time 7: %f",[[NSDate date] timeIntervalSince1970]);
AVPlayerItem *newItem = [[AVPlayerItem alloc] initWithAsset:avAsset];
if (!myplayer) {
myplayer = [[AVPlayer alloc]initWithPlayerItem:newItem];
} else {
[myplayer replaceCurrentItemWithPlayerItem:newItem];
}
NSLog(@"current time 7.5: %f",[[NSDate date] timeIntervalSince1970]);
[myplayer addObserver:self forKeyPath:@"status" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil];
[myplayer addObserver:self forKeyPath:@"rate" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[myplayer currentItem]];
myplayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
NSLog(@"current time 7.6: %f",[[NSDate date] timeIntervalSince1970]);
mylayer =[AVPlayerLayer playerLayerWithPlayer:myplayer]; // this is the line which freezes
NSLog(@"current time 7.7: %f",[[NSDate date] timeIntervalSince1970]);
[playerView.layer addSublayer:mylayer];
mylayer.videoGravity = AVLayerVideoGravityResize;
[mylayer setFrame:playerView.bounds];
[myplayer seekToTime:kCMTimeZero];
NSLog(@"current time 8: %f",[[NSDate date] timeIntervalSince1970]);
});
}];
}];
});
} else {
NSLog(@"ITEM doesn't exist");
}
});
Выход: Обратите внимание на 21-й перерыв между моментом 7,6 и 7,7:
2016-06-04 01:27:20.853 XYZ[402:49072] current time 7: 1465018040.853897
2016-06-04 01:27:20.875 XYZ[402:49072] current time 7.5: 1465018040.875220
2016-06-04 01:27:20.875 XYZ[402:49072] current time 7.6: 1465018040.875871
2016-06-04 01:27:41.841 XYZ[402:49072] current time 7.7: 1465018061.841419
2016-06-04 01:27:41.841 XYZ[402:49072] current time 8: 1465018061.841863
Редактировать 2:
Я приостановил приложение в xcode и посмотрел на то, что темы делали слева. Вот скриншот:
Я заметил, что мое приложение заморозило ОС, даже если оно не в режиме отладки и не связано с моим mac. это особенно происходит, когда мой интернет медленный (когда я нахожусь на поезде, и моя сеть дерьмовая) –
Если бы вы могли обновить свой вопрос и включить больше кода, связанного с действием, которое вызывает проблему, мы можем помочь. Похоже, что что-то в главной теме блокирует все. – KevinS
спасибо за вашу помощь, я просто добавил свой код и выход NSLog. –