2014-11-11 1 views
2

Я пытаюсь подумать о способе обмена контактами, используя UIActivityViewController (или используя СМС) с одного устройства на другое.Обмен контактами UIActivityViewController?

До сих пор я искал, и я понятия не имею, как я могу обмениваться контактами между устройствами, использующими мое приложение.

Любые идеи?

ответ

9

После поиска в течение нескольких месяцев я, наконец, нашел способ добиться этого.

Вы можете использовать этот код, чтобы использовать один CNContact в UIActivityViewController:

let contact: CNContact = /* your contact here */ 

let fileManager = NSFileManager.defaultManager() 
let cacheDirectory = try! fileManager.URLForDirectory(NSSearchPathDirectory.CachesDirectory, inDomain: NSSearchPathDomainMask.UserDomainMask, appropriateForURL: nil, create: true) 

let fileLocation = cacheDirectory.URLByAppendingPathComponent("\(CNContactFormatter().stringFromContact(contact)!).vcf") 

let contactData = try! CNContactVCardSerialization.dataWithContacts([contact]) 
contactData.writeToFile(fileLocation.path!, atomically: true) 

let activityVC = UIActivityViewController(activityItems: [fileLocation], applicationActivities: nil) 
presentViewController(activityVC, animated: true, completion: nil) 

Этот код преобразует контакт в его представлении NSData, сохраняет его в папку кэш-памяти приложения, и разделяет файл как деятельность пункт.

Если вы хотите разделить несколько контактов, вы можете передать несколько файлов таким образом.

Edit: Swift версия 3,0

let contact: CNContact = /* your contact here */ 

let fileManager = FileManager.default 
let cacheDirectory = try! fileManager.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true) 

let fileLocation = cacheDirectory.appendingPathComponent("\(CNContactFormatter().string(from: contact)!).vcf") 

let contactData = try! CNContactVCardSerialization.data(with: [contact]) 
do { 
    try contactData.write(to: fileLocation.asURL(), options: .atomicWrite) 
} catch { 
    ... 
} 

let activityVC = UIActivityViewController(activityItems: [fileLocation], applicationActivities: nil) 
present(activityVC, animated: true, completion: nil) 
1

Это также легко достижимы с использованием старой базы ABAddressBook аналогичным образом (сделать представление визитной карточки, сохранить его в файл, разделить URL):

func AB_RecordVcardFileURL(record: ABRecord) -> NSURL? { 
    let docsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 

    guard let 
     pathStr = docsPath.first as NSString? 
     else {return nil} 

    let name = ABRecordCopyCompositeName(record).takeRetainedValue() ?? "vcard" 
    let filePath = pathStr.stringByAppendingPathComponent("\(name!).vcf") 

    let fileUrl = NSURL(fileURLWithPath: filePath) 

    let card = ABPersonCreateVCardRepresentationWithPeople([record]).takeRetainedValue() as NSData 
    card.writeToURL(fileUrl, atomically: true) 

    return fileUrl 
} 

чем вы просто передать URL в контроллер активности:

guard let 
     fileUrl = AB_RecordVcardFileURL(record) 
else {return} 

let activity = UIActivityViewController(activityItems: [fileUrl], applicationActivities: nil) 
presentViewController(activity, animated: true, completion: nil) 
2

Swift 3,0:

let cacheDirectory = try! FileManager.default.url(for: FileManager.SearchPathDirectory.cachesDirectory, in: FileManager.SearchPathDomainMask.userDomainMask, appropriateFor: nil, create: true) 

    let fileLocation = cacheDirectory.appendingPathComponent("\(CNContactFormatter().string(from: contact)!).vcf") 

    let contactData = try! CNContactVCardSerialization.data(with: [contact]) 
    do { 
     _ = try contactData.write(to: fileLocation, options: .atomic) 
    } catch let error { 
     print(error) 
    }