2016-07-12 20 views
5

Tôi mới đến nhanh và các phương pháp mà tôi đang tìm kiếm không được chấp nhận liên quan đến vấn đề của tôi. Tôi đang xây dựng một ứng dụng thư mục và tôi đang lấy dữ liệu liên lạc từ một API, chứ không phải từ sổ địa chỉ của điện thoại.Làm cách nào để tạo tệp vCard/vcf để sử dụng trong bảng chia sẻ?

Trong iOS, nếu bạn truy cập sổ địa chỉ, bạn có thể chọn một liên hệ và chọn 'Chia sẻ địa chỉ liên hệ' sẽ hiển thị một bảng chia sẻ. Tôi muốn chức năng chính xác này trong ứng dụng của tôi.

tôi nghĩ Tôi đã có Share Sheets đã tìm ra, và đây là mã của tôi cho rằng:

@IBAction func actShare(sender: AnyObject) { 

    let activityViewController = UIActivityViewController(activityItems: ["text" as NSString], applicationActivities: nil) 
    presentViewController(activityViewController, animated: true, completion: {}) 
} 

Tôi muốn thay đổi "text" as NSString là một vCard, vì đó là các đối tượng mà cổ phiếu iOS từ sổ địa chỉ, phải không? Giả sử tôi đúng, tôi muốn tạo một vCard từ đối tượng liên lạc của ứng dụng của riêng tôi để chia sẻ nó với các ứng dụng thích hợp (email, sms, v.v.).

Làm cách nào để đạt được điều đó trong Swift? Nếu tôi sai, hãy sửa tôi và cho tôi biết tôi cần làm gì. Cảm ơn.

EDIT: OK, đây là thay đổi của tôi.

@IBAction func actShare(sender: AnyObject) { 
    do { 
     var contactData = NSData() 
     try contactData = CNContactVCardSerialization.dataWithContacts([createContact()]) 

     let activityViewController = UIActivityViewController(activityItems: [contactData as NSData], applicationActivities: nil) 
     presentViewController(activityViewController, animated: true, completion: {}) 
    } catch { 
     print("CNContactVCardSerialization cannot save address") 
    } 

func createContact() -> CNMutableContact { 
    let contactCard = CNMutableContact() 
    contactCard.givenName = "John" 
    contactCard.familyName = "Doe" 
    contactCard.emailAddresses = [ 
     CNLabeledValue(label: CNLabelWork, value: "[email protected]") 
    ] 

    return contactCard 
} 

Tuy nhiên, khi tôi bấm nút chia sẻ và nó sẽ trả về tấm chia sẻ của tôi, tôi chọn ứng dụng Tôi muốn chia sẻ và nó không thêm/đính kèm liên lạc dữ liệu như dự định. Làm cách nào để tôi thực hiện việc này?

Trả lời

6

Bí quyết ở đây là để lưu các số liên lạc để VCard (.vcf) tập tin sử dụng CNContactVCardSerialization.dataWithContacts, sau đó vượt qua URL tập tin vào UIActivityViewController. Bộ điều khiển xem hoạt động phát hiện định dạng VCard từ phần mở rộng tập tin, và cho thấy các ứng dụng mà các định dạng được hỗ trợ (ví dụ như tin nhắn, Mail, Notes, thả dù, vv)

Ví dụ:

@IBAction func buttonTapped(button: UIButton) { 

    let contact = createContact() 

    do { 
     try shareContacts([contact]) 
    } 
    catch { 
     // Handle error 
    } 
} 

func shareContacts(contacts: [CNContact]) throws { 

    guard let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask).first else { 
     return 
    } 

    var filename = NSUUID().UUIDString 

    // Create a human friendly file name if sharing a single contact. 
    if let contact = contacts.first where contacts.count == 1 { 

     if let fullname = CNContactFormatter().stringFromContact(contact) { 
      filename = fullname.componentsSeparatedByString(" ").joinWithSeparator("") 
     } 
    } 

    let fileURL = directoryURL 
     .URLByAppendingPathComponent(filename) 
     .URLByAppendingPathExtension("vcf") 

    let data = try CNContactVCardSerialization.dataWithContacts(contacts) 

    print("filename: \(filename)") 
    print("contact: \(String(data: data, encoding: NSUTF8StringEncoding))") 

    try data.writeToURL(fileURL, options: [.AtomicWrite]) 

    let activityViewController = UIActivityViewController(
     activityItems: [fileURL], 
     applicationActivities: nil 
    ) 

    presentViewController(activityViewController, animated: true, completion: {}) 
} 

