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

Ios 在iMessage应用程序(Swift)中使用现有数据库,ios,swift,xcode,sqlite,imessage,Ios,Swift,Xcode,Sqlite,Imessage,目前正在构建iMessage应用程序,并希望尝试使用数据库。我有一个数据库,我想在应用程序中使用,并已将其包括在我的项目中,并验证了目标成员资格是正确的。使用SQLite.Swift 每当我尝试在simulator中打开与数据库的连接时,我总是会得到数据库路径的错误(意外的零) 我用同样的方法尝试了一个图像文件,但没有结果 let imagePath = Bundle.main.path(forResource: "db", ofType: ".sqlite") do {

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

每当我尝试在simulator中打开与数据库的连接时,我总是会得到数据库路径的错误(意外的零)

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

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

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

    } catch {

    }

我相信这个问题更多地与iMessage“应用程序”有关——它实际上是一个扩展,而不是一个真正的应用程序。没有初始VC,因此没有真正的
Bundle.main

我的一个(也许很快就会有第二个)应用程序有一个照片编辑扩展——基本上就是我一直称之为苹果应用程序的“外壳连接”。你真的有一个“什么都不做”的应用程序,连接到他们的一个应用程序,或者你有一个独立的应用程序,共享带有扩展名的代码

我共享代码的解决方案是使用框架目标。是的,第三个项目。(应用程序、扩展、共享代码)我发现了一种我认为应该适用于您的技术-基本上,对于图像、脚本(我的应用程序使用.cikernel文件),您可以将它们添加到框架项目中,并在函数调用中返回所需的内容

您可能需要一个框架目标来简化这个过程。YMMV。基本原则如下:

  • 在Xcode中的某个地方,您有一个“Bundle标识符”。类似于*“com.company.projectname”
  • 把你的文件放到一个文件夹里,也许在你的桌面上。将名为“.bundle”的扩展名添加到此文件夹。macOS会给你一个警告,接受它。你真正要做的就是创建你的包
  • 将其拖到您的Xcode项目中
  • 获取此捆绑包及其内部文件的代码。(我不确定这里是否需要一个框架——首先尝试将它拖到“MessagesExtension”目标中
假设您希望在项目、扩展等之间共享图像。将它们移动到名为“图像”的文件夹中,并在最后用“.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”的捆绑包的一部分:


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

我使用照片扩展,如果我理解正确,“iMessage应用”实际上更像是消息扩展,而不是实际的应用。我创建了一个“开箱即用”我看到两个目标,没有主视图控制器。基于这一点(以及我对照片扩展的经验),我认为问题在于
捆绑包。main
-没有。我使用框架目标,有一种方法可以包括图像和脚本,并找到“捆绑包”的位置“在这里。如果您愿意,我可以将该代码作为答案发布。(编辑:我不知道这是否适用于db,但应该如此。)@dfd我愿意尝试任何东西。我感谢你的帮助。非常有指导意义!谢谢!我今晚晚些时候会尝试试一试。我会在有东西工作时更新。很抱歉,我还是Swift的新手。在函数中,你是在函数中传递字符串吗?--没关系,我只是有时候有点慢,lolI继续并给出了imag函数a在我的实际项目中第一次尝试,在新项目中第二次尝试。我两次尝试都失败了。我可以尝试将其用作框架吗?图片:有两件事:(1)在.xcodeproj常规属性中,您的包ID是“zb.test”吗?(2)图片是“pic”a.png还是“.jpg”-如果是后者,您需要添加文件的扩展名。(3)图像是否在“.bundle”中?看起来您可能需要尝试一个框架。我让它工作了!我有两个问题:我没有完全检查bundle ID是否有效(我相信它说它不够唯一),所以我更改了它。另一个是添加“.MessagesExtension”到函数中标识符的末尾。一旦我更改了这些内容,您的文本文件函数工作得很好,甚至可以找到我的数据库文件。谢谢!
let cameraImage = returnImage("Camera")