如何以快速方式将所有通讯簿内容发送到服务器

ant*_*ntf 3 iphone networking client-server addressbook ios

我正在编写一个应用程序,我需要将所有地址簿内容(即名称和数字)发送到服务器上,在服务器上进行交叉,以通知用户他的联系人中的哪些朋友在他们的设备上安装了此应用程序(类似于现今大多数通信应用程序的东西).我的问题不在于如何做到这一点的概念,我的问题在于客户端和服务器之间的速度和同步.

要从通讯簿中检索姓名和号码,我会做一个简单的循环并将答案存储在NSMutableArray如下:

for(CFIndex i=0; i< CFArrayGetCount(peopleMutable); i++)
{
    record = CFArrayGetValueAtIndex(peopleMutable, i);
    multi = ABRecordCopyValue(record, kABPersonPhoneProperty);

    //Contact ID
    contactID = (int)ABRecordGetRecordID(record);

    //Full Name
    fullName = [NSString stringWithFormat:@"%@ %@", (NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty), (NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty)];

    int multiCount = ABMultiValueGetCount(multi);
    for(CFIndex j=0; j<multiCount; j++)
    {
        number = (NSString *)ABMultiValueCopyValueAtIndex(multi, j);
        [arrayNamesToSend addObject:[NSString stringWithFormat:@"%u;%@;%@;", contactID, fullName, number];];
    }
}
Run Code Online (Sandbox Code Playgroud)

那么这个循环在大约一秒钟内完成(即使你有超过1000个接触,最多2秒).让我们来谈谈一个普通的案例:平均而言,地址簿中可能有500个名字,每个名字平均长度为15个字符,每个电话号码平均为15个字符(国际格式),因此这导致一共有15,000个字符要发送到服务器.根据我在客户端服务器编程方面的谦虚知识,不建议在一条消息中从客户端向服务器发送大量字节,建议的大小在每条消息的1024到4096字节之间.

现在我如何将这些联系人发送到服务器?我想到了:

  1. 无法一次性发送所有15,000个字符
  2. 逐个发送(我的意思是通过联系人联系)是一个非常缓慢的选择,或者我可以说不是一个现实的选择
  3. 将整个数组划分为2,000字节的块(这就是我所做的)并将它们发送到服务器.理论上这很有效,但是当我尝试它时,我遇到了一个问题.从iPhone向服务器发送2,000个字节非常快,但在数据库中保存收到的2,000个字节在服务器上大约需要3秒钟,这导致服务器丢失客户端发送的后续联系人保存.

有关如何解决此问题的任何建议?有没有办法将整个通讯簿作为一个文件上传到服务器,然后服务器将解决它并完成其工作?提前谢谢了.

Lil*_*ard 9

这是一个非常糟糕的想法.您通过向服务器发送通讯簿数据来违反各种隐私问题.而且,你不需要它.你应该做的是散列你关心的所有数据(使用像SHA1这样的东西,或者为了安全起见HMAC)并将散列发送到服务器.您可以使用哈希值进行比较,就像使用原始数据一样,但这样您就不会将实际的个人数据发送到服务器时存在严重的隐私问题.


无论如何,您的实际问题是将大量数据发送到服务器.我认为你的担忧是没有道理的.将所有数据作为一条"消息"发送有什么问题?听起来你只有15kB左右的数据.那真的不是那么大.如果您要将单个图像发送到服务器,那么您将超过该大小.

  • @antf:听起来Viber正在抓地址簿.因此,我将*永远*考虑使用该应用程序.这是一种可怕的隐私侵犯,其他应用程序在过去做得很糟糕.我强烈建议不要追随他们的领导. (4认同)
  • 哈哈哈,我同意你的意见,但现在你可以理解为什么我在想你所谓的"非常糟糕的主意":)我只是在寻找其他人所做的事情(阅读他们发布的隐私,他们说他们甚至记录你的电话).我想我会按照自己的方式生产出具有良好标准的专业产品. (2认同)