【100%宗教活动干货】运营常用必备工具神器集合

通信录简介

通信录使用处境:

  1. 电商类的 App,设置收货人电话号码。
  2. 即时通信类 App,添加手机联系人好友。

通信录获取方案:

一、iOS 9 之前的通信录框架

  1. AddressBookUI.framework 框架

    1. 提供了联系人列表界面、联系人详情界面、添加联系人界面等。
    2. 一般用于选取联系人。
  2. AddressBook.framework 框架

    1. 纯 C 语言的 API,仅仅是得到联系人数据。
    2. 没有提供 UI 界面浮现,要求团结搭建沟通人显得界面。
    3. 里面的数据类型大部分依据 Core Foundation
      框架,使用起来炒鸡复杂。

二、 iOS 9 今后最新通信录框架

  1. ContactsUI.framework 框架。

    • 拥有 AddressBookUI.framework
      框架的兼具机能,使用起来尤其的面向对象。
  2. Contacts.framework 框架。

    • 拥有 AddressBook.framework 框架的所有机能,不再是 C 语言的
      API,使用起来相当简单。

俗话说“欲善其功
必先利其器”,特别是就是运营工作人士对此一定都深有感触。运营工作涉及面较广,事情多而杂,所以把现有的营业相关工具丰盛利用起来,往往可以一矢双穿,且起到救助效用。本文跟我们享用下本人个人经常运营工作中常用到的工具应用,我们可以互补分享哦。废话不多说,上干货~

iOS 9 以前的通信录框架

一、内容排版工具

1.i 排版

微信公众号图文新闻排版工具,辅助种种富文本样式格式

2.秀米

秀米是一款基于微信公众平台的图文编辑和排版工具,它比微信自带的编辑器多了许多排版作用和美化工具。在秀米元帅内容编排排版之后,直接复制粘贴到群众号后台即可。

3.壹伴公众号小插件

对群众号后台进行抓好,已毕一键传图、公众号内排版、本地传图等。

AddressBookUI

二、美工设计、图片资源、处理、管理工具

1.昵图网

昵图网是一家享誉的图片素材共享平台,网站上的有所素材图片均由网友上传共享的,你上传共享的图样更加多,你能下载的图片也就更多。当然也有免费和付费的。

2.千库网

千库网是国内首家专注提供免抠PNG图片的资料网站。免费下载有限制,更加多下载须要付费哦~

上边两家即使有付费服务,但价格上还算能承受。上边分享两个免费、无版权的图样资源下载站。

3.pixabay

Pixabay约有910000张免费的肖像、矢量文件和章程插图。图片覆盖面广,文件也有很多尺寸可以采用。图片质量高,我首推的图片素材网站。里面的图样可以复制、修改、转载等措施选拔,甚至作为商业用途,无需申请许可,也无需付出版税。

4.SplitShire

SplitShire网站的图片品质也很高,大都比较feel风。

5.photoshop

其一就不需要本身过多介绍了,威名赫赫的图片处理软件。

6.AI

可能有的小伙伴并不常用AI,多用PS。那几个看现实须要呢,寻常矢量图处理用AI,像素图处理用PS。日常做运动海报、宣传图等一般二者匹配使用。

7.Ulead GIF
Animator

UGA是用来创立、处理gif动态图的,有时须求在软文中插入个搞笑有趣的gif动态图笔者就用它。

8.Eagle

Eagle是一个正式的图片管理软件,更优雅的盘整图片素材与统筹灵感,试用+付费的,不过价格还算可以。那一个特别符合设前端设计师等常和图表打交道的童鞋,作为运营谈不上必不可少,感兴趣的可以试行。

贯彻步骤

一、成立拔取联系人的控制器

// 创建联系人选择控制器    
ABPeoplePickerNavigationController *pvc = [[ABPeoplePickerNavigationController alloc] init];

二、设置代理(用来接纳用户挑选的联络人消息)

// 设置代理
pvc.peoplePickerDelegate = self;

