1、申明后台模式播放
1 #import2 #import 3 #import 4 5 @interface ViewController : UIViewController 6 7 @property (weak, nonatomic) IBOutlet UIButton *playButton; 8 @property (weak, nonatomic) IBOutlet UILabel *infoLabel; 9 @property (weak, nonatomic) IBOutlet UIImageView *artworkImageView;10 @property (nonatomic, strong) AVAudioSession *session;11 @property (nonatomic, strong) AVPlayer *player;12 @property (nonatomic, strong) NSMutableArray *playlist;13 @property (nonatomic)NSInteger currentIndex;14 15 - (IBAction)goToPrevTrack:(id)sender;16 - (IBAction)goToNextTrack:(id)sender;17 - (IBAction)togglePlay:(id)sender;18 - (IBAction)queueFromLibrary:(id)sender;19 - (IBAction)clearPlaylist:(id)sender;20 21 @end
1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 @synthesize playButton; 9 @synthesize infoLabel; 10 @synthesize artworkImageView; 11 12 - (void)viewDidLoad 13 { 14 [super viewDidLoad]; 15 16 self.session = [AVAudioSession sharedInstance]; 17 NSError *error; 18 //申明后台模式播放 19 [self.session setCategory:AVAudioSessionCategoryPlayback error:&error]; 20 if (error) 21 { 22 NSLog(@"Error setting audio session category: %@", error); 23 } 24 [self.session setActive:YES error:&error]; 25 if (error) 26 { 27 NSLog(@"Error activating audio session: %@", error); 28 } 29 30 self.playlist = [[NSMutableArray alloc] init]; 31 self.player = [[AVPlayer alloc] init]; 32 } 33 34 - (void)didReceiveMemoryWarning 35 { 36 [super didReceiveMemoryWarning]; 37 // Dispose of any resources that can be recreated. 38 } 39 40 -(void)updateNowPlaying 41 { 42 if (self.player.currentItem != nil) 43 { 44 MPMediaItem *currentMPItem = [self.playlist objectAtIndex:self.currentIndex]; 45 46 self.infoLabel.text = [NSString stringWithFormat:@"%@ - %@", [currentMPItem valueForProperty:MPMediaItemPropertyTitle], [currentMPItem valueForProperty:MPMediaItemPropertyArtist]]; 47 48 UIImage *artwork = [[currentMPItem valueForProperty:MPMediaItemPropertyArtwork] imageWithSize:self.artworkImageView.frame.size]; 49 self.artworkImageView.image = artwork; 50 51 if ([MPNowPlayingInfoCenter class]) 52 { 53 NSString *title = [currentMPItem valueForProperty:MPMediaItemPropertyTitle]; 54 NSString *artist = [currentMPItem valueForProperty:MPMediaItemPropertyArtist]; 55 NSString *album = [currentMPItem valueForProperty:MPMediaItemPropertyAlbumTitle]; 56 57 NSDictionary *mediaInfo = [NSDictionary dictionaryWithObjectsAndKeys: 58 artist, MPMediaItemPropertyArtist, 59 title, MPMediaItemPropertyTitle, 60 album, MPMediaItemPropertyAlbumTitle, 61 [currentMPItem valueForProperty:MPMediaItemPropertyArtwork], MPMediaItemPropertyArtwork, 62 nil]; 63 [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = mediaInfo; 64 } 65 } 66 else 67 { 68 self.infoLabel.text = @"..."; 69 [self.playButton setTitle:@"Play" forState:UIControlStateNormal]; 70 self.artworkImageView.image = nil; 71 } 72 } 73 74 75 - (void)viewDidAppear:(BOOL)animated 76 { 77 [super viewDidAppear:animated]; 78 //注册远程控制事件 79 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 80 [self becomeFirstResponder]; 81 } 82 83 - (void)viewWillDisappear:(BOOL)animated 84 { 85 [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 86 [self resignFirstResponder]; 87 [super viewWillDisappear:animated]; 88 } 89 //接收和响应远程控制事件 90 - (void)remoteControlReceivedWithEvent: (UIEvent *) receivedEvent 91 { 92 if (receivedEvent.type == UIEventTypeRemoteControl) 93 { 94 switch (receivedEvent.subtype) 95 { 96 //调用各自的动作方法实现事件的定向 97 case UIEventSubtypeRemoteControlTogglePlayPause: 98 [self togglePlay:self]; 99 break;100 101 case UIEventSubtypeRemoteControlPreviousTrack:102 [self goToPrevTrack:self];103 break;104 105 case UIEventSubtypeRemoteControlNextTrack:106 [self goToNextTrack:self];107 break;108 109 default:110 break;111 }112 }113 }114 115 116 //使用户能够远程控制媒体播放器,通过耳机或者活动栏。117 -(BOOL)canBecomeFirstResponder118 {119 return YES;120 }121 122 - (void)playerItemDidReachEnd:(NSNotification *)notification123 {124 [self goToNextTrack:self];125 }126 127 -(AVPlayerItem *)avItemFromMPItem:(MPMediaItem *)mpItem128 {129 NSURL *url = [mpItem valueForProperty:MPMediaItemPropertyAssetURL];130 131 AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];132 133 [[NSNotificationCenter defaultCenter]134 addObserver:self135 selector:@selector(playerItemDidReachEnd:)136 name:AVPlayerItemDidPlayToEndTimeNotification137 object:item];138 139 return item;140 }141 142 -(void)startPlayback143 {144 [self.player play];145 [self.playButton setTitle:@"Pause" forState:UIControlStateNormal];146 [self updateNowPlaying];147 }148 149 -(void)startPlaybackWithItem:(MPMediaItem *)mpItem150 {151 [self.player replaceCurrentItemWithPlayerItem:[self avItemFromMPItem:mpItem]];152 [self.player seekToTime:kCMTimeZero];153 [self startPlayback];154 }155 156 -(void)pausePlayback157 {158 [self.player pause];159 [self.playButton setTitle:@"Play" forState:UIControlStateNormal];160 }161 162 - (IBAction)togglePlay:(id)sender163 {164 if (self.playlist.count > 0)165 {166 if (self.player.currentItem == nil)167 {168 [self startPlaybackWithItem:[self.playlist objectAtIndex:0]];169 }170 else171 {172 // Player has an item, pause or resume playing it173 BOOL isPlaying = self.player.currentItem && self.player.rate != 0;174 if (isPlaying)175 {176 [self pausePlayback];177 }178 else179 {180 [self startPlayback];181 }182 }183 }184 }185 186 - (IBAction)queueFromLibrary:(id)sender187 {188 MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];189 picker.delegate = self;190 picker.allowsPickingMultipleItems = YES;191 picker.prompt = @"Choose Some Music!";192 [self presentViewController:picker animated:YES completion:NULL];193 }194 195 - (IBAction)clearPlaylist:(id)sender196 {197 [self.player replaceCurrentItemWithPlayerItem:nil];198 [self.playlist removeAllObjects];199 [self updateNowPlaying];200 [self.playButton setTitle:@"Play" forState:UIControlStateNormal];201 }202 203 -(void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker204 {205 [self dismissViewControllerAnimated:YES completion:NULL];206 }207 208 -(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection209 {210 BOOL shallStartPlayer = self.playlist.count == 0;211 212 [self.playlist addObjectsFromArray:mediaItemCollection.items];213 214 if (shallStartPlayer)215 [self startPlaybackWithItem:[self.playlist objectAtIndex:0]];216 217 [self dismissViewControllerAnimated:YES completion:NULL];218 }219 220 - (IBAction)goToPrevTrack:(id)sender221 {222 if (self.playlist.count == 0)223 return;224 225 if (CMTimeCompare(self.player.currentTime, CMTimeMake(5.0, 1)) > 0)226 {227 [self.player seekToTime:kCMTimeZero];228 }229 else230 {231 if (self.currentIndex == 0)232 {233 self.currentIndex = self.playlist.count - 1;234 }235 else236 {237 self.currentIndex -= 1;238 }239 MPMediaItem *previousItem = [self.playlist objectAtIndex:self.currentIndex];240 [self startPlaybackWithItem:previousItem];241 }242 }243 244 - (IBAction)goToNextTrack:(id)sender245 {246 if (self.playlist.count == 0)247 return;248 249 if (self.currentIndex == self.playlist.count - 1)250 {251 self.currentIndex = 0;252 }253 else254 {255 self.currentIndex += 1;256 }257 MPMediaItem *nextItem = [self.playlist objectAtIndex:self.currentIndex];258 [self startPlaybackWithItem: nextItem];259 }260 261 262 @end