我在AppStore中发布了几乎相同的应用程序。 它使用[MPMusicPlayerController applicationMusicPlayer]播放歌曲。
是的,MPMusicPlayerControllerPlaybackStateDidChangeNotification没有来到后台应用程序。 因此,我使用NSTimer确定歌曲何时结束。 您将NSTimer设置为1秒。我将NSTimer设置为歌曲播放时间段。即当歌曲有3分15秒时,我将NSTimer设定为3分15秒。
当用户暂停音乐时,我暂停NSTimer。 当用户恢复音乐时,我将NSTimer设置为歌曲的休息时间。
它工作得很好。 我希望这可以帮助你。 对不起我的英语。
您可能需要的步骤;
- 在能力设置中设置音频背景模式。 (你完成)
- 在App Delegate中使用beginBackgroundTaskWithExpirationHandler。
- (void)applicationWillResignActive:(UIApplication *)application
{
_bgid = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void)
{
[[UIApplication sharedApplication] endBackgroundTask:_bgid];
_bgid = UIBackgroundTaskInvalid;
}];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if (_bgid != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:_bgid];
}
}
3.使用的NSTimer在非重复模式。
#import "NMCountdownTimer.h"
@interface NMCountdownTimer()
{
@private
NSTimer *_timer;
NSTimeInterval _rest;
NMMethodCompletion _completion;
}
@end
@implementation NMCountdownTimer
- (void)start:(NSTimeInterval)secs completion:(NMMethodCompletion _Nullable)completion
{
_completion = completion;
if (secs > 0.0f)
{
NSLog(@"[ ] start (secs:%f)", secs);
_timer = [NSTimer scheduledTimerWithTimeInterval:secs target:self selector:@selector(fired) userInfo:nil repeats:FALSE];
_rest = 0.0f;
}
}
- (void)pause
{
if (_timer && (_rest == 0.0f))
{
_rest = [[_timer fireDate] timeIntervalSinceReferenceDate] - [[NSDate date] timeIntervalSinceReferenceDate];
NSLog(@"[ ] pause (rest:%f)", _rest);
[_timer invalidate];
_timer = nil;
}
}
- (void)resume
{
if ((! _timer) && (_rest > 0.0f))
{
NSLog(@"[ ] resume (rest:%f)", _rest);
_timer = [NSTimer scheduledTimerWithTimeInterval:_rest target:self selector:@selector(fired) userInfo:nil repeats:FALSE];
_rest = 0.0f;
}
}
- (void)kill
{
[_timer invalidate];
_timer = nil;
_rest = 0.0f;
_completion = nil;
NSLog(@"[ ] kill");
}
- (void)fired
{
[_timer invalidate];
_timer = nil;
_rest = 0.0f;
if (_completion)
{
_completion (nil);
}
NSLog(@"[ ] fired");
}
- (void)dealloc
{
#if (Namera_SHOW_DEALLOC && FALSE)
NSLog(@"[DEA] %@ NMCountdownTimer", self);
#endif
_timer = nil;
_completion = nil;
}
@end
somewhere in your code like this;
NSTimeInterval playback_duration = [[song valueForProperty: MPMediaItemPropertyPlaybackDuration] doubleValue];
....
MPMediaItemCollection *collection = [MPMediaItemCollection collectionWithItems:[NSArray arrayWithObject:song]];
[_musicCtr setQueueWithItemCollection:collection];
[_musicCtr play];
[_countdown_timer start:playback_duration completion:^(id _Nullable object)
{
[weakSelf execute_next_song];
}];
我觉得重复模式下的NSTimer在背景中效果不好。我以非重复模式使用它。 –
我已经尝试了完全相同的事情,但3分钟后我的NSTimer不再触发。所以我真正的问题是,我如何获得超过3分钟的时间?我有音频背景模式设置。 –