func createContact() -> CNContact { 

    // Creating a mutable object to add to the contact 
    let contact = CNMutableContact() 

    contact.imageData = NSData() // The profile picture as a NSData object 

    contact.givenName = "John" 
    contact.familyName = "Appleseed" 

    let homeEmail = CNLabeledValue(label:CNLabelHome, value:"[email protected]") 
    let workEmail = CNLabeledValue(label:CNLabelWork, value:"[email protected]") 
    contact.emailAddresses = [homeEmail, workEmail] 

    contact.phoneNumbers = [CNLabeledValue(
     label:CNLabelPhoneNumberiPhone, 
     value:CNPhoneNumber(stringValue:"(408) 555-0126"))] 

    return contact 
} 

Activity view controller showing apps which support VCard format

VCard contact appearing in Messages app

+0

Cảm ơn bạn - Tôi vừa cập nhật bài đăng đầu tiên với câu hỏi mới. Tôi nghĩ câu trả lời của bạn sẽ giải quyết nó. Tôi sẽ thử nó và lấy lại cho bạn.Nhiều đánh giá cao! –

+0

Cảm ơn bạn rất nhiều! Điều đó làm việc hoàn hảo. Tôi hiểu nó ngay bây giờ. Tuy nhiên, tôi có một câu hỏi cuối cùng. Khi tôi chia sẻ liên hệ, .vcf có tên dài như "6DD3C04D-08C1-44C7-8A7E-F08C6F0CB5CD.vcf". Tôi có thể thay đổi nó thành JohnnyAppleseed.vcf, giống như bạn nhận được khi bạn chia sẻ một liên hệ từ sổ địa chỉ của riêng bạn? EDIT: Ồ, tôi hiểu rồi! Tôi đã bỏ qua .URLByAppendingPathComponent (NSUUID(). UUIDString). Cảm ơn bạn rất nhiều! –

+0

'CNContactFormatter' sẽ giúp bạn ở đó. Tôi đã cập nhật mã để hiển thị cách bạn có thể sử dụng nó. Nó sẽ rơi trở lại chuỗi UUID nếu liên hệ không có tên (vì bất kỳ lý do gì), hoặc nếu bạn chia sẻ nhiều địa chỉ liên lạc cùng một lúc (trong trường hợp đó, sử dụng tên đầu tiên có thể không được mong muốn). –

2

Bạn có thể sử dụng một CNContact (yêu cầu iOS 9):

let contact = CNMutableContact() 
    contact.givenName = "John" 
    contact.familyName = "Doe" 
    contact.emailAddresses = [ 
     CNLabeledValue(label: CNLabelWork, value: "[email protected]") 
    ] 
0

Nó rất đơn giản để tạo liên lạc từ ứng dụng iOS của bạn và chia sẻ trên các ứng dụng bên ngoài.

Trước tiên, bạn cần phải tạo ra Share nút Action như dưới đây: -

-(void)shareContactAction:(UIButton*)sender 
{ 
    CNMutableContact *selectedCon = [[CNMutableContact alloc] init]; 
    selectedCon.givenName = @"ABC"; 
    selectedCon.familyName = @"XYZ"; 
    NSString *phoneNum = @"+91-XXXXXXXXXXX" 
    CNLabeledValue *contactNum1 = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:[CNPhoneNumber phoneNumberWithStringValue:phoneNum]]; 
    selectedCon.phoneNumbers = @[contactNum1]; 
    NSString *url=[self saveContactDetailsToDocDir:selectedCon]; 
    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[@"Contact", [NSURL fileURLWithPath:url]] applicationActivities:nil]; 
    [self presentViewController:activityViewController animated:YES completion:nil];  
} 

hơn bạn có thể gọi hàm dưới đây mà sẽ trở lại con đường của thẻ liên lạc trong trường hợp nút trên .

- (NSString *)saveContactDetailsToDocDir:(CNContact *)contact { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory,  NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString * contactCardPath = [documentsDirectory stringByAppendingString:@"/vCardName.vcf"]; 
    NSArray *array = [[NSArray alloc] initWithObjects:contact, nil]; 
    NSError *error; 
    NSData *data = [CNContactVCardSerialization dataWithContacts:array error:&error]; 
    [data writeToFile:contactCardPath atomically:YES]; 

    return contactCardPath; 
} 
Các vấn đề liên quan