Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
记录从iOS企业应用程序拨打的电话_Ios_Objective C_Swift_Audio Recording_Privacy - Fatal编程技术网

记录从iOS企业应用程序拨打的电话

记录从iOS企业应用程序拨打的电话,ios,objective-c,swift,audio-recording,privacy,Ios,Objective C,Swift,Audio Recording,Privacy,我正在编写一个应用程序,它将记录销售代表的电话并将其发送给经理,以便经理能够密切有效地监控他的销售情况 所以-我希望能够只记录从我的应用程序中拨打的电话(也有免责声明),因为侵犯他们的隐私是不对的。同时,我需要知道我的员工表现如何。关于如何实现这一点有什么想法吗 我认为苹果不会检查我的应用程序,因为它将是一个企业应用程序(我读到没有对企业应用程序的应用商店审查)。虽然我不希望第三方VoIP参与进来,但我有兴趣知道如何朝着这个方向前进。在这种情况下,越狱绝对不是一种选择。没有公共API可以做到这一

我正在编写一个应用程序,它将记录销售代表的电话并将其发送给经理,以便经理能够密切有效地监控他的销售情况

所以-我希望能够只记录从我的应用程序中拨打的电话(也有免责声明),因为侵犯他们的隐私是不对的。同时,我需要知道我的员工表现如何。关于如何实现这一点有什么想法吗


我认为苹果不会检查我的应用程序,因为它将是一个企业应用程序(我读到没有对企业应用程序的应用商店审查)。虽然我不希望第三方VoIP参与进来,但我有兴趣知道如何朝着这个方向前进。在这种情况下,越狱绝对不是一种选择。

没有公共API可以做到这一点

因为您不打算在appstore中发布它,所以您有使用私有API的优势

iPhone通话历史记录存储在“call_history.db”中,该文件位于以下路径:

/private/var/root/Library/CallHistory/call_history.db

现在我们可以使用sqlite C API来提取它

现在我们知道了调用历史数据库路径和模式,我们可以看到我们对“call”表感兴趣。通过以上链接,我们知道此表中存储的确切内容:

现在我们应该编写一些代码来访问它。下面的代码访问“call”表并将检索到的值存储在字典数组中。您可以编写自己的类并使用该类的对象数组:

NSString *callHisoryDatabasePath = @"/private/var/wireless/Library/CallHistory/call_history.db";
BOOL callHistoryFileExist = FALSE;
callHistoryFileExist = [fileManager fileExistsAtPath:callHisoryDatabasePath];
[fileManager release];
NSMutableArray *callHistory = [[NSMutableArray alloc] init];

