Связь между iOS Broadcast Upload Extension, Frameworks и приложением - PullRequest
1 голос
/ 19 февраля 2020

У меня есть пример приложения с ViewController.swift и Broadcast Upload app Extension. Внутри моего проекта у меня есть две созданные мной фреймворки:

  1. MySDK - это быстрая фреймворк, используемая для анализа и обработки CMSampleBuffer, чтобы избежать того, что Broadcast App Extension потребляет слишком много Память. Этот SDK имеет синглтон, переменную isReady, функции func initialize и func analyzeSampleBuffer(_ sampleBuffer: CMSampleBuffer)
  2. Broadcaster, это быстрый фреймворк, использующий для вызова MySDK вызов для анализа и обработки CMSampleBuffer (да Звучит как дубликат с MySDK, но я не могу сделать иначе, мне нужны эти две рамки). Этот SDK имеет синглтон и следующие функции: func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?), func processSampleBuffer(_ sampleBuffer: CMSampleBuffer)

В этом проекте я добавил Broadcast Upload App Extension с именем BroadcastExtension. В его основном файле SampleHandler.swift, в функции processSampleBuffer я использую свой Broadcaster SDK, чтобы дать ответ от расширения приложения до Broadcaster SDK, а затем MySDK для потоковой передачи CMSampleBuffer, которую я получаю от расширения приложения: Broadcaster.shared.processSampleBuffer(sampleBuffer) , В конце концов, MySDK успешно анализирует и обрабатывает CMSampleBuffer, но мое расширение приложения широковещательной загрузки занимает слишком много памяти и занимает sh через X минут после совместного использования экрана (не более 50 МБ для расширения приложения). Как я могу использовать меньше памяти для расширения приложения?

Вот мои файлы:

MySDK.swift:

import Foundation
import ReplayKit

@objcMembers public class MySDK {
    public static let shared = MySDK()
    public var isReady = false

    public func initialize() {
        // Init SDK
    }

    public func analyzeSampleBuffer(_ sampleBuffer: CMSampleBuffer) {
        // Analyze
    }
}

Broadcaster.swift:

import Foundation
import ReplayKit
import MySDK

@objcMembers public class Broadcaster: NSObject, Codable {
    public static let shared = Broadcaster()

    public func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
        MySDK.shared.isReady = true
    }

    public func processSampleBuffer(_ sampleBuffer: CMSampleBuffer) {
        if MySDK.shared.isReady {
            MySDK.shared.analyzeSampleBuffer(sampleBuffer)
        }
    }
}

SampleHandler.swift:

import ReplayKit
import Broadcaster

class SampleHandler: RPBroadcastSampleHandler {

    override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
        // User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
        Broadcaster.shared.broadcastStarted(withSetupInfo: setupInfo)
    }

    override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
        switch sampleBufferType {
        case RPSampleBufferType.video:
            // Handle video sample buffer
            Broadcaster.shared.processSampleBuffer(sampleBuffer)
            break
        case RPSampleBufferType.audioApp:
            break
        case RPSampleBufferType.audioMic:
            break
        @unknown default:
            fatalError("Unknown type of sample buffer")
        }
    }
}

Я хотел бы получить тот же общий экземпляр, используемый в приложении, но в расширении приложения. Я попытался поместить групповые приложения между приложением и расширением приложения и использовать Userdefaults с suiteName, соответствующим идентификатору группы, для отправки общего экземпляра, но при получении в расширении приложения адресная память не совпадает, это создает другой экземпляр объекта (я хочу настоящий синглтон между приложением и расширением приложения). Я не знаю, как сэкономить память на расширении приложения и как обмениваться данными между двумя платформами, расширением приложения и приложением, чтобы использовать один и тот же синглтон в каждой части проекта.

Вот иерархия моего проекта : Hierarchy of my project

...