三、弹出联系人控制器

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
{
   ABAddressBookRef bookRef = ABAddressBookCreate();
   ABAddressBookRequestAccessWithCompletion(bookRef, ^(bool granted, CFErrorRef error) {
       if (granted)
       {
           NSLog(@"授权成功!");
           [self presentViewController:pvc animated:YES completion:nil];
       }
       else
       {
           NSLog(@"授权失败!");
       }
   });
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
{
   [self presentViewController:pvc animated:YES completion:nil];
}

四、完毕代理方法

// 选择某个联系人时调用
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person
{
    NSLog(@"选中联系人");
    CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
    CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);

    NSString *fir = CFBridgingRelease(firstName);
    NSString *las = CFBridgingRelease(lastName);

    NSLog(@"%@---%@", fir, las);

    ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
    CFIndex count = ABMultiValueGetCount(multi);
    for (int i = 0; i  < count; i++) 
    {
        NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(multi, i);
        NSString *phone =(__bridge_transfer NSString *)  ABMultiValueCopyValueAtIndex(multi, i);
        NSLog(@"%@---%@", label, phone);
    }
}

Core Foundation 对象手动管理内存,即便是 Create、Copy、Retain
等字样创立的对象,必要手动 CFRelease。类似 Objective-C 的 MRC。

拓展:__bridge__bridge_retained__bridge_transfer
两个转移关键字的界别。

  1. __bridge 只做类型转换,可是不改动对象(内存)管理权;
  2. __bridge_retained(也得以选拔CFBridgingRetain)将 Objective-C
    的目的转换为 Core Foundation
    的目的,同时将对象(内存)的管理权交给我们,后续必要使用 CFRelease
    或许连带措施来刑释解教对象;
  3. __bridge_transfer(也得以使用 CFBridgingRelease )将 Core
    Foundation 的对象转换为 Objective-C
    的目的,同时将目的(内存)的管理权交给 ARC。

五、在相应的代办方法中取得联系人音信

// 1.选择联系人时使用(不展开详情)
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;

// 2.选择联系人某个属性时调用(展开详情)
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier;

// 3.取消选中联系人时调用
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker;

留意:选拔联系人的不举行详情(代理方法1)和进行详情(代理方法2)的代理方法都写了的时候,展开详情的代办方法就不履行。

三、思维导图工具

1.freemind

首推freemind是因为它是完全免费的。即使界面效果上可能不如前边要引进的花哨雅观,但作用上着力能满意大家的常用要求了。

2.Xmind

XMind以其卓绝的易用性,友好的界面和有力的功效吸引了好多用户。

3.百度脑图

百度脑图也是一款便捷的脑图编辑工具,操作简易。支持在线一贯开立、保存并享受你的思绪。免安装云存储易分享心得舒适效率丰盛.。

AddressBook

一、请求授权

从 iOS 6
先导,须要得到用户的授权才能访问通信录,因而在行使从前,须求检查用户是还是不是业已授权。

// 获得通讯录的授权状态
ABAddressBookGetAuthorizationStatus()

授权情形

  1. 用户还未曾控制是或不是授权你的先后进行访问:kABAuthorizationStatusNotDetermined

  2. iOS
    设备上有些准许配置阻止程序与通信录数据库举行互动:kABAuthorizationStatusRestricted

  3. 用户分明的不容了你的先后对通信录的走访:kABAuthorizationStatusDenied

  4. 用户已经授权给您的次第对通信录举行走访:kABAuthorizationStatusAuthorized

// 判断当前的授权状态是否是用户还未选择的状态
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) 
{
   ABAddressBookRef bookRef = ABAddressBookCreate();
   ABAddressBookRequestAccessWithCompletion(bookRef, ^(bool granted, CFErrorRef error) {
       if (granted) 
       {
           NSLog(@"授权成功!");
       }
       else
       {
           NSLog(@"授权失败!");
       }
   });
}

二、判断授权情状

万一已授权,则持续;未授权,则指示用户,并重返。

// 判断当前的授权状态
if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) 
{
    NSLog(@"您的通讯录暂未允许访问,请去设置->隐私里面授权!");
    return;
}

三、创建通信录对象

// 创建通讯录对象
ABAddressBookRef bookRef = ABAddressBookCreate();

四、从通讯录对象中, 获取具有的联络人

// 获取通讯录中所有的联系人
CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeople(bookRef);

五、遍历所有的联系人

