app应用运行中,自动监测手机通讯录的改变,达到同步更新

来源:互联网 发布:java ee jdk下载 编辑:程序博客网 时间:2024/05/17 07:29

我们app应用开发中,有时需要把手机通讯录中的信息同步到我们自己的app应用中。至于如何把手机通讯录中的信息写入到我们自己的应用中,通过iOS系统自带的ABAddressBookRef解析出来,放入到自己创建的sql数据库中。网上已有很多资料和demo,所以在这里就不再详细介绍。(如果各位感觉还是有此需求的话,可以后续加上。)

下面进入今天的主题--今天主要介绍手机通讯录同步到app中后,如果通讯录发生改变,如何让我们的app做到自动同步。

有些app的开发者,把通讯录的同步方法写在didFinishLaunchingWithOptions函数中,这样可以做到每次启动app时,就进行一次同步。但,此方法无法满足在app未杀死,只是进入后台,用户手动进行通讯录的修改的情况。也就是说,如果用户把我们的app进入后台,去修改通讯录,再次从后台打开app时,这种方法将不能做到适时同步。

也有些开发者,把通讯录的同步方法写在applicationDidBecomeActive函数中,这样确实可以做到适时同步,但我们需要考虑一下,性能问题。每次app从后台打开,不管用户的通讯录有没有改变,都进行同步,对我们自己的app性能消耗太大,也不是很好。

也有些开发者,考虑在app中,加一个定时器,固定的一段时间后,进行一次强制同步。这种方法,既不是适时,也无辜的或多或少的降低了我们的app的性能。

所以,这3种方法都不是很好。我们回头再查看下,iOS的系统的addressBook库中的方法。我们会发现一个ABAddressBookRegisterExternalChangeCallback方法。看名称就可看出意思是:注册通讯录是否改变的监听以及回调。所以,我们应用此方法,就可以达到自动适时同步通讯录的效果。

上代码:

- (void)applicationDidEnterBackground:(UIApplication *)application
{    
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    
    // 注册监听,监听通讯录是否发生变化 
    if (!_ntificationaddressbook) {
        _ntificationaddressbook = ABAddressBookCreateWithOptions(NULL, NULL);
    }
    ABAddressBookRegisterExternalChangeCallback(_ntificationaddressbook, MyAddressBookExternalChangeCallback, (__bridge void *)(self));    
    
}

- (void)applicationDidBecomeActive:(UIApplication *)application

{

    // 进入程序后,取消对本地通讯录的监听
    ABAddressBookUnregisterExternalChangeCallback(_ntificationaddressbook, MyAddressBookExternalChangeCallback, (__bridge void *)(self));

}

// 监听到通讯录发生改变时的回调事件
void MyAddressBookExternalChangeCallback (ABAddressBookRef ntificationaddressbook,CFDictionaryRef info,void *context)
{

}

0 0
原创粉丝点击