XCode9-beta: неявное объявление функции sqlite3_key

У меня проблема с оболочкой 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

И использовал его как:

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!
  }

Он работает нормально в 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);
}

Функция объявлена ​​в 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 */
);

person D4ttatraya    schedule 06.06.2017    source источник
comment
Я решил эту проблему, обновив класс EncryptedStore с GitHub   -  person D4ttatraya    schedule 11.09.2017


Ответы (2)


Я думаю, проблема в том, что импортируемый файл EncryptedStore.m делает: #import <sqlite3.h>

Он использует ‹>, поэтому импортируется системная библиотека sqlite, которая не включает эти функции. При изменении ‹> на" "все компилируется нормально.

person Ignacio Delgado    schedule 07.06.2017
comment
Хорошо поймал! дай мне проверить - person D4ttatraya; 07.06.2017

Нашел другое решение здесь.

В основном изменение путей поиска заголовков.
Попробуйте изменить его с $(PROJECT_DIR)/sqlcipher/src
на $(PROJECT_DIR)/sqlcipher
(т. Е. Удалить /src из пути). "У меня получилось.

person CharlieReed    schedule 11.09.2017
comment
Это полезно, если мы используем CocoaPods для импорта библиотеки. - person D4ttatraya; 11.09.2017
comment
дополнительно, убедитесь, что строка соответствует папке - person Kernelzero; 18.10.2018