34

私は宿題をしました...ここ、ドキュメント、グーグル、スタックオーバーフローを読んでいます...しかし、ユーザーがアプリをバックグラウンドにしたときにサウンドを固定することはまだうまくいきません。

これまでに行ったこと: UIBackgroundModes、オーディオを plist ファイルに追加しました。

最初にこのコード:

radioAudio = [[AVAudioSession alloc] init];
[radioAudio setCategory:AVAudioSessionCategoryPlayback error:nil];
[radioAudio setActive:YES error:nil];

次に、これ:

NSString *radioURL = @"http://xxx.xxx.xxx/radio.m3u";
radioPlayer = [[AVPlayer playerWithURL:[NSURL URLWithString:radioURL]] retain];

しかし、ユーザーがホームボタンを押すとすぐに、私のサウンドは消えます。

私もこれを見つけましたが、まだ追加されていません。

newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
     if (newTaskId != UIBackgroundTaskInvalid && bgTaskId != UIBackgroundTaskInvalid)
        [[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
bgTaskId = newTaskId;

今のところ、ユーザーが電話で他のことをしている間に AVPlayer がラジオを鳴らすには、どこに行けばよいかわかりません。4.2 の iPhone 4 でこれをテストしています。4.0 用にビルドします。

私が何をすべきか提案はありますか?

4

7 に答える 7

52

Swift 4 で IOS 11.2 を更新:

AVPlayerを使用して音楽ファイルを再生している場合はMPNowPlayingInfoCenter.default()、現在再生中の情報をロック画面に表示するように構成する必要があります。

以下のコードは、現在再生中のコントロールを画面に表示しますが、コマンドに応答することはできません。

コントロールも機能させたい場合は、こちらのアップルのサンプル プロジェクトを確認してください: https://developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40017322

Apple のサンプル コードはすべてをカバーしていますが、わかりにくいと思います。

ロック画面でサウンドを再生してコントロールを表示する場合は、これらの手順で問題ありません。

重要な注意: AVPlayerを使用してサウンドを再生していない場合。サードパーティのライブラリを使用してサウンドを生成したり、サウンド ファイルを再生したりする場合は、コード内のコメントを読む必要があります。また、iOS シミュレーター 11.2 を使用している場合、ロック画面にコントロールが表示されません。デバイスを使用して動作を確認する必要があります。


1- プロジェクトを選択 -> 機能 -> バックグラウンド モードをオンに設定 -> Audio、AirPlay、Picture in Picture にチェックを入れる

iOS 11 バックグラウンド オーディオ設定

2- AppDelegate.swiftファイルは次のようになります。

import UIKit

import AVFoundation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
    {
        // Override point for customization after application launch.

        do
        {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

         //!! IMPORTANT !!
         /*
         If you're using 3rd party libraries to play sound or generate sound you should
         set sample rate manually here.
         Otherwise you wont be able to hear any sound when you lock screen
         */
            //try AVAudioSession.sharedInstance().setPreferredSampleRate(4096)
        }
        catch
        {
            print(error)
        }
        // This will enable to show nowplaying controls on lock screen
        application.beginReceivingRemoteControlEvents()

        return true
    }
}

3- ViewController.swiftは次のようになります。

import UIKit

import AVFoundation
import MediaPlayer

class ViewController: UIViewController
{

    var player : AVPlayer = AVPlayer()

    override func viewDidLoad()
    {
        super.viewDidLoad()


        let path = Bundle.main.path(forResource: "music", ofType: "mp3")
        let url = URL(fileURLWithPath: path!)

        // !! IMPORTANT !!
        /*
            If you are using 3rd party libraries to play sound 
            or generate sound you should always setNowPlayingInfo 
            before you create your player object.

            right:
            self.setNowPlayingInfo()
            let notAVPlayer = SomePlayer()

            wrong(You won't be able to see any controls on lock screen.):
            let notAVPlayer = SomePlayer()
            self.setNowPlayingInfo()
         */

        self.setNowPlayingInfo()
        self.player = AVPlayer(url: url)

    }


    func setNowPlayingInfo()
    {
        let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
        var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfo ?? [String: Any]()

        let title = "title"
        let album = "album"
        let artworkData = Data()
        let image = UIImage(data: artworkData) ?? UIImage()
        let artwork = MPMediaItemArtwork(boundsSize: image.size, requestHandler: {  (_) -> UIImage in
            return image
        })

        nowPlayingInfo[MPMediaItemPropertyTitle] = title
        nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = album
        nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork

        nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo
    }

    @IBAction func startPlayingButtonPressed(_ sender: Any)
    {
        self.player.play()
    }

古い回答IOS 8.2:

パトリックの答えは完全に正しいです。

しかし、私はios 8.2のために何をするかを書くつもりです:

以下のように、アプリの info.plist に必要なバックグラウンド モードを追加します。

ここに画像の説明を入力

そして、私のAppDelegate.hにこれらのインポートを追加します:

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

次に、私のAppDelegate.mで、以下のように正確にアプリケーション didFinishLaunchingWithOptionsthisを書きました:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

    return YES;
}

画面がロックされていても、アプリは音楽を再生し続けます:)

