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

时间:2017-07-28 20:33:28

标签: ios swift xcode sqlite imessage

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

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

我尝试过同样的图像文件但没有用。

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

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

    } catch {

    }

1 个答案:

答案 0 :(得分:1)

我认为这个问题与iMessage “app”的关系更为相关 - 这实际上是一个扩展,而不是真正的应用。没有初始VC,因此没有真正的Bundle.main

我的一个(可能很快就是一秒钟)应用程序有一个照片编辑扩展 - 基本上我一直称之为Apple应用程序的“shell连接”。你真的有一个“无所事事”的应用程序与他们的一个应用程序的连接,或者你有一个独立的应用程序分享与扩展名的代码。

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

您可以通过对Framework目标的需求来简化此操作。因人而异。基础是:

  • 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”更改为您对包标识符的内容。