Как быстро передать все телефонные контакты в JSON API - PullRequest
1 голос
/ 12 июля 2020

Я могу получить все телефонные контакты в виде таблицы.

Мне нужно передать все телефонные контакты в JSON параметр URL с именем contactsList, но я не могу передать все телефонные контакты в Json параметр contactsList

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

, но мне нужно отправить все мои телефонные контакты на JSON API

код: здесь API и заданные номера телефонов работают .. здесь с моим кодом вы также можете проверить JSON ответ .. но мне нужно отправить все телефонные контакты в API

import UIKit
import Contacts
class ContactsViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

@IBOutlet weak var joinersTableView: UITableView!
var contacts = [CNContact]()
var phNumArray  = ["5555555544", "1212121212"]
var taggedStatus: String?

override func viewDidLoad() {
    super.viewDidLoad()
    joinersTableView.register(UINib(nibName: "ContactsTableViewCell", bundle: nil), forCellReuseIdentifier: "ContactsTableViewCell")
    ContactsModel.shared.getLocalContacts {(contact) in
        self.contacts.append(contact!)
    }
    joinersTableView.reloadData()

    self.callPostApi()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return contacts.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell: ContactsTableViewCell = tableView.dequeueReusableCell(withIdentifier: "ContactsTableViewCell") as! ContactsTableViewCell
    cell.nameLbl.text    = contacts[indexPath.row].givenName + " " + contacts[indexPath.row].familyName
    cell.phNUmLbl.text = contacts[indexPath.row].phoneNumbers.first?.value.stringValue
   
    return cell
    
}

    func callPostApi() {

        let url            = URL(string: "http://itaag-env-1.ap-south-1.elasticbeanstalk.com/filter/taggedusers/")!
        var request        = URLRequest(url: url)
        request.httpMethod = "POST"

        request.setValue("F139424D-C749-42F6-B804-21BD17E28CE0", forHTTPHeaderField: "deviceid")
        request.setValue("c913136e897b419bab20746de7baab62", forHTTPHeaderField: "key")
        request.setValue("personal", forHTTPHeaderField: "userType")

        try? request.setMultipartFormData(["contactsList": "\(phNumArray)"], encoding: .utf8)
       
        URLSession.shared.dataTask(with: request) { data, _, _ in
            if let data = data, let jsonObj = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
           print("contacts JSON \(jsonObj)")
                let phnDict = jsonObj as? [String : Any]
                
                print("each phone number1111111 \(phnDict)")

            }
        }.resume()
    }
    }
 extension URLRequest {

public mutating func setMultipartFormData(_ parameters: [String: String], encoding: String.Encoding) throws {

    let makeRandom = { UInt32.random(in: (.min)...(.max)) }
    let boundary = String(format: "------------------------%08X%08X", makeRandom(), makeRandom())

    let contentType: String = try {
        guard let charset = CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(encoding.rawValue)) else {
            throw MultipartFormDataEncodingError.characterSetName
        }
        return "multipart/form-data; charset=\(charset); boundary=\(boundary)"
    }()
    addValue(contentType, forHTTPHeaderField: "Content-Type")

    httpBody = try {
        var body = Data()

        for (rawName, rawValue) in parameters {
            if !body.isEmpty {
                body.append("\r\n".data(using: .utf8)!)
            }

            body.append("--\(boundary)\r\n".data(using: .utf8)!)

            guard
                rawName.canBeConverted(to: encoding),
                let disposition = "Content-Disposition: form-data; name=\"\(rawName)\"\r\n".data(using: encoding) else {
                throw MultipartFormDataEncodingError.name(rawName)
            }
            body.append(disposition)

            body.append("\r\n".data(using: .utf8)!)

            guard let value = rawValue.data(using: encoding) else {
                throw MultipartFormDataEncodingError.value(rawValue, name: rawName)
            }

            body.append(value)
        }

        body.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)

        return body
    }()
}
}

public enum MultipartFormDataEncodingError: Error {
case characterSetName
case name(String)
case value(String, name: String)
}

EDIT: OUT PUT: здесь, как мне получить каждый контакт userName и tagged значения

contacts JSON ["(408) 555-5270": {
oniTaag = 0;
profilePic = "<null>";
tagged = 0;
userId = "<null>";
userName = "<null>";
userType = personal;
}, "555-522-8243": {
oniTaag = 0;
profilePic = "<null>";
tagged = 0;
userId = "<null>";
userName = "<null>";
userType = personal;
}, "(408) 555-3514": {
oniTaag = 0;
profilePic = "<null>";
tagged = 0;
userId = "<null>";
userName = "<null>";
userType = personal;
}, "555-478-7672": {
oniTaag = 0;
profilePic = "<null>";
tagged = 0;
userId = "<null>";
userName = "<null>";
userType = personal;
.......

1 Ответ

1 голос
/ 12 июля 2020

Чтобы преобразовать массив контактов в массив строк, вы можете сделать это

let phNumArray = contacts.flatMap { $0.phoneNumbers }.map { $0.value.stringValue }

Затем вы можете отправить phNumArray, как сейчас.

Ответ на вопрос в комментарий.
Для других свойств контакта вы можете сделать что-то вроде этого

for contact in contacts {
    print(contact.givenName)
    print(contact.familyName)
}

Очевидно, вам нужно использовать правильные ключи в этом случае CNContactGivenNameKey, CNContactFamilyNameKey во время выборки контакта.

Вы можете получить список доступных свойств здесь
Посмотрите здесь для доступных ключей.

...