2016-06-04 13 views
2

Я работаю над приложением 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 и посмотрел на то, что темы делали слева. Вот скриншот:

enter image description here

ответ

1

Это может быть симптомом отладки и запуск через XCode. Вы правы, обычно вы всегда можете нажать кнопку «Домой» и выйти из приложения.

Редактируйте вашу схему и измените ее с отладки на выпуск. Запустите сборку один раз через Xcode. Убейте приложение, затем запустите его без Xcode с главного экрана устройства.

+0

Я заметил, что мое приложение заморозило ОС, даже если оно не в режиме отладки и не связано с моим mac. это особенно происходит, когда мой интернет медленный (когда я нахожусь на поезде, и моя сеть дерьмовая) –

+0

Если бы вы могли обновить свой вопрос и включить больше кода, связанного с действием, которое вызывает проблему, мы можем помочь. Похоже, что что-то в главной теме блокирует все. – KevinS

+0

спасибо за вашу помощь, я просто добавил свой код и выход NSLog. –