记录来自iOS企业应用程序的电话

Man*_*ere 1 privacy objective-c audio-recording ios swift

我正在编写一个应用程序来记录销售代表发出的电话并将其发送给经理,这样管理人员就可以密切有效地监控他的销售情况.

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

我认为Apple不会检查我的应用程序,因为它将是一个企业应用程序(我已经读过,企业应用程序没有App Store评论).虽然我不想参与第三方VoIP,但我很想知道如何继续这个方向作为一种选择.鉴于这种情况,越狱肯定不是一种选择.

Dur*_*n.H 5

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

由于您不打算在appstore中发布它,因此您可以使用私有API.

iPhone通话记录存储在"call_history.db"中,该位于以下路径:

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

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

现在我们知道了调用历史数据库路径和模式,我们可以看到我们对"调用"表感兴趣.感谢上面的链接,我们知道这个表中存储了什么:

现在我们应该编写一些代码来访问它.以下代码访问"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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

参考