Это ошибка Xcode (Xcode 8.2.1), и я сообщил об этом Apple, это произойдет, когда у вас большой литерал словаря или вложенный словарь. Вы должны разбить свой словарь на более мелкие части и добавить их с помощью метода добавления, пока Apple не исправит ошибку.
Имел ту же проблему, но нашел решение для этого ..
Смотрите здесь: https://devforums.apple.com/message/395049#395049
Содержание вышеуказанной ссылки:
< hr> Замените APPNAME
на собственное имя приложения!
Я на iOS 4.2.1
РЕДАКТИРОВАТЬ: Работа с бета-версией iOS5 + 6 + 7 до сих пор ]
Добавьте UIBackgroundModes
в APPNAME-Info.plist
, выбрав приложение, воспроизводящее аудио
, а затем добавьте AudioToolBox
фреймворк в фреймворки папок.
В 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 {
, но перед двумя строками:
[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
Создайте свой проект и посмотрите, есть ли ошибки, если нет, попробуйте отладку на устройстве, установленном в симуляторе, это может ошибка на симуляторе.
Надеюсь, это поможет другим с той же проблемой ..
ОБНОВЛЕНИЕ IOS 11.2 с помощью Swift 4:
Теперь, если вы используете AVPlayer для воспроизведения музыкальных файлов, вы также должны настроить MPNowPlayingInfoCenter.default()
для отображения информации о воспроизведении. на экране блокировки.
Приведенный ниже код покажет теперь элементы управления воспроизведением на экране, но он не сможет отвечать на любые команды.
Если вы также хотите, чтобы элементы управления работали, вам следует проверить пример проекта Apple здесь: https://developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#/ / apple_ref / doc / uid / TP40017322
Пример кода Apple охватывает все, но я нахожу его непонятным.
Если вы хотите воспроизвести звук и отобразить элементы управления на экране блокировки, эти шаги подойдут очень хорошо.
ВАЖНОЕ ПРИМЕЧАНИЕ: Если вы НЕ используете AVPlayer для воспроизведения звука. Если вы используете сторонние библиотеки для создания звука или воспроизведения звукового файла, вам следует прочитать комментарии внутри кода. Также, если вы используете ios simulator 11.2, вы не сможете увидеть какие-либо элементы управления на экране блокировки. Вы должны использовать устройство, чтобы увидеть, как оно работает.
1- Выбрать проект -> Возможности -> включить режимы фона -> отметить аудио, AirPlay и Картинка в картинке
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;
}
Теперь приложение продолжает воспроизводить музыку, даже если экран заблокирован:)
У меня такая же проблема, и я нашел решение в Apple Docs: https://developer.apple.com/library/ios/qa/qa1668/_index.html
В: Как я могу обеспечить, чтобы мои медиафайлы продолжали воспроизводиться при использовании AV Foundation, когда мое приложение работает в фоновом режиме?
A: Вы должны объявить, что ваше приложение воспроизводит слышимый контент в фоновом режиме, и назначить соответствующая категория для вашей аудио сессии. См. Также Специальные Соображения для видео СМИ .
Я успешно запустил аудио в фоновом режиме, добавив следующее в 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];
iOS 9 Swift
Все, что вам нужно, это добавить следующее в свой didFinishLaunchingWithOptions
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
//TODO
}
У вас есть хороший пример фонового приложения GPS, которое воспроизводит звуки даже в фоновом режиме:
http://www.informit.com/articles/article.aspx?p=1646438& seqNum = 5
В этом примере используется AudioToolbox.
Я сам провел тест, и он работает: создайте простой проект, который отслеживает сообщение GPS (UIBackgroundModes
location
), и каждую полученную позицию x, воспроизводите звук, используя
AudioServicesPlaySystemSound(soundId);
Тогда, если вы добавите audio
как часть вашего UIBackgroundModes
, и звуки будут воспроизводиться, даже если приложение больше не находится на переднем плане.
Я сделал такой тест, и он работает нормально!
(мне не удалось заставить его работать с AVPlayer, поэтому я отказался от AudioToolbox)