如何使用 SwiftUI 在 iOS 上获取和显示联系人照片?

Posted

技术标签:

【中文标题】如何使用 SwiftUI 在 iOS 上获取和显示联系人照片?【英文标题】:How to get and display contact photos on iOS with SwiftUI? 【发布时间】:2020-11-23 09:31:30 【问题描述】:

我有一个正在运行的脚本,可以使用 SwiftUI 在 ios 上读取和显示所有联系人,但我也在努力显示联系人图像。当我调试代码时,所有联系人的 imageData 似乎都是空的,并且 hasImageData 是假的。一般来说,联系人是从 Google 同步到 iPhone 的,但出于测试目的,我将 iPhone 上的照片添加到一些联系人,结果相同 - 没有结果。

希望任何人都知道出了什么问题:-)


import SwiftUI
import Contacts

struct FetchedContact 
    var id: String
    var firstName: String
    var lastName: String
    var telephone: String


func getContacts() -> [FetchedContact] 
    
    var contacts = [FetchedContact]()
    
    let store = CNContactStore()
    store.requestAccess(for: .contacts)  (granted, error) in
        if let error = error 
            print("failed to request access", error)
            return
        
        if granted 
            let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]
            let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
            do 
                try store.enumerateContacts(with: request, usingBlock:  (contact, stopPointer) in
                    contacts.append(FetchedContact(id: contact.identifier, firstName: contact.givenName, lastName: contact.familyName, telephone: contact.phoneNumbers.first?.value.stringValue ?? ""))
                )
             catch let error 
                print("Failed to enumerate contact", error)
            
         else 
            print("access denied")
        
        
    
    
    contacts.sort 
        $0.firstName < $1.firstName
    
    
    contacts.sort 
        $0.lastName < $1.lastName
    
    
    return contacts
    


struct ContactListView: View 
    
    @State var contacts = [FetchedContact]()
    
    var body: some View 
        VStack 
            Button(action: 
                self.contacts = getContacts()
            ) 
                Text("Update contacts")
            
            .padding()
            Text("\(self.contacts.count) contacts found")
                .padding()
            List(self.contacts, id: \.id)  contact in
                Text("\(contact.lastName), \(contact.firstName)")
            
            .padding(.vertical)
            
        
        .navigationTitle("Contact List View")
    
    


struct ContactListView_Previews: PreviewProvider 
    static var previews: some View 
        NavigationView() 
            ContactListView()
        
    

【问题讨论】:

这是否回答了您的问题***.com/questions/64510100/…? 是的,事实上我错过了在请求中添加相应的键-谢谢:-) 【参考方案1】:

解决方案:

    向查询中添加所需的键

    let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactImageDataAvailableKey, CNContactThumbnailImageDataKey]

    修改图片显示

    Image(uiImage: UIImage(data: contact.image ?? Data()) ?? UIImage())

【讨论】:

以上是关于如何使用 SwiftUI 在 iOS 上获取和显示联系人照片?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中添加与内容重叠的按钮上方的渐变? iOS 13

如何在 SwiftUI 列表中显示 MPMediaItem 图稿?

SwiftUI脑洞大开打造实时显示当前值的Slider

iOS开发 - 在SwiftUI中显示模态视图

SwiftUI脑洞大开打造实时显示当前值的Slider(滑动器)

TabView 在 iOS13 SwiftUI 上无法正常工作