XCode9-beta:函数'sqlite3_key'的隐式声明

D4t*_*aya 2 sqlite ios xcode9-beta

我在使用EncryptedStore SQLCipher包装器来加密核心数据时遇到问题.
我为此添加了C标志:

Debug = -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE -DSQLCIPHER_CRYPTO_CC
Release = -DSQLITE_HAS_CODEC -DNDEBUG -DSQLITE_OS_UNIX=1 -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE -DSQLCIPHER_CRYPTO_CC
Run Code Online (Sandbox Code Playgroud)

并用它作为:

func encryptedCoordinator() -> NSPersistentStoreCoordinator {
  var coordinator:NSPersistentStoreCoordinator?
  let ops:[String : Any] =    [NSMigratePersistentStoresAutomaticallyOption:(true),                                              NSInferMappingModelAutomaticallyOption:(true), EncryptedStorePassphraseKey:sqlCipherKey, EncryptedStoreDatabaseLocation:self.sqliteFileURL()]

  do {
      coordinator = try EncryptedStore.make(options: ops, managedObjectModel: self.managedObjectModel, error: ())
    }catch {
      fatalError("Error opening encrypted DB: \(error)")
    }
    return coordinator!
  }
Run Code Online (Sandbox Code Playgroud)

它在XCode8中运行良好,但它在XCode9-beta中出错.
错误行:

- (BOOL)changeDatabasePassphrase:(NSString *)passphrase error:(NSError *__autoreleasing*)error {
  BOOL result;
  int status;
  if ([passphrase length] > 0) {
    // Password provided, use it to key the DB
    const char *string = [passphrase UTF8String];
    status = sqlite3_rekey(database, string, (int)strlen(string));//ERROR line
    string = NULL;
    passphrase = nil;
  } else {
    // No password
    status = SQLITE_OK;
  }
  result = status == SQLITE_OK;
  if (result) {
    result = [self checkDatabaseStatusWithError:error];
  }
return result && (*error == nil);
}
Run Code Online (Sandbox Code Playgroud)

函数声明EncryptedStroe/sqlite3.h为:

SQLITE_API int sqlite3_rekey(
sqlite3 *db,                   /* Database to be rekeyed */
  const void *pKey, int nKey     /* The new key */
);
SQLITE_API int sqlite3_rekey_v2(
  sqlite3 *db,                   /* Database to be rekeyed */
  const char *zDbName,           /* Name of the database */
  const void *pKey, int nKey     /* The new key */
);
Run Code Online (Sandbox Code Playgroud)

小智 9

我认为问题是导入EncryptedStore.m文件: #import <sqlite3.h>

它使用<>所以导入了系统sqlite库,它不包含这些函数.通过改变<> with"",一切都很好.


小智 5

发现了另一个解决方案在这里.

主要更改标题搜索路径.
尝试将其从更改$(PROJECT_DIR)/sqlcipher/src
$(PROJECT_DIR)/sqlcipher
(即/src从路径中移除)."对我来说是诀窍.