在iOS 7.0 Simulator上以编程方式授予对NAB的访问权限

时间:2014-06-30 18:56:41

标签: ios ios7 ios-simulator abaddressbook xctest

是否可以通过编程方式授予iOS 7.0 Simulator上的本机地址簿(NAB)访问权限?我正在编写 xctest 单元测试,需要写入权限到NAB。单元测试在 iOS 7.0模拟器上运行,是持续集成过程的一部分,不涉及任何用户交互。

目前,除非用户通过“TestApp”明确授予访问权限想要访问您的联系人提醒,否则将拒绝访问NAB。

2 个答案:

答案 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表模式是: TCC.db schema

我们感兴趣的领域是:

  1. access - 权限类型
  2. service - 应用标识符
  3. client - 获得许可?
  4. 为了授予 Access Book 权限,应将相应的记录插入allowed表(如果已存在,则更新)。插入或更新记录后,表格应如下所示: access table after update

    我编写了以下方法来更新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