iOS广播上传扩展,框架和应用之间的通信

问题描述 投票:2回答:1

我有一个带有ViewController.swiftBroadcast Upload app Extension的示例应用程序。在我的项目中,我创建了两个框架:

  1. MySDK,是一种用于分析和处理CMSampleBuffer的快速框架,以避免广播应用程序扩展占用过多的内存。该SDK具有单例,变量isReady,函数func initializefunc analyzeSampleBuffer(_ sampleBuffer: CMSampleBuffer)
  2. Broadcaster,是一个用于调用MySDK进行分析和处理CMSampleBuffer的快速框架(是的,听起来像MySDK的副本,但是我不能这样做,我需要这两个框架)。此SDK具有单例和以下功能:func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?)func processSampleBuffer(_ sampleBuffer: CMSampleBuffer)

在此项目中,我添加了一个名为Broadcast Upload App ExtensionBroadcastExtension。在他的主文件SampleHandler.swift中,在processSampleBuffer函数中,我使用Broadcaster SDK负责从应用扩展名到Broadcaster SDK的责任,然后再向MySDK负责从应用程序扩展名中收到的CMSampleBuffer的传输:Broadcaster.shared.processSampleBuffer(sampleBuffer) 。最后,MySDK成功分析并处理了CMSampleBuffer,但我的广播上传应用程序扩展占用了太多内存,并且在屏幕共享X分钟后崩溃(应用程序扩展最大50Mb)。如何在App Extension上使用更少的内存?

这是我的文件:

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和与组ID对应的suiteName来发送共享实例,但是当我在应用扩展中收到消息时,地址内存不一样,创建对象的另一个实例(我想要在应用程序和应用程序扩展之间真正的单例)。我不知道如何在应用程序扩展上节省内存,以及如何在两个框架,应用程序扩展和应用程序之间进行通信,以在项目的每个部分上使用相同的单例。

这是我的项目的层次结构:Hierarchy of my project

ios swift frameworks ios-app-extension replaykit
1个回答
0
投票

但是我的广播上传应用程序扩展程序占用了太多内存,并且崩溃了屏幕共享X分钟后(应用扩展程序最多50Mb)。如何在App Extension上使用更少的内存?

© www.soinside.com 2019 - 2024. All rights reserved.