在 WatchKit 应用中播放背景声音

Posted

技术标签:

【中文标题】在 WatchKit 应用中播放背景声音【英文标题】:Play a background sound in WatchKit app 【发布时间】:2015-05-14 22:23:12 【问题描述】:

我在 WatchKit 中有一个按钮,可以像这样向 iPhone 主应用发送通知。

-(IBAction) startSound

    //turn sound on
    NSString *requestString = [NSString stringWithFormat:@"startSound"]; // This string is arbitrary, just must match here and at the iPhone side of the implementation.
    NSDictionary *applicationData = [[NSDictionary alloc] initWithObjects:@[requestString] forKeys:@[@"startSound"]];

    [WKInterfaceController openParentApplication:applicationData reply:^(NSDictionary *replyInfo, NSError *error) 
        //NSLog(@"\nReply info: %@\nError: %@",replyInfo, error);
    ];

在我的 iPhone 应用程序委托中,我添加了以下代码。

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply

    NSLog(@"handleWatchKitExtensionRequest ...");

    NSMutableDictionary *mutDic = [[NSMutableDictionary alloc] init];

    //This block just asks the code put after it to be run in background for 10 mins max
    __block UIBackgroundTaskIdentifier bgTask;
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^
        bgTask = UIBackgroundTaskInvalid;
    ];

    NSString *request = [userInfo objectForKey:@"startSound"];
    if ([request isEqualToString:@"startSound"])
    
        NSString *soundFilePath = [[NSBundle mainBundle] pathForResource: @"warning" ofType: @"mp3"];
        NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];

        myAudioPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
        myAudioPlayer1.numberOfLoops = -1; //inifinite
        [myAudioPlayer1 play];
    

    reply(nil); //must reply with something no matter what

    //once code is all done and the reply has been sent only then end the bg-handler
    [application endBackgroundTask:bgTask];

然而,当我的应用程序进行 Apple 审核时,它被拒绝了,原因是我的应用程序必须在前台运行才能使声音功能正常工作。我错过了什么?

10.6 - Apple 和我们的客户高度重视简单、精致、富有创意且经过深思熟虑的界面。他们需要做更多的工作,但 值得。苹果设定了很高的标准。如果您的用户界面很复杂或 不太好,可能会被拒

10.6 详情

我们仍然发现您的 Apple Watch 应用需要包含该应用 在 iPhone 的前台运行以播放警报器 声音,这提供了糟糕的用户体验。

后续步骤

请参阅 UIApplicationDelegate 协议参考来实现 此方法并使用它来响应来自 Apple Watch 的请求 应用程序。

因为这个方法很可能在你的应用处于 后台,调用 beginBackgroundTaskWithName:expirationHandler: 实现开始时的方法和 endBackgroundTask: 处理完回复并执行回复后的方法 堵塞。启动后台任务可确保您的应用不 在它有机会发送回复之前被暂停。

【问题讨论】:

【参考方案1】:

音频剪辑有多长?在您共享的代码中,reply() 似乎几乎会立即被调用,这不会让剪辑有机会播放。您应该延迟调用 reply() 直到您的音频剪辑完成。

【讨论】:

【参考方案2】:

我在我的 WatchKit 应用中做了一些非常相似的事情。当用户点击一个按钮时,我会从我的 iPhone 应用程序中播放音频,而我的 iPhone 应用程序不需要在前台运行。我必须做两件事才能让它发挥作用。第一个是使用beginBackgroundTaskWithName 设置后台任务,我可以看到您正在这样做。第二个是在我的后台模式中启用后台音频功能。

除了这两个之外,我不记得做过任何其他事情来让它工作。在我添加支持之前,我的应用中确实已经有背景音频工作,因此可以使用 MPNowPlayingInfoCenter 控制它。

【讨论】:

谢谢,但苹果拒绝了其他手表应用之一,称背景音频不适合用于此目的 正确。短片不需要背景音频模式。 感谢@bgiham 提供的信息,我对短片一无所知。在我的应用中,用户可能会播放 30 分钟的音频,因此 Apple 没有说明背景音频不适合它。

以上是关于在 WatchKit 应用中播放背景声音的主要内容,如果未能解决你的问题,请参考以下文章

使用 WatchKit 2 播放声音

通过 iPhone 从 Apple Watch 播放声音

Apple Watch: WatchKit 应用程序要点

检测蓝牙耳机是不是连接到 Apple Watch

是否可以播放存储在 Apple Watch 上的音乐? [关闭]

Apple Watch、WatchKit 和 NSUserDefaults [重复]