// 遍历所有联系人
CFIndex count = CFArrayGetCount(arrayRef);
for (int i = 0; i < count; i++) 
{
   ABRecordRef record = CFArrayGetValueAtIndex(arrayRef, i);

   // 获取姓名
   NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty);
   NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty);
   NSLog(@"firstName = %@, lastName = %@", firstName, lastName);

   // 获取电话号码
   ABMultiValueRef multiValue = ABRecordCopyValue(record, kABPersonPhoneProperty);
   CFIndex count = ABMultiValueGetCount(multiValue);
   for (int i = 0; i < count; i ++) 
   {
       NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(multiValue, i);
       NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(multiValue, i);
       NSLog(@"label = %@, phone = %@", label, phone);
   }

   CFRelease(multiValue);
}

六、释放不再选拔的靶子

CFRelease(bookRef);
CFRelease(arrayRef);

四、原型设计工具

Axure

Axure是一个正式的飞跃原型设计工具,让负责定义要求和规格、设计功效和界面的专家能够飞快创设应用软件或Web网站的线框图、流程图、原型和规范表达文档。可是Axure平常产品经营用的可比多,作为运营,小编日常是在做产品分析优化方案依旧做图时会用到它。

联络人属性定义

负有的性质常量值都定义在了 ABPerson.h 头文件中。

关系人属性包含以下种类:

  1. 差不离属性:姓、名等
  2. 多重属性:电话号码、电子邮件等
  3. 重组属性:地址等

注意:使用 ABRecordCopyValue 可以从一条 Person
记录中获获得相应的笔录,不过后续处理则必要依照记录的切实可行项目加以区分。

五、待办、职责管理工具

然之一起

实际那原来是一款公司办公一头软件,小编个人用它来做时间、待办、职分管理。因为运营工作事多且杂,不记待办大概回头就忘了。你还在用便利贴?!太OUT了~

高效Todo

以此软件的界面设计都以选择直观的四象限设计,这样的陈设可以让用户一目精晓的接头怎么工作是急迫必要处理的。

概括属性

一个沟通人就是一个
ABRecordRef,每一种联系人都有协调的品质,比如名字、电话、邮件等。
使用 ABRecordCopyValue 函数能够从 ABRecordRef
中拿到联系人的简易属性(例如:一个字符串)。
ABRecordCopyValue 函数接收 2 个参数。
第 1 个参数是 ABRecordRef 实例。
第 2 个参数是性质关键字,定义在 ABPerson.h 中。
ABPersonCopyLocalizedPropertyName
函数可以依照指定的显要字获取相应的价签文本。

六、数据解析工具

1.百度总结

那么些是境内站点必然要用的站点总计工具,跟踪站点相关数据。

2.Google
Analytics

谷歌分析工具(GA),尤其是面向海外SEO的站点,这些也是必用工具哦。

3.office三剑客——word、excel、PowerPoint

想必有些小伙伴觉得那仨上不断桌面,那不是最大旨的么。而事实恰恰就是那一个类似接触时间最长最不起眼的软件,很多运营人士都驾驶不了,仅停留在外表。特别是Excel,基本的多少透视表制作、每月每年的报表制作都会用到。

得到所有的关联人数量

// 获取所有联系人记录
CFArrayRef array = ABAddressBookCopyArrayOfAllPeople(addressBook);
NSInteger count = CFArrayGetCount(array);

for (NSInteger i = 0; i < count; ++i) {
    // 取出一条记录
    ABRecordRef person = CFArrayGetValueAtIndex(array, i);

    // 取出个人记录中的详细信息
    // 名
    CFStringRef firstNameLabel = ABPersonCopyLocalizedPropertyName(kABPersonFirstNameProperty);
    CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
    CFStringRef lastNameLabel = ABPersonCopyLocalizedPropertyName(kABPersonLastNameProperty);
    // 姓
    CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);

    NSLog(@"%@ %@ - %@ %@", lastNameLabel, lastName, firstNameLabel, firstName);
}

小结

本文和豪门一块儿分享运营工作中常用的工具软件,要是大家还有其余的好工具,欢迎一起享用交流。

CoreFoundation 与 Foundation之间的桥接