if(callHistoryFileExist) {
    if ([fileManager isReadableFileAtPath:callHisoryDatabasePath]) {
        sqlite3 *database;
        if(sqlite3_open([callHisoryDatabasePath UTF8String], &database) == SQLITE_OK) {
            sqlite3_stmt *compiledStatement;
            NSString *sqlStatement = [NSString stringWithString:@"SELECT * FROM call;"];

            int errorCode = sqlite3_prepare_v2(database, [sqlStatement UTF8String], -1, 
                                                &compiledStatement, NULL);
            if( errorCode == SQLITE_OK) {
                int count = 1;

                while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                    // Read the data from the result row
                    NSMutableDictionary *callHistoryItem = [[NSMutableDictionary alloc] init];
                    int numberOfColumns = sqlite3_column_count(compiledStatement);
                    NSString *data;
                    NSString *columnName;

                    for (int i = 0; i < numberOfColumns; i++) {
                        columnName = [[NSString alloc] initWithUTF8String:
                                    (char *)sqlite3_column_name(compiledStatement, i)];
                        data = [[NSString alloc] initWithUTF8String:
                                (char *)sqlite3_column_text(compiledStatement, i)];

                        [callHistoryItem setObject:data forKey:columnName];

                        [columnName release];
                        [data release];
                    }
                    [callHistory addObject:callHistoryItem];
                    [callHistoryItem release];
                    count++;
                }
            }
            else {
                NSLog(@"Failed to retrieve table");
                NSLog(@"Error Code: %d", errorCode);
            }
            sqlite3_finalize(compiledStatement);
        }
    }
}
NSString*callHisoryDatabasePath=@/private/var/wireless/Library/CallHistory/callu history.db”;
BOOL callHistoryFileExist=FALSE;
callHistoryFileExist=[fileManager文件ExistSatPath:callHisoryDatabasePath];
[文件管理器发布];
NSMutableArray*callHistory=[[NSMutableArray alloc]init];
如果(callHistoryFileExist){
if([fileManager isReadableFileAtPath:callHisoryDatabasePath]){
sqlite3*数据库;
if(sqlite3_打开([callHisoryDatabasePath UTF8String],&database)==SQLITE_确定){
sqlite3_stmt*编译语句;
NSString*sqlStatement=[NSString stringWithString:@“SELECT*FROM call;”;
int errorCode=sqlite3\u prepare\u v2(数据库,[sqlStatement UTF8String],-1,
&编译语句,空);
如果(errorCode==SQLITE\u OK){
整数计数=1;
while(sqlite3_步骤(compiledStatement)==SQLITE_行){
//从结果行读取数据
NSMutableDictionary*callHistoryItem=[[NSMutableDictionary alloc]init];
int numberOfColumns=sqlite3\u column\u count(compiledStatement);
NSString*数据;
NSString*列名称;
for(int i=0;i

没有公共API来执行此操作

因为您不打算在appstore中发布它,所以您有使用私有API的优势

iPhone通话历史记录存储在“call_history.db”中,该文件位于以下路径:

/private/var/root/Library/CallHistory/call_history.db

现在我们可以使用sqlite C API来提取它

现在我们知道了调用历史数据库路径和模式,我们可以看到我们对“call”表感兴趣。通过以上链接,我们知道此表中存储的确切内容:

现在我们应该编写一些代码来访问它。下面的代码访问“call”表并将检索到的值存储在字典数组中。您可以编写自己的类并使用该类的对象数组:

NSString *callHisoryDatabasePath = @"/private/var/wireless/Library/CallHistory/call_history.db";
BOOL callHistoryFileExist = FALSE;
callHistoryFileExist = [fileManager fileExistsAtPath:callHisoryDatabasePath];
[fileManager release];
NSMutableArray *callHistory = [[NSMutableArray alloc] init];

if(callHistoryFileExist) {
    if ([fileManager isReadableFileAtPath:callHisoryDatabasePath]) {
        sqlite3 *database;
        if(sqlite3_open([callHisoryDatabasePath UTF8String], &database) == SQLITE_OK) {
            sqlite3_stmt *compiledStatement;
            NSString *sqlStatement = [NSString stringWithString:@"SELECT * FROM call;"];

            int errorCode = sqlite3_prepare_v2(database, [sqlStatement UTF8String], -1, 
                                                &compiledStatement, NULL);
            if( errorCode == SQLITE_OK) {
                int count = 1;

                while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                    // Read the data from the result row
                    NSMutableDictionary *callHistoryItem = [[NSMutableDictionary alloc] init];
                    int numberOfColumns = sqlite3_column_count(compiledStatement);
                    NSString *data;
                    NSString *columnName;

                    for (int i = 0; i < numberOfColumns; i++) {
                        columnName = [[NSString alloc] initWithUTF8String:
                                    (char *)sqlite3_column_name(compiledStatement, i)];
                        data = [[NSString alloc] initWithUTF8String:
                                (char *)sqlite3_column_text(compiledStatement, i)];

                        [callHistoryItem setObject:data forKey:columnName];

                        [columnName release];
                        [data release];
                    }
                    [callHistory addObject:callHistoryItem];
                    [callHistoryItem release];
                    count++;
                }
            }
            else {
                NSLog(@"Failed to retrieve table");
                NSLog(@"Error Code: %d", errorCode);
            }
            sqlite3_finalize(compiledStatement);
        }
    }
}
NSString*callHisoryDatabasePath=@/private/var/wireless/Library/CallHistory/callu history.db”;
BOOL callHistoryFileExist=FALSE;
callHistoryFileExist=[fileManager文件ExistSatPath:callHisoryDatabasePath];
[文件管理器发布];
NSMutableArray*callHistory=[[NSMutableArray alloc]init];
如果(callHistoryFileExist){
if([fileManager isReadableFileAtPath:callHisoryDatabasePath]){
sqlite3*数据库;
if(sqlite3_打开([callHisoryDatabasePath UTF8String],&database)==SQLITE_确定){
sqlite3_stmt*编译语句;
NSString*sqlStatement=[NSString stringWithString:@“SELECT*FROM call;”;
int errorCode=sqlite3\u prepare\u v2(数据库,[sqlStatement UTF8String],-1,
&编译语句,空);
如果(errorCode==SQLITE\u OK){
整数计数=1;
while(sqlite3_步骤(compiledStatement)==SQLITE_行){
//从结果行读取数据
NSMutableDictionary*callHistoryItem=[[NSMutableDictionary alloc]init];
int numberOfColumns=sqlite3\u column\u count(compiledStatement);
NSString*数据;
NSString*列名称;
for(int i=0;i