2011-11-03 8 views
20

स्क्वायर का नया कार्ड केस आईओएस ऐप में "खाता बनाएं" सुविधा है। इसे टैप करें और यह पता पुस्तिका से उपयोगकर्ता की प्रविष्टि के साथ पूर्ववत एक फॉर्म दिखाता है।स्क्वायर का कार्डकेस ऐप स्वचालित रूप से पता पुस्तिका से उपयोगकर्ता के विवरण कैसे पॉप्युलेट करता है?

यह कैसे संभव है? किसी को पता है? मैंने सोचा कि उपयोगकर्ता की जानकारी इस तरह से प्राप्त करने के लिए यह असंभव था। यह आईओएस 5.0 चीज नहीं है, अफवाह।

उत्तर

53

एकमात्र समाधान जो मैं आ सकता था, डिवाइस नाम का उपयोग कर रहा था और फिर एक मैच के लिए एड्रेसबुक खोज रहा था। यह मानता है कि कोई विशेष नामकरण सम्मेलन का उपयोग करेगा। उदाहरण के लिए मैं अपने डिवाइस नाम के रूप में 'निक का आईफोन' का उपयोग करता हूं। मैं अपनी एड्रेसबुक में भी एकमात्र निक हूं, इसलिए मेरा परिदृश्य के से पहले मालिक नाम के रूप में टेक्स्ट का उपयोग करने के लिए अच्छा काम करता है।

यह एरिका सदून, ABContactHelper द्वारा ABAddressBook के लिए बहुत आसान रैपर का उपयोग करता है। मैंने 0 पर सरणी इंडेक्स का उपयोग करने के बजाय गणना कोड छोड़ा है, संभवतः एक छोटी संख्या में मैचों को वापस कर दिया जाएगा ताकि आप उपयोगकर्ता को 'उनके' विवरण चुनने का विकल्प देने के लिए विस्तार कर सकें। जो स्क्वायर केस समाधान से बिल्कुल मेल नहीं खाता है, वैसे ही अच्छी तरह से काम करता है। IMHO।

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

मैं पुष्टि कर सकता हूं कि ऐसा लगता है कि वे इसे कैसे करते हैं। यदि आप अपना डिवाइस नाम उस नाम पर बदलते हैं जो पता पुस्तिका में मौजूद नहीं है, तो कार्ड केस डिवाइस नाम से प्राप्त नया नाम दिखाता है। – TomSwift

+1

बहुत बढ़िया। अच्छी चाल जो नियमों द्वारा निभाती है! – Genericrich

+1

क्या यह अभी भी काम करता है? फोन पता पुस्तिका अनुमतियों के लिए नहीं पूछेगा? – Kamchatka

0

नहीं आप कर सकते हैं

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

मैं जानता हूँ कि यह 4.x में उपलब्ध था; सिर्फ 5.0 फीचर नहीं ... सुनिश्चित नहीं है कि यह पहले उपलब्ध था या नहीं।

+0

अभी भी इसे नहीं देख रहा है। दस्तावेज़ में आप उपयोगकर्ता की खाता जानकारी कहां प्राप्त कर सकते हैं? – Genericrich

+0

आपको अभी भी इसके लिए पूछना है, मैक ओएस एक्स पर .me जैसी कोई विधि नहीं है। मैंने लोगों को इसके लिए संकेत दिया है, यानी लोगों के पिकर को पॉप अप करें, उन्हें आईडी स्टोर करने से खुद को चुनने दें। या अन्य ने फोन नंबर प्राप्त कर लिया है, फिर उस फोन नंबर आदि के लिए पता पुस्तिका से पूछताछ करें। –

+0

हां, ऐसा नहीं है कि स्क्वायर ऐप इसे कैसे करता है। अभी भी परेशान – Genericrich

23

के बाद से अनुमतियाँ पता पुस्तिका इस विधि अब काम नहीं करता का उपयोग करने के लिए परिवर्तन क्षुधा की आवश्यकता है कि पूछने के लिए। निक बर्न्स का जवाब बहुत अच्छा काम करता है, लेकिन इसे एड्रेस बुक तक पहुंच की जरूरत है।

मैंने स्क्वायर वॉलेट डाउनलोड किया (जो मूल प्रश्न में स्क्वायर कार्ड केस संदर्भों का उत्तराधिकारी है) और यह अब साइन अप फॉर्म को पूर्व-पॉप्युलेट नहीं करता है। पथ डिवाइस नाम पता पुस्तिका चाल करने के लिए भी प्रयोग किया जाता है लेकिन यह अब साइन अप फॉर्म को पूर्व-पॉप्युलेट नहीं करता है।

उपरोक्त विधि का उपयोग करना, आप अभी भी साइन अप करें प्रपत्र requesting Contacts access के बाद पहले से भर सकता है, लेकिन यह वांछित "जादू" अनुभव खो देता है।

+4

यह प्रश्न के लिए नया "सही उत्तर" है। – JOM

1

जब से मैं डिवाइस का नाम मैं जो "मुझे"

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

मैं एक ही मुद्दा था से मेल खाती है पता पुस्तिका के पहले रिकॉर्ड का उपयोग करने के लिए चुना उपयोग करने के लिए होने के साथ खुश नहीं था, लेकिन स्विफ्ट में, और निक बर्न्स सुझाव इस्तेमाल किया और इसके बारे में एक ब्लॉग पोस्ट ने लिखा है:

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

और विस्तार:: यह मूल रूप से स्विफ्ट में अंतिम परिणाम है http://paulpeelen.com/2016/01/20/prefill-an-signup-form-in-ios-using-swift-and-cncontact/

extension String { 

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

} 
+0

आश्चर्यजनक रूप से मेरा स्वयं का फोन नंबर संपर्क सूची में नहीं है। क्या यह नए आईओएस संस्करणों में एक नया बदलाव है? क्या मुझे अपने आप को मैन्युअल रूप से जोड़ना है या यह स्वचालित रूप से होता है? – Isuru

संबंधित मुद्दे