// 1. 获取通讯录引用
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, nil);
// 2. 获取所有联系人记录
NSArray *array = (__bridge NSArray *)(ABAddressBookCopyArrayOfAllPeople(addressBook));
for (NSInteger i = 0; i < array.count; i++) {
    // 取出一条记录
    ABRecordRef person = (__bridge ABRecordRef)(array[i]);
    // 取出个人记录中的详细信息
    NSString *firstNameLabel = (__bridge NSString *)(ABPersonCopyLocalizedPropertyName(kABPersonFirstNameProperty));
    NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
    NSString *lastNameLabel = (__bridge NSString *)(ABPersonCopyLocalizedPropertyName(kABPersonLastNameProperty));
    NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
    NSLog(@"%@ %@ - %@ %@", lastNameLabel, lastName, firstNameLabel, firstName);
}
CFRelease(addressBook);

多重属性

联系人的有点属性值就没这么不难,一个特性大概会蕴藏五个值
比如说邮箱,分为工作邮箱、住宅信箱、其余邮箱等
比如电话,分为工作电话、住宅电话、其他电话等
比方是繁体属性,那么 ABRecordCopyValue 函数重返的就是
ABMultiValueRef 类型的数额,例如邮箱恐怕电话

// 取电话号码
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
// 取记录数量
NSInteger phoneCount = ABMultiValueGetCount(phones);
// 遍历所有的电话号码
for (NSInteger i = 0; i < phoneCount; i++) 
{

}

赢得复杂属性的法门

// 电话标签
CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phones, i);
// 本地化电话标签
CFStringRef phoneLocalLabel = ABAddressBookCopyLocalizedLabel(phoneLabel);
// 电话号码
CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phones, i);

丰盛联络人的步调

累加关系人的手续:

  1. 通过 ABPersonCreate 函数创立一个新的联系人(重回 ABRecordRef)。
  2. 通过 ABRecordSetValue 函数设置联系人的天性。
  3. 通过 ABAddressBookAddRecord 函数将关联人添加到通信录数据库中。
  4. 通过 ABAddressBookSave 函数保存刚才所作的改动。

能够通过 ABAddressBookHasUnsavedChanges 函数判断是不是有未保存的改动
当控制是还是不是改变通信录数据库后,你可以分别使用 AbAddressBookSave
ABAddressBookRevert 方式来保存或扬弃更改 。

丰硕群组的步调

累加群组的手续大体和增进联络官一致:

  1. 通过 ABPersonCreate 函数创立一个新的组。(再次回到 ABRecordRef
  2. 通过 ABRecordSetValue 函数设置组名。
  3. 通过 ABAddressBookAddRecord 函数将组添加到通信录数据库中。
  4. 通过 ABAddressBookSave 函数保存刚才所作的改动。

操作联系人的头像

想操作联系人的头像,有以下函数
BPersonHasImageData
判断通信录中的联络员是不是有图表

ABPersonCopyImageData
取得图片数据(要是有些话)

ABPersonSetImageData
安装联系人的图样数据

通信录的修改回调

// 创建通讯录
self.addressBook = ABAddressBookCreate();  
// 注册通知  
ABAddressBookRegisterExternalChangeCallback(self.addressBook, _addressBookChange, nil);            

// 处理收到通知的 Action
void _addressBookChange(ABAddressBookRef addressBook, CFDictionaryRef info, void *context)
{
}

- (void)dealloc
{
    // 注销通知
    ABAddressBookUnregisterExternalChangeCallback(self.addressBook, _addressBookChange, nil);
    // 释放对象
    CFRelease(self.addressBook);
}

iOS 9 将来的报导录新框架

iOS 9 从前操作通信录仍旧相比较麻烦的,iOS 9
未来苹果推出了崭新的通信录框架,使用起来更为的面向对象。

CNContactUI

完结步骤

一、创立选拔联系人的控制器

// 创建联系人选择控制器    
CNMutableContact *contact = [[CNMutableContact alloc] init];
CNLabeledValue *labelValue = [CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberMobile
ontact.phoneNumbers = @[labelValue];                                                                     value:[CNPhoneNumber phoneNumberWithStringValue:phoneNum]];
CNContactViewController *contactController = [CNContactViewController viewControllerForNewContact:contact];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:contactController];

