2011-11-03 10 views

Odpowiedz

53

Jedyne rozwiązanie, jakie mogłem wymyślić, to użycie nazwy urządzenia, a następnie przeszukanie książki adresowej pod kątem dopasowania. to zakłada, że ​​ktoś używałby konkretnej konwencji nazewnictwa. Na przykład używam "iPhone'a Nikona" jako nazwy mojego urządzenia. Jestem też jedynym Nikiem w mojej książce adresowej, więc dla mojego scenariusza dobrze jest użyć tekstu sprzed 's jako nazwy właściciela.

Korzysta z bardzo poręcznego opakowania dla ABAddressBook by Erica Sadun, ABContactHelper. Pozostawiłem kod wyliczeniowy zamiast używać indeksu tablicy na 0, ponieważ prawdopodobne jest, że mała liczba wyników zostanie zwrócona, aby można było rozwinąć, aby dać użytkownikowi opcję wyboru "swoich" danych. Które chociaż nie pasują dokładnie do rozwiązania kwadratowej skrzynki, działa dobrze. moim zdaniem.

NSString *firstname; 
NSString *lastname; 

NSString *ownerName = [[UIDevice currentDevice] name]; 

NSRange t = [ownerName rangeOfString:@"'s"]; 
if (t.location != NSNotFound) { 
    ownerName = [ownerName substringToIndex:t.location]; 
} 

NSArray *matches = [ABContactsHelper contactsMatchingName:ownerName]; 
if(matches.count == 1){ 
    for (ABContact *contact in matches){ 
     firstname = [contact firstname]; 
     lastname = [contact lastname]; 

    } 
} 
+5

Mogę potwierdzić, że wygląda na to, jak oni to robią. Jeśli zmienisz nazwę urządzenia na nazwę, której nie ma w książce adresowej, w Karcie pojawi się nowa nazwa pochodząca od nazwy urządzenia. – TomSwift

+1

Awesome. Dobra sztuczka, która gra według zasad! – Genericrich

+1

Czy to nadal działa? Czy telefon nie poprosi o uprawnienia do książki adresowej? – Kamchatka

0

Nie można

http://developer.apple.com/library/ios/#documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Introduction.html#//apple_ref/doc/uid/TP40007744

wiem, że to było dostępne w 4.X; nie tylko funkcja 5.0 ... Nie wiem, czy była dostępna wcześniej.

+0

Nadal go nie widzę. Gdzie w dokumencie można uzyskać informacje o koncie użytkownika? – Genericrich

+0

Wciąż musisz o to zapytać, nie ma metody takiej jak .me na Mac OS X. Widziałem ludzi pytających o to, to jest pop-up selektora ludzi, pozwolić im wybrać siebie, niż przechowywać identyfikator. Albo inny uzyskał numer telefonu, a następnie zapytał książkę adresową o ten numer telefonu itp. –

+0

Tak, to nie jest sposób w jaki aplikacja Square to robi. Wciąż oszołomiony. – Genericrich

23

Ponieważ zmiany wymagające aplikacje, aby poprosić o uprawnienia do dostępu do książki adresowej ta metoda nie działa . Odpowiedź Nik Burnsa działała świetnie, ale potrzebuje dostępu do książki adresowej.

Pobrałem Kwadratowy Portfel (który jest następcą odniesień do kwadratowej skrzynki w oryginalnym pytaniu) i nie wypełnia on już formularza rejestracji. Ścieżka służy również do wykonania sztuczki z nazwą książki adresowej urządzenia, ale nie jest już wstępnie wypełniana formularza rejestracji.

Korzystając z powyższej metody, można wstępnie wypełnić formularz rejestracji porequesting Contacts access, ale traci on pożądane "magiczne" doświadczenie.

+4

To jest nowa "poprawna odpowiedź" na pytanie. – JOM

1

Ponieważ nie był zadowolony z konieczności korzystania z nazwy urządzenia Zdecydowałem się użyć pierwszy rekord z książki adresowej, która odpowiada „ja”

