iOS之通訊錄和相冊(Contacts Framework/Photos Framework)

因項(xiàng)目后期可能需要備份通訊錄和相冊媳荒,趁現(xiàn)在時(shí)間多,提前先了解下寫個(gè)Demo貌夕。關(guān)于Contacts也有官方的視頻磷籍,但視頻是用Swift寫的闷哆,讓我也覺得要快速入手Swift了站楚。

通訊錄

通訊錄要先導(dǎo)入?#import <Contacts/Contacts.h>

添加聯(lián)系人(由于我主要做備份,就寫死了)

    CNMutableContact * contact = [[CNMutableContact alloc]init];
    contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"naruto.jpg"]);
    contact.givenName = @"steven";//設(shè)置名字
    contact.familyName = @"guo";//設(shè)置姓氏
    contact.emailAddresses = @[[CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"956995511@qq.com"]];//郵箱
    contact.phoneNumbers = @[[CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberiPhone value:[CNPhoneNumber phoneNumberWithStringValue:@"13999999999"]]];//電話
    /*其余屬性我就不配置了
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *namePrefix;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *givenName;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *middleName;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *familyName;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *previousFamilyName;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *nameSuffix;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *nickname;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *phoneticGivenName;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *phoneticMiddleName;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *phoneticFamilyName;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *organizationName;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *departmentName;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *jobTitle;
    @property (copy, NS_NONATOMIC_IOSONLY) NSString *note;
    太多了轻绞,未完采记。。政勃。
    */
    
    //地址
    CNMutablePostalAddress * homeAdress = [[CNMutablePostalAddress alloc]init];
    homeAdress.street = @"大街";
    homeAdress.city = @"深圳";
    homeAdress.state = @"中國";
    homeAdress.postalCode = @"518000";
    contact.postalAddresses = @[[CNLabeledValue labeledValueWithLabel:CNLabelHome value:homeAdress]];
    //生日
    NSDateComponents * birthday = [[NSDateComponents  alloc]init];
    birthday.day=4;
    birthday.month=2;
    birthday.year=1989;
    contact.birthday=birthday;
    
    CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];
    //將創(chuàng)建的聯(lián)系人添加到系統(tǒng)通訊錄中
    [saveRequest addContact:contact toContainerWithIdentifier:nil];
    
    /*方法也有很多
    //添加一個(gè)聯(lián)系人
    - (void)addContact:(CNMutableContact *)contact toContainerWithIdentifier:(nullable NSString *)identifier;
    //更新一個(gè)聯(lián)系人
    - (void)updateContact:(CNMutableContact *)contact;
    //刪除一個(gè)聯(lián)系人
    - (void)deleteContact:(CNMutableContact *)contact;
    //添加一組聯(lián)系人
    - (void)addGroup:(CNMutableGroup *)group toContainerWithIdentifier:(nullable NSString *)identifier;
    //更新一組聯(lián)系人
    - (void)updateGroup:(CNMutableGroup *)group;
    //刪除一組聯(lián)系人
    - (void)deleteGroup:(CNMutableGroup *)group;
    //向組中添加子組
    - (void)addSubgroup:(CNGroup *)subgroup toGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);
    //在組中刪除子組
    - (void)removeSubgroup:(CNGroup *)subgroup fromGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);
    //向組中添加成員
    - (void)addMember:(CNContact *)contact toGroup:(CNGroup *)group;
    //向組中移除成員
    - (void)removeMember:(CNContact *)contact fromGroup:(CNGroup *)group;
    */

    CNContactStore * store = [[CNContactStore alloc]init];
    [store executeSaveRequest:saveRequest error:nil];//保存前面創(chuàng)建的請求

跳轉(zhuǎn)至系統(tǒng)通訊錄

需導(dǎo)入#import <ContactsUI/ContactsUI.h>

    CNContactPickerViewController * contactVC = [[CNContactPickerViewController alloc]init];
    [self presentViewController:contactVC animated:YES completion:nil];

比起之前的AddressBookFramework唧龄,這個(gè)簡單的不要不要的。奸远。既棺。

規(guī)檔

