beginReceivingRemoteControlEvents 不触发 Apple Music 事件

2024-01-03

我正在从我的应用程序播放 Apple Music,Apple Music 播放器代码如下 -

-(void) submitAppleMusicTrackWithProductID: (NSString *) productID // productID in US is the last numbers after i= in the share URL from Apple Music
{

    [SKCloudServiceController requestAuthorization:^(SKCloudServiceAuthorizationStatus status) {
        NSLog(@"status is %ld", (long)status);
        SKCloudServiceController *cloudServiceController;
        cloudServiceController = [[SKCloudServiceController alloc] init];
        [cloudServiceController requestCapabilitiesWithCompletionHandler:^(SKCloudServiceCapability capabilities, NSError * _Nullable error) {
            NSLog(@"%lu %@", (unsigned long)capabilities, error);

            if (capabilities >= SKCloudServiceCapabilityAddToCloudMusicLibrary || capabilities==SKCloudServiceCapabilityMusicCatalogPlayback)
            {
                NSLog(@"You CAN add to iCloud!");
                [[MPMediaLibrary defaultMediaLibrary] addItemWithProductID:productID completionHandler:^(NSArray<__kindof MPMediaEntity *> * _Nonnull           entities, NSError * _Nullable error)
                 {
                     NSLog(@"added id%@ entities: %@ and error is %@", productID, entities, error);
                     NSArray *tracksToPlay = [NSArray arrayWithObject:productID];
                 [[MPMusicPlayerController applicationMusicPlayer] setQueueWithStoreIDs:tracksToPlay];
                    [[MPMusicPlayerController applicationMusicPlayer] stop];
                 [[MPMusicPlayerController applicationMusicPlayer] play];
                   self.isTrackChangedByNextPreviousButton = NO;

        [[NSNotificationCenter defaultCenter]removeObserver:self name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter]removeObserver:self name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                              selector:@selector(handleTrackChanged:)
                                                                  name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
                                                                object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                              selector:@selector(handlePlaybackStateChanged:)
                                                                  name:MPMusicPlayerControllerPlaybackStateDidChangeNotification
                                                                object:nil];


                     [[MPMusicPlayerController applicationMusicPlayer] beginGeneratingPlaybackNotifications];
                     [[MPMusicPlayerController applicationMusicPlayer] setRepeatMode: MPMusicRepeatModeNone];
                 }];


            }
            else
            {
                NSLog(@"Blast! The ability to add Apple Music track is not there. sigh.");
            }

        }];

    }];
}

-(void)handleTrackChanged:(id )notification
{
    if (!self.AppleMusicPreviuosTrack)
    {        
        self.AppleMusicPreviuosTrack = [[Tracks alloc] init];
    }
    if (self.AppleMusicPreviuosTrack.trackId == self.CurrentTrack.trackId && [MPMusicPlayerController applicationMusicPlayer].currentPlaybackRate == 0 && !self.isSongChangedManually)
    {
        self.isSongChangedManually = YES;
        [self FilterArtistsTracks:@"next" :^(Tracks *track, NSError *err)
         {

         }];

    }
    else
    {
     if ([[MPMusicPlayerController applicationMusicPlayer] currentPlaybackRate]==1)
     {
    self.AppleMusicPreviuosTrack.trackId = self.CurrentTrack.trackId;
    [[NSNotificationCenter defaultCenter] postNotificationName:kTrackChanged object:nil];
         //Delay execution of my block for 20 seconds.
 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
     self.isSongChangedManually = NO;
 });

     }
    }
}

-(void)handlePlaybackStateChanged:(id )notification
{
    NSLog(@"handle_PlaybackStateChanged");
     [[NSNotificationCenter defaultCenter] postNotificationName:kDidTrackPlaybackStatus object:nil];
    if ([MPMusicPlayerController applicationMusicPlayer].currentPlaybackRate>0)
    {
        [self.playerMenuView.playpauseButton setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal];
    }
    else
    {
        [self.playerMenuView.playpauseButton setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal];
    }

}

