在 iMessage 应用程序中使用现有数据库 (Swift)

Using an existing database in an iMessage app (Swift)

目前正在构建 iMessage 应用程序,并想尝试使用数据库。我有一个我想在应用程序中使用的数据库,并将其包含在我的项目中,并验证了目标成员身份是否正确。使用 SQLite.Swift.

每当我尝试在模拟器中打开与数据库的连接时,我总是会收到数据库路径错误(意外的 nil)。

我用同样的方法尝试了一个图像文件,但没有用。

 let imagePath = Bundle.main.path(forResource: "db", ofType: ".sqlite")

    do {
        let db = try Connection(imagePath!, readonly: true)

    } catch {

    }

我认为这个问题更多地与 iMessage "app" 是什么有关——它实际上是一个扩展,而不是一个真正的应用程序。没有首字母 VC,因此没有真正的 Bundle.main 可以到达。

我的一个(也许很快)应用程序有一个照片编辑扩展 - 基本上我一直称之为 Apple 应用程序的 "shell connection"。您确实有一个 "do nothing" 应用程序并连接到他们的应用程序之一,或者您有一个独立的应用程序 共享 带有扩展名的代码。

我共享代码的解决方案是使用框架目标。是的,第三个 项目。 (应用程序、扩展、共享代码。)我发现了一种我认为应该适合你的技术——基本上,对于图像、脚本(我的应用程序使用 .cikernel 文件)你将它们添加到框架项目和return你在函数调用中需要什么。

您可以通过需要框架目标来简化此过程。 YMMV。基础知识是这样的:

  • 在 Xcode 的某个地方你有一个 "Bundle Identifier"。类似于 *"com.company.projectname".
  • 将您的文件放入一个文件夹中,也许在您的桌面上。向此文件夹添加名为 ".bundle" 的扩展名。 macOS 会给你一个警告,接受它。您真正要做的就是创建您的包。
  • 将其拖到您的 Xcode 项目中。
  • 获取此包及其中的文件的代码。 (我不确定这里是否需要一个框架 - 先尝试将它拖到您的 "MessagesExtension" 目标中。

所以假设您有想要在项目、扩展等之间共享的图像。将它们移动到一个名为 "images" 的文件夹中,并在末尾用“.bundle”重命名该文件夹,最后将其拖到您的 Xcode 项目中,您几乎需要添加此功能:

public func returnImage(_ named:String) -> UIImage {
    let myBundle = Bundle.init(identifier: "com.company.project")
    let imagePath = (myBundle?.path(forResource: "images", ofType: "bundle"))! + "/" + named
    let theImage = UIImage(contentsOfFile: imagePath)
    return theImage!
}

对于您想要的文本文件:

public func returnKernel(_ named:String) -> String {
    let myBundle = Bundle.init(identifier: "com.company.project")
    let kernelPath = (myBundle?.path(forResource: "cikernels", ofType: "bundle"))! + "/" + named + ".cikernel"
    do {
        return try String(contentsOfFile: kernelPath)
    }
    catch let error as NSError {
        return error.description
    }
}

用法,对于名为 "Camera.png" 的图像,它是名为 "images.bundle" 的捆绑包的一部分:

let cameraImage = returnImage("Camera")

因为我不使用 SQLite 文件,所以我没有确切的代码,但我认为这应该可行。请记住将 "com.company.project" 更改为您拥有的包标识符。