二、设置代理(用来接过用户选用的沟通人消息)

// 设置代理
contactController.delegate = self;

三、弹出联系人控制器

[controller presentViewController:nav animated:YES completion:nil];

四、已毕代理方法

// 选择某个联系人时调用
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty
{
    CNContact *contact = contactProperty.contact;
    NSString *name = [CNContactFormatter stringFromContact:contact style:CNContactFormatterStyleFullName];
    CNPhoneNumber *phoneValue= contactProperty.value;
    NSString *phoneNumber = phoneValue.stringValue;
    NSLog(@"%@--%@",name, phoneNumber);
}

五、在对应的代理方法中获取联系人音讯

// 1.选择联系人时使用(不展开详情)
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;

// 2.选择联系人某个属性时调用(展开详情)
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;

// 3.取消选中联系人时调用
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;

瞩目:与 AddressBookUI
一样,拔取联系人的不举办详情(代理方法1)和进展详情(代理方法2)的代理方法都写了的时候,展开详情的代办方法就不举办。

CNContact

达成步骤

一、请求授权

// 获得通讯录的授权状态
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]

授权意况

  1. 用户还平昔不控制是或不是授权你的次第进行访问:CNAuthorizationStatusNotDetermined

  2. iOS
    设备上有的特许配置阻止程序与通信录数据库举办互动:CNAuthorizationStatusRestricted

  3. 用户明确的不容了您的程序对通信录的拜会:CNAuthorizationStatusDenied

  4. 用户已经授权给你的先后对通信录举行走访:CNAuthorizationStatusAuthorized

// 判断当前的授权状态是否是用户还未选择的状态
if (status == CNAuthorizationStatusNotDetermined)
{
    CNContactStore *store = [CNContactStore new];
    [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (granted) 
        {
            NSLog(@"授权成功!");
        }
        else
        {
            NSLog(@"授权失败!");
        }
    }];
}

二、判断授权景况

要是已授权,则继续;未授权,则提醒用户,并赶回。

// 判断当前的授权状态
if (status != CNAuthorizationStatusAuthorized) 
{
    NSLog(@"您的通讯录暂未允许访问,请去设置->隐私里面授权!");
    return;
}

三、创立通信录对象

// 创建通讯录对象
CNContactStore *contactStore = [CNContactStore new];

四、设置访问的品质 Key,各个 Key 对应一脾性能,iOS 9
新增,如若没有安装,访问该属性就会崩溃。

// 姓名前缀
CNContactNamePrefixKey     
// 名                 
CNContactGivenNameKey                       
// 中间名
CNContactMiddleNameKey  
// 姓                   
CNContactFamilyNameKey            
// 婚前姓         
CNContactPreviousFamilyNameKey
// 姓名后缀
CNContactNameSuffixKey   
// 昵称                   
CNContactNicknameKey                        
// 公司
CNContactOrganizationNameKey                
// 部门
CNContactDepartmentNameKey                  
// 职位
CNContactJobTitleKey                        
// 名字拼音或音标
CNContactPhoneticGivenNameKey
// 中间名拼音或音标              
CNContactPhoneticMiddleNameKey
// 姓拼音或音标
CNContactPhoneticFamilyNameKey  
// 公司拼音或音标            
CNContactPhoneticOrganizationNameKey      
// 生日  
CNContactBirthdayKey   
// 农历                    
CNContactNonGregorianBirthdayKey    
// 备注        
CNContactNoteKey                            
// 图片
CNContactImageDataKey                       
// 缩略图
CNContactThumbnailImageDataKey              
// 图片是否允许访问
CNContactImageDataAvailableKey              
// 类型
CNContactTypeKey                            
// 号码
CNContactPhoneNumbersKey                    
// 电子邮件
CNContactEmailAddressesKey                  
// 地址
CNContactPostalAddressesKey                 
// 日期
CNContactDatesKey   
// URL                        
CNContactUrlAddressesKey                    
// 关联人
CNContactRelationsKey                       
// 社交
CNContactSocialProfilesKey                  
// 即时通讯
CNContactInstantMessageAddressesKey         

NSArray *keys = @[CNContactPhoneNumbersKey,CNContactGivenNameKey];

