2016-07-12 4 views
5

Я новичок в быстроте, и методы, которые я нахожу, устарели относительно моей проблемы. Я создаю приложение каталога, и я извлекаю данные контакта из API, а не из адресной книги телефона.Как создать файл vCard/vcf для использования в общем листе?

В iOS, если вы заходите в свою адресную книгу, вы можете выбрать контакт и выбрать «Поделиться контактом», в котором отображается общий листок. Я хочу эту точную функциональность в своем приложении.

Я думаю я получил Share Sheets выяснило, и вот мой код, что:

@IBAction func actShare(sender: AnyObject) { 

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

Я хочу, чтобы изменить "text" as NSString быть визитной карточкой, поскольку это объект, который разделяет IOS из адресной книги, не так ли? Предполагая, что я прав, я хочу создать vCard из контактного объекта моего собственного приложения, чтобы поделиться им с соответствующими приложениями (электронная почта, смс и т. Д.).

Как я могу достичь этого в Swift? Если я ошибаюсь, пожалуйста, поправьте меня и покажите мне, что мне нужно сделать. Благодарю.

EDIT: Хорошо, вот мои изменения.

@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 
} 

Однако, когда я нажимаю кнопку Отправить и выводит свою долю листа, я выбираю приложение, я хочу поделиться с и не добавлять/присоединить контакт данные по назначению. Как это сделать?

ответ

6

Хитрость здесь, чтобы сохранить контакт в файл VCard (.vcf) с помощью CNContactVCardSerialization.dataWithContacts, а затем передать файл URL в UIActivityViewController. Контроллер представления активности определяет формат VCard с расширением файла, и показывает приложения, где поддерживается формат (например, сообщения, почта, заметки, AirDrop и т.д.)

Пример:

@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

Спасибо - я просто обновил свой первоначальный пост с новым вопросом. Я думаю, что ваш ответ разрешит это. Я попробую и вернусь к тебе.Очень признателен! –

+0

Большое вам спасибо! Это сработало отлично. Я понимаю это сейчас. Однако у меня есть последний вопрос. Когда я разделяю контакт, .vcf имеет длинное имя типа «6DD3C04D-08C1-44C7-8A7E-F08C6F0CB5CD.vcf». Могу ли я изменить это на JohnnyAppleseed.vcf, как и вы, когда вы делитесь контактом с вашей собственной адресной книгой? EDIT: О, я понял! Я упустил .URLByAppendingPathComponent (NSUUID(). UUIDString). Спасибо огромное! –

+0

'CNContactFormatter' поможет вам там. Я обновил код, чтобы показать, как вы можете его использовать. Он вернется к строке UUID, если контакт не имеет имени (по какой-либо причине), или если вы совместно используете несколько контактов одновременно (в этом случае, используя имя, вероятно, не нужно). –

2

Вы можете использовать CNContact (требуется IOS 9):

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

это очень просто создать контакт из приложения IOS и делиться через внешние приложения.

Прежде всего, необходимо создать Share Button Действие, как показано ниже: -

-(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];  
} 

Чем вы можете вызвать функцию, ниже которой будет возвращать путь карточки контакта в выше случае кнопки ,

- (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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^