CNContactStore * stroe = [[CNContactStore alloc]init];
    CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactIdentifierKey,CNContactFamilyNameKey,CNContactGivenNameKey,CNContactOrganizationNameKey,CNContactPhoneNumbersKey,CNContactEmailAddressesKey,CNContactPostalAddressesKey,CNContactImageDataKey]];
    NSMutableArray * arr = [@[] mutableCopy];
    [stroe enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
        [arr addObject:contact];
    }];
    [NSKeyedArchiver archiveRootObject:arr toFile:@"/Users/Crazy_Steven/Desktop/contact.xml"];//規(guī)檔到桌面

詳細(xì)的可以看Demo.


相冊

跳轉(zhuǎn)至系統(tǒng)相冊

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[self presentViewController:picker animated:YES completion:nil];

備份相冊

使用Photos框架,先#import <Photos/Photos.h>

NSMutableArray *dataArray = [NSMutableArray array];
    
    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc]init];
    
    PHFetchResult *smartAlbumsFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:fetchOptions];
    /*第一個(gè)參數(shù)的枚舉含義
     PHAssetCollectionTypeAlbum      //從 iTunes 同步來的相冊懒叛,以及用戶在 Photos 中自己建立的相冊
     PHAssetCollectionTypeSmartAlbum //經(jīng)由相機(jī)得來的相冊
     PHAssetCollectionTypeMoment     //Photos 為我們自動生成的時(shí)間分組的相冊
     */
    
    /*第二個(gè)參數(shù)的枚舉含義
     PHAssetCollectionSubtypeAlbumRegular         //用戶在 Photos 中創(chuàng)建的相冊丸冕,也就是我所謂的邏輯相冊
     PHAssetCollectionSubtypeAlbumSyncedEvent     //使用 iTunes 從 Photos 照片庫或者 iPhoto 照片庫同步過來的事件。然而薛窥,在iTunes 12 以及iOS 9.0 beta4上胖烛,選用該類型沒法獲取同步的事件相冊,而必須使用AlbumSyncedAlbum诅迷。
     PHAssetCollectionSubtypeAlbumSyncedFaces     //使用 iTunes 從 Photos 照片庫或者 iPhoto 照片庫同步的人物相冊佩番。
     PHAssetCollectionSubtypeAlbumSyncedAlbum     //做了 AlbumSyncedEvent 應(yīng)該做的事
     PHAssetCollectionSubtypeAlbumImported        //從相機(jī)或是外部存儲導(dǎo)入的相冊.
     
     PHAssetCollectionSubtypeAlbumMyPhotoStream   //用戶的 iCloud 照片流
     PHAssetCollectionSubtypeAlbumCloudShared     //用戶使用 iCloud 共享的相冊
     
     PHAssetCollectionSubtypeSmartAlbumGeneric    //文檔解釋為非特殊類型的相冊,主要包括從 iPhoto 同步過來的相冊罢杉。
     PHAssetCollectionSubtypeSmartAlbumPanoramas  //相機(jī)拍攝的全景照片
     PHAssetCollectionSubtypeSmartAlbumVideos     //相機(jī)拍攝的視頻
     PHAssetCollectionSubtypeSmartAlbumFavorites  //收藏文件夾
     PHAssetCollectionSubtypeSmartAlbumTimelapses //延時(shí)視頻文件夾答捕,同時(shí)也會出現(xiàn)在視頻文件夾中
     PHAssetCollectionSubtypeSmartAlbumAllHidden  //包含隱藏照片或視頻的文件夾
     PHAssetCollectionSubtypeSmartAlbumRecentlyAdded //相機(jī)近期拍攝的照片或視頻
     PHAssetCollectionSubtypeSmartAlbumBursts     //連拍模式拍攝的照片,在 iPad mini 上按住快門不放就可以了屑那,但是照片依然沒有存放在這個(gè)文件夾下拱镐,而是在相機(jī)相冊里。
     PHAssetCollectionSubtypeSmartAlbumSlomoVideos //Slomo 是 slow motion 的縮寫持际,高速攝影慢動作解析沃琅,在該模式下,iOS 設(shè)備以120幀拍攝蜘欲。不過我的 iPad mini 不支持益眉,沒法驗(yàn)證。
     PHAssetCollectionSubtypeSmartAlbumUserLibrary //相機(jī)相冊姥份,所有相機(jī)拍攝的照片或視頻都會出現(xiàn)在該相冊中郭脂,而且使用其他應(yīng)用保存的照片也會出現(xiàn)在這里。
     
     
     PHAssetCollectionSubtypeAny                  //包含所有類型
     */
     //這里說明一下澈歉,必須要同步執(zhí)行展鸡。。埃难。否則你還沒遍歷完圖片就規(guī)檔完了
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //遍歷相機(jī)膠卷
        [smartAlbumsFetchResult enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL *stop) {
            
            if (![collection.localizedTitle isEqualToString:@"Videos"]) {
                NSArray<PHAsset *> *assets = [self GetAssetsInAssetCollection:collection];
                for (PHAsset * asset in assets) {
                    [[PHImageManager defaultManager]requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
                        [dataArray addObject:imageData];
                    }];
                }
            }
        }];
        //遍歷自定義相冊
        PHFetchResult *smartAlbumsFetchResult1 = [PHAssetCollection fetchTopLevelUserCollectionsWithOptions:fetchOptions];
        [smartAlbumsFetchResult1 enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL *stop) {
            
            NSArray<PHAsset *> *assets = [self GetAssetsInAssetCollection:collection];
            for (PHAsset * asset in assets) {
                [[PHImageManager defaultManager]requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
                    [dataArray addObject:imageData];
                }];
            }
        }];
        [dataArray writeToFile:@"/Users/Crazy_Steven/Desktop/Photos.plist" atomically:YES];
    });
