是否可以通过编程方式授予iOS 7.0 Simulator上的本机地址簿(NAB)访问权限?我正在编写 xctest 单元测试,需要写入权限到NAB。单元测试在 iOS 7.0模拟器上运行,是持续集成过程的一部分,不涉及任何用户交互。
目前,除非用户通过“TestApp”明确授予访问权限想要访问您的联系人提醒,否则将拒绝访问NAB。
答案 0 :(得分:7)
本着分享的精神,我将回答我自己的问题。在其他权限中,通讯簿访问权限存储在位于iPhone模拟器文件夹中TCC.db
的{{1}}数据库中。
/Library/TCC/
权限存储在TCC.db数据库的e.g. /Users/useriko/Library/Application Support/iPhone Simulator/7.1-64/Applications/[appGUID]/Library/TCC/TCC.db
表中。 access
表模式是:
我们感兴趣的领域是:
access
- 权限类型service
- 应用标识符client
- 获得许可?为了授予 Access Book 权限,应将相应的记录插入allowed
表(如果已存在,则更新)。插入或更新记录后,表格应如下所示:
我编写了以下方法来更新TCC.db数据库。
access
由于显而易见的原因,目标应与 libsqlite3.dylib 相关联。
请勿忘记将#import <sqlite3.h>
- (void)grantAccessBookAccess {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// tccDbPath: /Users/useriko/Library/Application Support/iPhone Simulator/7.1-64/Applications/FB8DF5E9-94B8-4CA9-A167-43AFE794B94E/Document
NSString *tccDbPath = nil;
tccDbPath = [[[[paths objectAtIndex:0]
stringByDeletingLastPathComponent] // remove Document
stringByDeletingLastPathComponent] // remove [appGUID]
stringByDeletingLastPathComponent]; // remove Applications
// tccDbPath: /Users/useriko/Library/Application Support/iPhone Simulator/7.1-64/
tccDbPath = [[[tccDbPath stringByAppendingPathComponent:@"Library"]
stringByAppendingPathComponent:@"TCC"]
stringByAppendingPathComponent:@"TCC.db"];
// tccDbPath: /Users/useriko/Library/Application Support/iPhone Simulator/7.1-64/Library/TCC/TCC.db
sqlite3 *database;
if(sqlite3_open([tccDbPath UTF8String], &database) != SQLITE_OK) {
NSLog(@"Error while opening database. %s", sqlite3_errmsg(database));
return;
}
NSString *updateSql = @"INSERT OR REPLACE INTO access (service, client, client_type, allowed, prompt_count) VALUES (\"kTCCServiceAddressBook\",\"com.your.app.id\",0,1,1);";
int rc;
char* errmsg;
const char *sql = [updateSql UTF8String];
rc = sqlite3_exec(database, sql, NULL, NULL, &errmsg);
if (rc != SQLITE_OK) {
NSLog(@"Error updating access table. %s", errmsg);
sqlite3_free(errmsg);
}
sqlite3_close(database);
}
中的应用标识符( com.your.app.id )更改为您的应用标识符。
答案 1 :(得分:1)
此Cocoapod非常适合测试目的:https://github.com/plu/JPSimulatorHacks