1、申明后台模式播放
1 #import <UIKit/UIKit.h> 2 #import <AVFoundation/AVFoundation.h> 3 #import <MediaPlayer/MediaPlayer.h> 4 5 @interface ViewController : UIViewController<MPMediaPickerControllerDelegate> 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)canBecomeFirstResponder 118 { 119 return YES; 120 } 121 122 - (void)playerItemDidReachEnd:(NSNotification *)notification 123 { 124 [self goToNextTrack:self]; 125 } 126 127 -(AVPlayerItem *)avItemFromMPItem:(MPMediaItem *)mpItem 128 { 129 NSURL *url = [mpItem valueForProperty:MPMediaItemPropertyAssetURL]; 130 131 AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url]; 132 133 [[NSNotificationCenter defaultCenter] 134 addObserver:self 135 selector:@selector(playerItemDidReachEnd:) 136 name:AVPlayerItemDidPlayToEndTimeNotification 137 object:item]; 138 139 return item; 140 } 141 142 -(void)startPlayback 143 { 144 [self.player play]; 145 [self.playButton setTitle:@"Pause" forState:UIControlStateNormal]; 146 [self updateNowPlaying]; 147 } 148 149 -(void)startPlaybackWithItem:(MPMediaItem *)mpItem 150 { 151 [self.player replaceCurrentItemWithPlayerItem:[self avItemFromMPItem:mpItem]]; 152 [self.player seekToTime:kCMTimeZero]; 153 [self startPlayback]; 154 } 155 156 -(void)pausePlayback 157 { 158 [self.player pause]; 159 [self.playButton setTitle:@"Play" forState:UIControlStateNormal]; 160 } 161 162 - (IBAction)togglePlay:(id)sender 163 { 164 if (self.playlist.count > 0) 165 { 166 if (self.player.currentItem == nil) 167 { 168 [self startPlaybackWithItem:[self.playlist objectAtIndex:0]]; 169 } 170 else 171 { 172 // Player has an item, pause or resume playing it 173 BOOL isPlaying = self.player.currentItem && self.player.rate != 0; 174 if (isPlaying) 175 { 176 [self pausePlayback]; 177 } 178 else 179 { 180 [self startPlayback]; 181 } 182 } 183 } 184 } 185 186 - (IBAction)queueFromLibrary:(id)sender 187 { 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)sender 196 { 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 *)mediaPicker 204 { 205 [self dismissViewControllerAnimated:YES completion:NULL]; 206 } 207 208 -(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection 209 { 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)sender 221 { 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 else 230 { 231 if (self.currentIndex == 0) 232 { 233 self.currentIndex = self.playlist.count - 1; 234 } 235 else 236 { 237 self.currentIndex -= 1; 238 } 239 MPMediaItem *previousItem = [self.playlist objectAtIndex:self.currentIndex]; 240 [self startPlaybackWithItem:previousItem]; 241 } 242 } 243 244 - (IBAction)goToNextTrack:(id)sender 245 { 246 if (self.playlist.count == 0) 247 return; 248 249 if (self.currentIndex == self.playlist.count - 1) 250 { 251 self.currentIndex = 0; 252 } 253 else 254 { 255 self.currentIndex += 1; 256 } 257 MPMediaItem *nextItem = [self.playlist objectAtIndex:self.currentIndex]; 258 [self startPlaybackWithItem: nextItem]; 259 } 260 261 262 @end