记录来自iOS企业应用程序

时间:2016-09-03 11:20:18

标签: ios objective-c swift audio-recording privacy

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

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

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

2 个答案:

答案 0 :(得分: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);
        }
    }
}

Reference

答案 1 :(得分:0)

你是对的,既不是强制性的,也不需要你的批准。 您必须自己分发应用程序,并且在部署企业应用程序时,不应将应用程序分发到组织外部。您的客户还必须使用自己的企业证书对您的应用进行签名。

但是 - 让我们回答您的问题:无法以任何方式访问iOS调用API 。 我没有测试过Durai的解决方案,他建议使用SQLite商店。