于 2015-03-19T09:04:16.957 に答える
42

同じ問題がありましたが、これに対する解決策を見つけました..

こちらをご覧ください: https://devforums.apple.com/message/395049#395049

上記リンクの内容:


APPNAME独自のアプリ名に置き換えてください。

iOS 4.2.1 を使用しています

編集: これまでのところ iOS5 + 6 + 7 ベータ版での作業

を追加UIBackgroundModesAPPNAME-Info.plist、選択アプリでオーディオを再生します

AudioToolBox次に、フレームワークをフォルダー Frameworks に追加します。

APPNAMEAppDelegate.h追加で:

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

したがって、次のようになります。

...
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
...

以下をAPPNAMEAppDelegate.m追加します。

// Set AudioSession
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];

/* Pick any one of them */
// 1. Overriding the output audio route
//UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
//AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

// 2. Changing the default output audio route
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

しかし、2 行の前に:

[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];

プロジェクトをビルドし、エラーがないかどうかを確認します。そうでない場合は、シミュレーターをインストールしたデバイスでデバッグしてみてください。シミュレーターでバグが発生する可能性があります。

これが同じ問題を抱えている他の人に役立つことを願っています..

于 2011-03-09T22:48:34.497 に答える
10

以下を追加することで、バックグラウンドでオーディオを正常に実行できました。applicationDidFinishLaunching

// Registers this class as the delegate of the audio session.
[[AVAudioSession sharedInstance] setDelegate: self];    
// Allow the app sound to continue to play when the screen is locked.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
于 2011-01-22T23:24:19.317 に答える
6

iOS 9 スイフト

必要なのは、次を didFinishLaunchingWithOptions に追加することだけです

do  {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
    //TODO
}
于 2015-12-16T18:46:36.423 に答える
1

私は同じ問題を抱えており、Apple Docs で解決策を見つけました: https ://developer.apple.com/library/ios/qa/qa1668/_index.html

Q: アプリケーションがバックグラウンドで動作しているときに AV Foundation を使用しているときに、メディアが引き続き再生されるようにするにはどうすればよいですか?

A: アプリがバックグラウンドで可聴コンテンツを再生することを宣言し、オーディオ セッションに適切なカテゴリを割り当てる必要があります。ビデオ メディアに関する特別な考慮事項も参照してください。

于 2016-03-01T15:41:09.573 に答える
1

バックグラウンドでもサウンドを再生する GPS バックグラウンド アプリの良い例があります。

http://www.informit.com/articles/article.aspx?p=1646438&seqNum=5

この例では、AudioToolbox が使用されています。

私は自分でテストを行いましたが、動作します: GPS ポスト ( UIBackgroundModes location) を監視する簡単なプロジェクトを作成し、x 受信位置ごとに、次を使用してサウンドを再生します。

AudioServicesPlaySystemSound(soundId);

次に、audioの一部として配置するUIBackgroundModesと、アプリケーションがフォアグラウンドになくてもサウンドが再生されます。

私はそのようなテストを行いましたが、問題なく動作します!

(AVPlayer で動作させることができなかったので、AudioToolbox にフォールバックしました)

于 2011-03-18T15:37:35.087 に答える