Путь к набору рамок iOS

Я работаю над фреймворком для iOS, который поставляется с некоторыми файлами данных. Чтобы загрузить их в Dictionary я делаю что-то вроде этого:

public func loadPListFromBundle(filename: String, type: String) -> [String : AnyObject]? {
    guard
       let bundle = Bundle(for: "com.myframework")
       let path = bundle.main.path(forResource: filename, ofType: type),
       let plistDict = NSDictionary(contentsOfFile: path) as? [String : AnyObject]
    else { 
       print("plist not found")
       return nil 
    }

    return plistDict
}

Если я использую это на игровой площадке с каркасом, он работает по назначению.

Но если я использую фреймворк, встроенный в приложение, он больше не работает, "путь" теперь указывает на пакет приложения, а не на фреймворк.

Как я могу убедиться, что доступ к пакету структуры?

EDIT: код выше находится в рамках, а не в приложении.

EDIT2: приведенный выше код является функцией утилиты и не является частью структуры или класса.

Ответы

Ответ 1

Используйте Bundle(for:Type):

let bundle = Bundle(for: type(of: self))
let path = bundle.path(forResource: filename, ofType: type)

Обновить:

или поиск пакета по identifier (identifier пакета frameworks):

let bundle = Bundle(identifier: "com.myframework")

Ответ 2

Попробуйте ввести код, чтобы получить пользовательский комплект:

let bundlePath = Bundle.main.path(forResource: "CustomBunlde", ofType: "bundle")
let resourceBundle = Bundle.init(path: bundlePath!)

Обновить

Если в ваших рамках, попробуйте следующее:

[[NSBundle bundleForClass:[YourClass class]] URLForResource:@"YourResourceName" withExtension:@".suffixName"];

Ответ 3

Просто укажите имя класса ресурса, и функция ниже предоставит вам объект Bundle, с которым связан класс, поэтому, если класс связан с каркасом, он даст связку каркаса.

let bundle = Bundle(for: <YourClassName>.self)