五、从通讯录对象中, 获取具有的联系人,并遍历

// 获取通讯录中所有的联系人
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys];

[contactStore enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
    // 获取姓名
    NSString *firstName = contact.familyName;
    NSString *lastName = contact.givenName;

    NSLog(@"%@--%@",firstName,lastName);

    // 获取电话号码

    for (CNLabeledValue *labeledValue in contact.phoneNumbers)
    {
         CNPhoneNumber *phoneValue = labeledValue.value;
         NSString *phoneNumber = phoneValue.stringValue;
         NSString *label = [CNLabeledValue localizedStringForLabel:labeledValue.label];
         NSLog(@"%@--%@",label,phoneNumber);
    }

}];

通信录的改动回调

// 注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_contactStoreDidChange) name:CNContactStoreDidChangeNotification object:nil]            

// 处理收到通知的 Action
- (void)_contactStoreDidChange
{
}

- (void)dealloc
{   
    // 注销通知
    [[NSNotificationCenter defaultCenter] removeObserver:self name:CNContactStoreDidChangeNotification object:nil];
}

当 App
活跃(前台+后台活动期间)的时候,当通信录修改的时候,会收到文告
当 App 不活跃的时候(挂起的时候),App 收不到文告;而是,当 App
到前台的时候接到延迟的打招呼。

LJContactManager

介绍

LJContanctManager 是本人写的一款操作通信录的类库,iOS 9 以前运用的是
AddressBook 和 AddressBookUI 系统库,iOS 9 之后选择苹果新推出的 Contacts
和 ContactsUI 框架。

安装

CocoaPods

  1. 在 Podfile 中添加 pod 'LJContactManager'
  2. 执行 pod installpod update
  3. 导入 <LJContactManager.h>。

手动安装

  1. 下载 LJContactManager 文件夹内的具有情节。
  2. 将 LJContactManager 内的源文件添加(拖放)到你的工程。
  3. 导入 LJContactManager.h

使用

第一提供以下的艺术:

  • 分选联系人

/**
 选择联系人

 @param controller 控制器
 @param completcion 回调
 */
- (void)selectContactAtController:(UIViewController *)controller
                      complection:(void (^)(NSString *name, NSString *phone))completcion;
  • 始建新关系人

/**
 创建新联系人

 @param phoneNum 手机号
 @param controller 当前 Controller
 */
- (void)createNewContactWithPhoneNum:(NSString *)phoneNum controller:(UIViewController *)controller;
  • 累加到存活联系人

/**
 添加到现有联系人

 @param phoneNum 手机号
 @param controller 当前 Controller
 */
- (void)addToExistingContactsWithPhoneNum:(NSString *)phoneNum controller:(UIViewController *)controller;
  • 得到联系人列表(未分组的通信录)

/**
 获取联系人列表(未分组的通讯录)

 @param completcion 回调
 */
- (void)accessContactsComplection:(void (^)(BOOL succeed, NSArray <LJPerson *> *contacts))completcion;
  • 获取联系人列表(已分组的通信录)

/**
 获取联系人列表(已分组的通讯录)

 @param completcion 回调
 */
- (void)accessSectionContactsComplection:(void (^)(BOOL succeed, NSArray <LJSectionPerson *> *contacts, NSArray <NSString *> *keys))completcion;
  • 简报录变更回调(未分组的通信录)

/**
 通讯录变更回调(未分组的通讯录)
 */
@property (nonatomic, copy) void (^contactsChangeHanlder) (BOOL succeed, NSArray <LJPerson *> *newContacts);
  • 报纸宣布录变更回调(已分组的通信录)

/**
 通讯录变更回调(已分组的通讯录)
 */
@property (nonatomic, copy) void (^sectionContactsHanlder) (BOOL succeed, NSArray <LJSectionPerson *> *newSectionContacts, NSArray <NSString *> *keys);

最后

是因为作者水平有限,文中假设有错误的地点,大概有更好的点子,还望大神指出。
附上本文的享有 demo
下载链接,【GitHub】
比方你看完后以为对您抱有扶助,还望在 GitHub 上点个
star。赠人玫瑰,手有余香。

发表评论

电子邮件地址不会被公开。 必填项已用*标注