效果很好。现在我想从锁定屏幕控制轨道,为此我做了以下代码viewWillAppear

  [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
   [APP_DELEGATE becomeFirstResponder];

and remoteControlReceivedWithEvent方法写在AppDelegate文件如下 -

-(void)remoteControlReceivedWithEvent:(UIEvent *)event
{
    switch (event.subtype)
    {
        case UIEventSubtypeRemoteControlTogglePlayPause:
            [APP_DELEGATE PlayPauseMusic:nil];
            //[streamer pause];
            break;
        case UIEventSubtypeRemoteControlPlay:
            [APP_DELEGATE PlayPauseMusic:nil];
            //[streamer start];
            break;
        case UIEventSubtypeRemoteControlPause:
            [APP_DELEGATE PlayPauseMusic:nil];
            //[streamer pause];
            break;
        case UIEventSubtypeRemoteControlStop:
            [APP_DELEGATE PlayPauseMusic:nil];

            //[streamer stop];
            break;
        case UIEventSubtypeRemoteControlNextTrack:

            [APP_DELEGATE next:nil];

            break;
        case UIEventSubtypeRemoteControlPreviousTrack:
            [APP_DELEGATE previous:nil];


            break;

        default:
            break;
    }
}

Note - The remoteControlReceivedWithEvent每次触发如果iTunes曲目正在播放AVPlayer OR Spotify曲目由 Spotify iOS SDK 播放。

但通过以下方式播放 Apple Music 曲目时不会触发相同的代码 -

[MPMusicPlayerController applicationMusicPlayer]      

                 or

 [MPMusicPlayerController systemMusicPlayer]

任何帮助将不胜感激。谢谢


而不是使用-(void)remoteControlReceivedWithEvent:(UIEvent *)event要跟踪控件,请使用MPRemoteCommandCenter向每个控件添加目标:

注意:在分配目标之前启用控件非常重要。

[MPRemoteCommandCenter sharedCommandCenter].playCommand.enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter].playCommand addTarget:self action:@selector(remotePlay)];

[MPRemoteCommandCenter sharedCommandCenter].pauseCommand.enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter].pauseCommand addTarget:self action:@selector(remoteStop)];

[MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand.enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand addTarget:self action:@selector(loadPreviousSong)];

[MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand.enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand addTarget:self action:@selector(loadNextSong)];

选择器:

-(void) remotePlay {
    [APP_DELEGATE PlayPauseMusic:nil];
}
-(void) remoteStop {
    [APP_DELEGATE PlayPauseMusic:nil];
}
-(void) loadNextSong {
    [APP_DELEGATE next:nil];
}
-(void) loadPreviousSong {
    [APP_DELEGATE previous:nil];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

beginReceivingRemoteControlEvents 不触发 Apple Music 事件 的相关文章

随机推荐

  • 创建一系列文本剪辑并使用 moviepy 将它们连接成视频

    在 MoviePy 中 有一个 API 可以从文本创建剪辑以及连接剪辑列表 我正在尝试在循环中创建剪辑列表 然后尝试将它们连接起来 问题是每次它都会创建一个 25 秒的视频文件 并且循环中仅包含最后一个文本 这是代码 for text in
  • 如何在没有原型的情况下找到C函数?

    公司政策规定 C 源代码中的每个函数都有一个原型 我继承了一个有自己的 make 系统的项目 所以我cannot在 gcc 或 Visual Studio 上测试它 发现其中一个文件有一些没有原型声明的静态函数 有没有办法 不一定使用编译器
  • 如何在Android上将GPS坐标保存在exif数据中?

    我正在将 GPS 坐标写入 JPEG 图像 并且坐标是正确的 如我的 logcat 输出所示 但它似乎以某种方式被损坏 读取 exif 数据会导致空值 或者对于我的 GPS 512 976698 degrees 512 976698 deg
  • 使用 VBA 从 Outlook 2010 保存 .XLSX 附件

    我们使用 Outlook 2010 并接收带有 Excel 附件的电子邮件 我们手动将附件保存在我们在网络驱动器上的分区文件夹中创建的子文件夹中 我很好奇的是是否有可能 使用代码检查传入的电子邮件以查看它们是否有附件 然后检查附件是否为 X
  • 内存间接寻址 movl - 汇编

    我试图了解内存间接寻址在具有 AT T 语法的汇编语言中到底是如何工作的 movl eax ebx movl eax ebx 这是一个类似的问题 解释了内存间接寻址 https stackoverflow com questions 161
  • 是否可以使 JavaFX 中的 ImageView 响应式?

    我和一些朋友正在进行一个项目 我们尝试用 JavaFX 编写游戏 我们有一个 GridPane 它与内部的 ImageView 一起生长以容纳地图和游戏角色等 游戏角色和敌人将有自己的图像视图 我们可以在网格窗格中移动 所以 我们现在的问题
  • 尝试禁用 JInternalFrame 的拖动

    我已经四处寻找了一段时间 但找不到禁用拖动 JIntenal Frame 的方法 任何帮助将不胜感激 TYIA 罗兰 请记住这是一个小程序 import java awt import java applet import java awt
  • 如何查询NHibernate的特定类型?

    我使用 Fluent NHibernate 和 DiscrimminateSubClassesOnColumn 来支持子类化 用于区分子类的列未映射到实体上的实际属性 如何创建仅返回给定类型实体的查询 这是我的尝试 其中 propertyN
  • ESP8266 在简单的 http 请求后崩溃

    我正在使用 NodeMCU V3 模块 每当我尝试向服务器发出 http 请求时 模块就会崩溃 这是代码 void setup WiFi begin wifi name wifi password while WiFi status WL
  • 无法从 ruby​​gems 下载数据

    我不知道尝试运行时这个错误意味着什么gem update system 9 29 2 2 3 gem update system ERROR While executing gem Gem RemoteFetcher FetchError
  • Scala中二叉树的尾递归最大深度方法

    我写了一个计算二叉树最大深度的方法 我想写一个尾递归方法 我想过使用列表 但没有找到解决方案 这是我的方法 不是尾递归的 def depth Int def iter f FormulaWff Int f match case Var gt
  • 使用其他栅格作为指标对栅格堆栈的每个网格单元求和的函数

    input raster s lt stack list files dailyraster full names TRUE daily raster stack r start lt raster stackSumSTART asc th
  • 并行 foreach 循环 - 奇怪的行为

    下面的代码简单地创建一个随机数的 List gt 然后在并行 foreach 循环中计算每个列表的累积和 为什么我得到的评估少于 numLists 通常在9990左右 我猜这与线程安全有关 有什么替代方法 我是 C 初学者 所以希望我使用了
  • 如何登录win32 c++到Visual Studio输出窗口?

    我的 log4net 正在记录到 Visual Studio 输出窗口 但是我可以在 C win32 代码中使用什么代码来执行与我需要调试 C 相同的操作 并且似乎根本无法单步执行它 并且日志记录在生产中很有用无论如何也是如此 我添加了 w
  • 更改现有数据框的架构

    我想更改现有数据框的架构 在更改架构时遇到错误 我是否可以更改数据框的现有架构 val customSchema StructType Array StructField data typ StringType nullable false
  • 在 g++ 4.4.3 上得到负 NaN,这是标准吗?

    我在带有 Ubuntu Lucid Lynx 的 Linux 上安装了 g 4 4 3 并且得到了 nan 因此 在带有 g 4 3 1 的 Hardy Heron 上 我得到了所有 nan 这导致我的文本差异回归失败 因为我使用 cout
  • Solr、Sunspot、SQlite 和 Rails

    我想为我的使用 SQlite3 作为数据库的项目实现全文搜索 分面 听说Solr真的很强大 有 Sunspot 和 Solr 教程可用 但仅适用于 MySQL 我找不到任何有关如何为 SQLite3 设置它的文档 有人知道如何使用 SQLi
  • 使用数据表运行 100,000 次 Fisher 精确检验比应用慢

    早上好 我正在尝试使用 R 非常快速地对模拟遗传数据运行 100 000 次 Fisher 精确测试 最好在 30 秒内完成 因为我需要排列病例对照标签并迭代该过程 1 000 次 因此它会运行一夜 我尝试使用融化 整齐的数据上的数据表 其
  • 一个项目可以有多个起源吗?

    一个项目在 Git 中可以有两个 或多个 起源 吗 我想将一个项目推向两者github https github com and a Heroku https www heroku com server 具体来说 添加github仓库时出现
  • beginReceivingRemoteControlEvents 不触发 Apple Music 事件

    我正在从我的应用程序播放 Apple Music Apple Music 播放器代码如下 void submitAppleMusicTrackWithProductID NSString productID productID in US