- (NSArray *)GetAssetsInAssetCollection:(PHAssetCollection *)assetCollection
{
    NSMutableArray<PHAsset *> *arr = [NSMutableArray array];
    
    PHFetchResult *result = [self GetFetchResult:assetCollection];
    [result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (((PHAsset *)obj).mediaType == PHAssetMediaTypeImage) {
            [arr addObject:obj];
        }
    }];
    return arr;
}

-(NSString *) FormatPhotoAlumTitle:(NSString *)title
{
    if ([title isEqualToString:@"All Photos"] || [title isEqualToString:@"Camera Roll"]) {
        return @"相機(jī)膠卷";
    }
    return nil;
}

-(PHFetchResult *)GetFetchResult:(PHAssetCollection *)assetCollection
{
    PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
    return fetchResult;
    
}

具體效果還是看Demo,和通訊錄的寫到一起了莹弊,用的方法比較Low,不知道百度之類的云盤是怎么實(shí)現(xiàn)備份的,知道的也請大家告訴我涡尘,一同進(jìn)步忍弛。。考抄。

版權(quán)聲明:本文為 Crazy Steven 原創(chuàng)出品细疚,歡迎轉(zhuǎn)載,轉(zhuǎn)載時(shí)請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末川梅,一起剝皮案震驚了整個(gè)濱河市疯兼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挑势,老刑警劉巖镇防,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潮饱,居然都是意外死亡来氧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門香拉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啦扬,“玉大人,你說我怎么就攤上這事凫碌∑苏保” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵盛险,是天一觀的道長瞄摊。 經(jīng)常有香客問我勋又,道長,這世上最難降的妖魔是什么换帜? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任楔壤,我火速辦了婚禮,結(jié)果婚禮上惯驼,老公的妹妹穿的比我還像新娘蹲嚣。我一直安慰自己,他們只是感情好祟牲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布隙畜。 她就那樣靜靜地躺著,像睡著了一般说贝。 火紅的嫁衣襯著肌膚如雪议惰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天狂丝,我揣著相機(jī)與錄音换淆,去河邊找鬼。 笑死几颜,一個(gè)胖子當(dāng)著我的面吹牛倍试,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛋哭,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼县习,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谆趾?” 一聲冷哼從身側(cè)響起躁愿,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沪蓬,沒想到半個(gè)月后彤钟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跷叉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年逸雹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片云挟。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梆砸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出园欣,到底是詐尸還是另有隱情帖世,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布沸枯,位于F島的核電站日矫,受9級特大地震影響赂弓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搬男,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一拣展、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缔逛,春花似錦、人聲如沸姓惑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽于毙。三九已至敦冬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唯沮,已是汗流浹背脖旱。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留介蛉,地道東北人萌庆。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像币旧,于是被迫代替她去往敵國和親践险。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容