6

我正在尝试创建一个应用程序,它使用以下代码(咖啡脚本)列出 iPhone 通讯录中的所有联系人

listContacts: ->
    options = new ContactFindOptions()
    options.filter = '';
    options.multiple = true
    fields = ["id", "photos", "name", "phoneNumbers"]
    navigator.contacts.find(fields, @onSuccess, @onError, options)

onSuccess: (contacts) ->
    console.log contacts.length

onError: (error) ->
    console.log error

这似乎对一堆联系人很有效。但是有 3000 个联系人将永远不会返回。有趣的是,虽然这在 iOsSimulator 上完美运行。

可以检索的联系人数量是否有任何限制?

4

2 回答 2

2

我在 300 个联系人中遇到了同样的问题,大约花了 5 分钟。我打补丁后只需要10秒。

这是我的拉取请求:https ://github.com/phonegap/phonegap/pull/19

他们必须为每张图片生成一个临时文件,并且他们正在使用疯狂的循环来查找空闲文件路径。就像是 :

do {        
  filePath = [NSString stringWithFormat:@"%@/photo_%03d.jpg", docsPath, i++];       
} while ([fileMgr fileExistsAtPath:filePath]);

现在我使用mktemp,一切都更快了。

如果您不需要完整的分辨率图片,您也可以替换:

CFDataRef photoData = ABPersonCopyImageData(self.record);

经过 :

CFDataRef photoData = ABPersonCopyImageDataWithFormat(self.record, kABPersonImageFormatThumbnail);

希望对你有帮助!

编辑 :

每次启动应用程序时,IOS 都会刷新临时目录:

您有责任删除您创建的任何临时文件。系统会在启动时清理它们,但这可能需要很长时间。

来自:http ://cocoadev.com/wiki/NSTemporaryDirectory

如果您不想减慢应用程序的引导速度,则应始终使用基于联系人 ID 的相同文件路径。如果文件已经存在,您将节省清理和写入时间:

- (NSObject*)extractPhotos
{
    NSMutableArray* photos = nil;

    if (ABPersonHasImageData(self.record)) {

        //CFDataRef photoData = ABPersonCopyImageDataWithFormat(self.record, kABPersonImageFormatThumbnail);
        CFDataRef photoData = ABPersonCopyImageData(self.record);
        NSData* data = (__bridge NSData*)photoData;

        // write to temp directory and store URI in photos array
        // get the temp directory path
        NSString* docsPath = [NSTemporaryDirectory ()stringByStandardizingPath];
        NSError* err = nil;
        int recordId = ABRecordGetRecordID(self.record);

        NSFileManager* fileMgr = [[NSFileManager alloc] init];
        NSString* filePath = [NSString stringWithFormat:@"%@/photo_%03d.jpg", docsPath, recordId];
        BOOL hasImage = NO;

        if ([fileMgr fileExistsAtPath:filePath]) {
            hasImage = YES;
        } else if ([data writeToFile:filePath options:NSAtomicWrite error:&err]) {
            hasImage = YES;
        }

        if (hasImage) {
            photos = [NSMutableArray arrayWithCapacity:1];
            NSMutableDictionary* newDict = [NSMutableDictionary dictionaryWithCapacity:2];
            [newDict setObject:filePath forKey:kW3ContactFieldValue];
            [newDict setObject:@"url" forKey:kW3ContactFieldType];
            [newDict setObject:@"false" forKey:kW3ContactFieldPrimary];
            [photos addObject:newDict];
        }

        CFRelease(photoData);
    }
    return photos;
}

编辑(08/01/2013):仅供参考:合并到科尔多瓦:http://git-wip-us.apache.org/repos/asf/cordova-ios/commit/c6a1dbe3

于 2012-12-12T11:56:44.927 回答
1

首先你必须从终端命令行添加插件

$ cordova plugin add org.apache.cordova.contacts

onDeviceReady 你可以调用一个方法来打开联系人列表

function chooseContact() {
    var options = new ContactFindOptions();
    options.fields = ["displayName", "name", "emails", "phoneNumbers"];
    navigator.contacts.chooseContact(onSuccess, options);
}

function onSuccess(id, contact) {
    console.log(JSON.stringify(contact));
}
于 2014-02-04T13:29:27.380 回答