Square的新名片盒iOS应用程序具有“创建帐户”功能。点击它,它会显示一个表格PREPOPULATED与用户在地址簿中的条目。
这怎么可能?谁知道?我认为这是不可能的,以这种方式获取用户的信息。这不是一个iOS 5.0的东西,afaict。
答案 0 :(得分:55)
我能想到的唯一解决方案是使用设备名称,然后在地址簿中搜索匹配项。这假设有人会使用特定的命名约定。例如,我使用'Nik的iPhone'作为我的设备名称。我也是我的地址簿中唯一的Nik,所以对于我的场景,可以使用的之前的文本作为所有者名称。
Erica Sadun使用了非常方便的ABAddressBook包装器,ABContactHelper。 我已经离开了枚举代码,而不是在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];
}
}
答案 1 :(得分:23)
由于需要应用程序要求访问地址簿权限的更改,此方法不再有效。 Nik Burns'答案很有效,但需要访问地址簿。
我下载了Square Wallet(原始问题中是Square Card Case引用的继承者),它不再预先填充注册表单。 Path也用于设备名称地址簿技巧,但它也不再预先填充注册表单。
使用上述方法,您仍然可以在 requesting Contacts access之后预先填写注册表单,但它会丢失所需的"魔法"经验。
答案 2 :(得分:1)
由于我不满意使用设备名称,因此我选择使用与“ME”对应的地址簿的第一条记录
<form id="form-test" role="form" action="/test" method="post">
<input type="text" name="testData" placeholder="Test Data Goes Here" class="form-control" required>
<button class="btn" type="submit">Submit</button>
</form>
答案 3 :(得分:1)
我遇到了同样的问题,但是在Swift中,并使用了Nik Burns的建议,写了一篇关于它的博客文章:http://paulpeelen.com/2016/01/20/prefill-an-signup-form-in-ios-using-swift-and-cncontact/
这基本上是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
}
}
}
扩展名:
extension String {
/// Trim a string
var trimmedString: String {
return stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
}
}
答案 4 :(得分:0)
不,你可以
我知道它在4.X中可用;不仅仅是5.0功能......不确定它是否可以提前使用。