Spotify 如何自定义 iOS 上的媒体播放控件?
How does Spotify customize the media playback controls on iOS?
iOS 上的 Spotify 有一个非常有趣的控制中心集成。注意下面的汉堡包按钮。
锁屏也是一样!
他们是怎么做到的? MPMediaCenter 里有没有 API 之类的东西?
是的,有一个 API
查看有关 remote control events you get two classes MPRemoteCommand
and MPRemoteCommandCenter
highlighted. Looking up MPRemoteCommandCenter 的 apple 文档中的说明会告诉您有许多命令,例如 likeCommand
或 dislikeCommand
您可以为其添加处理程序。向这些命令添加处理程序会使它们显示在控制中心中。
下面是一些一体化代码,可实现与屏幕截图中显示的结果几乎完全相同的结果:
- (void)showCustomizedControlCenter {
/* basic audio initialization */
NSString *soundFilePath = [NSString stringWithFormat:@"%@/test.mp3", [[NSBundle mainBundle] resourcePath]];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
self.player.numberOfLoops = -1;
[self.player play];
/* registering as global audio playback */
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
/* the cool control center registration */
MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];
[commandCenter.playCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent *event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
[commandCenter.dislikeCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent *event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
[commandCenter.likeCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent *event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
[commandCenter.nextTrackCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent *event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
/* setting the track title, album title and button texts to match the screenshot */
commandCenter.likeCommand.localizedTitle = @"Thumb Up";
commandCenter.dislikeCommand.localizedTitle = @"Thumb down";
MPNowPlayingInfoCenter* info = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary* newInfo = [NSMutableDictionary dictionary];
[newInfo setObject:@"Mixtape" forKey:MPMediaItemPropertyTitle];
[newInfo setObject:@"Jamie Cullum" forKey:MPMediaItemPropertyArtist];
info.nowPlayingInfo = newInfo;
}
除了写代码你还需要
- 将
AVFoundation
添加到您的项目中
#import <AVFoundation/AVFoundation.h>
和 #import <MediaPlayer/MediaPlayer.h>
- 在应用设置中激活背景模式
"Audio and AirPlay"
。
iOS 上的 Spotify 有一个非常有趣的控制中心集成。注意下面的汉堡包按钮。
锁屏也是一样!
他们是怎么做到的? MPMediaCenter 里有没有 API 之类的东西?
是的,有一个 API
查看有关 remote control events you get two classes MPRemoteCommand
and MPRemoteCommandCenter
highlighted. Looking up MPRemoteCommandCenter 的 apple 文档中的说明会告诉您有许多命令,例如 likeCommand
或 dislikeCommand
您可以为其添加处理程序。向这些命令添加处理程序会使它们显示在控制中心中。
下面是一些一体化代码,可实现与屏幕截图中显示的结果几乎完全相同的结果:
- (void)showCustomizedControlCenter {
/* basic audio initialization */
NSString *soundFilePath = [NSString stringWithFormat:@"%@/test.mp3", [[NSBundle mainBundle] resourcePath]];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
self.player.numberOfLoops = -1;
[self.player play];
/* registering as global audio playback */
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
/* the cool control center registration */
MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];
[commandCenter.playCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent *event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
[commandCenter.dislikeCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent *event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
[commandCenter.likeCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent *event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
[commandCenter.nextTrackCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent *event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
/* setting the track title, album title and button texts to match the screenshot */
commandCenter.likeCommand.localizedTitle = @"Thumb Up";
commandCenter.dislikeCommand.localizedTitle = @"Thumb down";
MPNowPlayingInfoCenter* info = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary* newInfo = [NSMutableDictionary dictionary];
[newInfo setObject:@"Mixtape" forKey:MPMediaItemPropertyTitle];
[newInfo setObject:@"Jamie Cullum" forKey:MPMediaItemPropertyArtist];
info.nowPlayingInfo = newInfo;
}
除了写代码你还需要
- 将
AVFoundation
添加到您的项目中 #import <AVFoundation/AVFoundation.h>
和#import <MediaPlayer/MediaPlayer.h>
- 在应用设置中激活背景模式
"Audio and AirPlay"
。