Расширение загрузки iOS Broadcast не запускается после нажатия кнопки «Начать трансляцию»
выслушайте мою проблему, пожалуйста.
В моей компании клиент запросил iOS-приложение для видеоразговоров. У этого клиента уже есть одно приложение PWA, которое содержит много данных, кэшированных внутри Safari, таких как PDF-файлы, презентации, видео и т. д. Этот клиент запросил возможность поделиться этим контентом через это новое приложение Videotalk. У нас уже было одно приложение, основанное на Twilio, поэтому мы проверили, возможно ли поделиться системным экраном, и после того, как мы узнали, что это возможно, мы решили «сделать это».
Во-первых, я воспользовался примером Twilio ReplayKit , чтобы написать основную функциональность и построить на ее основе приложение. Я успешно создал проект MVP, в котором использовались группы приложений для обмена данными, и я смог запустить общий доступ к экрану, подключиться к комнате Twilio и транслировать экран системы. Через некоторое время, когда я добавлял в приложение все больше и больше возможностей, совместное использование экрана перестало работать. Я мог видеть свое приложение в списке, но после того, как я нажал «Начать трансляцию», счетчик стал равен 0, но ничего не происходило.
Вот худшая часть: я вернулся к предыдущему коммиту, чтобы сравнить, что было изменено и что могло вызвать проблему, но обнаружил, что общий доступ к экрану перестал работать для этого предыдущего коммита. Я не уверен, является ли это причиной, но я удалил права приложений (их у меня было около 6) и создал только одно для всех моих конфигураций. Я постоянно возвращался, коммит за коммитом, чтобы проверить, работает ли он, но это не так :| И еще, что странно (а может и нет, когда вы думаете об «экосистеме» Apple), это тот факт, что все мои приложения, такие как Discord или Teams, прекратили совместное использование экрана. Это был тот же сценарий, что и для моего приложения. Также это произошло с моим коллегой, мы не знаем, когда, но он работал в другой ветке и, вероятно, после некоторого обновления профилей обеспечения (но мы не уверены). Возможно ли, что система блокирует работу моего расширения приложения? Если да, то как его «сбросить»?
Что я сделал, чтобы это исправить? Я вручную создал профили обеспечения со всеми возможностями, которые я ожидал от приложения. Я попытался восстановить старые права. Я восстановил заводские настройки iPhone (поскольку Teams и Discord прекратили совместное использование экрана). Я обновил iOS до новейшей версии (именно тогда Teams и Discord снова начали работать). Я попробовал тысячи реализаций кода и настроек проекта.
В основном мы проверяли это на разных платформах и разных устройствах. Он работал на одном iPad, но на нем была установлена новейшая ОС. Я действительно не знаю, что теперь делать, потому что похоже, что системный виджет блокирует некоторые из моих приложений.
Вот мое объявление переменной RPBroadcastpicker
lazy var broadcastPicker: RPSystemBroadcastPickerView = {
let view = RPSystemBroadcastPickerView(
frame: .init(
origin: .init(),
size: .init(size: 80)))
view.preferredExtension = AppData.kBEBundleId
view.showsMicrophoneButton = true
if let button = view.subviews.first as? UIButton {
button.imageView?.tintColor = UIColor.white
}
return view
}()
Вот мой код SampleHandler
class SampleHandler: RPBroadcastSampleHandler {
var room: Room?
var audioTrack: LocalAudioTrack?
var videoSource: ReplayKitVideoSource?
var screenTrack: LocalVideoTrack?
let audioDevice = ExampleReplayKitAudioCapturer(sampleType: SampleHandler.kAudioSampleType)
var statsTimer: Timer?
var disconnectSemaphore: DispatchSemaphore?
static let options = ReplayKitVideoSource.TelecineOptions.p30to24or25
static let kAudioSampleType = RPSampleBufferType.audioApp
static let kVideoCodec = VideoCodec.H264
func connectAndStartBroadcast(roomId: String, accessToken: String) {
createVideoTrackIfNeeded()
createAudioTrackIfNeeded()
let connectOptions = ConnectOptions(token: accessToken) { [unowned self] in
$0.audioTracks = [self.audioTrack!]
$0.videoTracks = [self.screenTrack!]
$0.preferredVideoCodecs = [SampleHandler.kVideoCodec.codec!]
$0.encodingParameters = self.getParamsAndFormat().0
$0.isAutomaticSubscriptionEnabled = false
$0.roomName = roomId
}
room = TwilioVideoSDK.connect(options: connectOptions, delegate: nil)
}
private func createVideoTrackIfNeeded() {
guard videoSource == nil,
screenTrack == nil else {
return
}
videoSource = ReplayKitVideoSource(
isScreencast: false,
telecineOptions: SampleHandler.options)
screenTrack = LocalVideoTrack(
source: videoSource!,
enabled: true,
name: "Screen")
videoSource?.requestOutputFormat(getParamsAndFormat().1)
}
private func createAudioTrackIfNeeded() {
guard audioTrack == nil else { return }
TwilioVideoSDK.audioDevice = self.audioDevice
audioTrack = LocalAudioTrack()
}
private func getParamsAndFormat() -> (EncodingParameters, VideoFormat) {
return ReplayKitVideoSource
.getParametersForUseCase(
videoCodec: SampleHandler.kVideoCodec,
isScreencast: false,
telecineOptions: SampleHandler.options)
}
override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
super.broadcastStarted(withSetupInfo: setupInfo)
let defaults = UserDefaults(suiteName: "group.com.myapp")
let room = defaults?.value(forKey: "roomId") as? String ?? ""
let token = defaults?.value(forKey: "userToken") as? String ?? ""
connectAndStartBroadcast(roomId: room, accessToken: token)
}
override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
switch sampleBufferType {
case RPSampleBufferType.video:
videoSource?.processFrame(sampleBuffer: sampleBuffer)
break
case RPSampleBufferType.audioApp:
if (SampleHandler.kAudioSampleType == RPSampleBufferType.audioApp) {
ExampleCoreAudioDeviceCapturerCallback(audioDevice, sampleBuffer)
}
break
case RPSampleBufferType.audioMic:
if (SampleHandler.kAudioSampleType == RPSampleBufferType.audioMic) {
ExampleCoreAudioDeviceCapturerCallback(audioDevice, sampleBuffer)
}
break
@unknown default:
break
}
}
}