ABAddressBookRef addressBook = ABAddressBookCreate(); 
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); 
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, 0); 
ABContact * contact = [ABContact contactWithRecord:ref]; 
1

miałem ten sam problem, ale w Swift, i wykorzystywane Nik Burns sugestie i napisał na blogu o tym: http://paulpeelen.com/2016/01/20/prefill-an-signup-form-in-ios-using-swift-and-cncontact/

jest to po prostu efekt końcowy w Swift:

import Contacts 

... 

    @IBOutlet weak var nameFirst: UILabel! 
    @IBOutlet weak var nameLast: UILabel! 
    @IBOutlet weak var email: UILabel! 
    @IBOutlet weak var phoneNo: UILabel! 
    @IBOutlet weak var address: UILabel! 

    /** 
    Search the addressbook for the contact 
    */ 
    private func getMe() { 
     let ownerName = getOwnerName() 
     let store = CNContactStore() 

     do { 
      // Ask permission from the addressbook and search for the user using the owners name 
      let contacts = try store.unifiedContactsMatchingPredicate(CNContact.predicateForContactsMatchingName(ownerName), keysToFetch:[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey, CNContactPostalAddressesKey, CNContactEmailAddressesKey]) 

      //assuming contain at least one contact 
      if let contact = contacts.first { 
       // Checking if phone number is available for the given contact. 
       if (contact.isKeyAvailable(CNContactPhoneNumbersKey)) { 
        // Populate the fields 
        populateUsingContact(contact) 
       } else { 
        //Refetch the keys 
        let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey, CNContactPostalAddressesKey, CNContactEmailAddressesKey] 
        let refetchedContact = try store.unifiedContactWithIdentifier(contact.identifier, keysToFetch: keysToFetch) 

        // Populate the fields 
        populateUsingContact(refetchedContact) 
       } 
      } 
     } catch let e as NSError { 
      print(e.localizedDescription) 
     } 

    } 

    /** 
    Get the device owners name 

    - returns: The owners name 
    */ 
    private func getOwnerName() -> String { 
     // Get the device owners name 
     var ownerName = UIDevice.currentDevice().name.trimmedString.stringByReplacingOccurrencesOfString("'", withString: "") 
     // Get the model of the device 
     let model = UIDevice.currentDevice().model 

     // Remove the device name from the owners name 
     if let t = ownerName.rangeOfString("s \(model)") { 
      ownerName = ownerName.substringToIndex(t.startIndex) 
     } 

     return ownerName.trimmedString 
    } 

    /** 
    Populate the fields using a contact 

    - parameter contact: The contact to use 
    */ 
    private func populateUsingContact(contact: CNContact) { 
     // Set the name fields 
     nameFirst.text = contact.givenName 
     nameLast.text = contact.familyName 

     // Check if there is an address available, it might be empty 
     if (contact.isKeyAvailable(CNContactPostalAddressesKey)) { 
      if let 
       addrv = contact.postalAddresses.first, 
       addr = addrv.value as? CNPostalAddress where addrv.value is CNPostalAddress 
      { 
       let address = "\(addr.street)\n\(addr.postalCode) \(addr.city)\n\(addr.country)" 
       self.address.text = address 
      } 
     } 

     // Check if there is a phonenumber available, it might be empty 
     if (contact.isKeyAvailable(CNContactPhoneNumbersKey)) { 
      if let 
       phonenumberValue = contact.phoneNumbers.first, 
       pn = phonenumberValue.value as? CNPhoneNumber where phonenumberValue.value is CNPhoneNumber 
      { 
       phoneNo.text = pn.stringValue 
      } 
     } 
    } 

i rozszerzenie:

extension String { 

    /// Trim a string 
    var trimmedString: String { 
     return stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 
    } 

} 
+0

Dziwnie mój własny numer telefonu nie znajduje się na liście kontaktów. Czy to nowa zmiana w nowszych wersjach systemu iOS? Czy muszę dodać siebie ręcznie lub czy dzieje się to automatycznie? – Isuru

Powiązane problemy