ABID в схемах URL WhatsApp

Вчера Whatsapp обновил свое приложение для iOS и выпустил официальную схему URL (api hooks).

Я хотел немного поиграть с этим, и теперь я столкнулся с проблемой, что я не понимаю всего этого «abid»?! Откуда я могу получить идентификатор контакта? И как мне тогда его использовать?

Заранее спасибо :)


person Constantin Jacob    schedule 17.07.2013    source источник
comment
Что ты пытаешься сделать? Какова ваша цель, ваш продукт, ваша цель?   -  person CaptJak    schedule 18.07.2013
comment
Итак, прежде всего я просто пытаюсь понять, как это работает. Но подумали о том, чтобы иметь что-то, а затем поделиться этим напрямую через Whatsapp? Прямо сейчас я просто ввожу схемы URL-адресов в Safari на своем iPhone...   -  person Constantin Jacob    schedule 18.07.2013


Ответы (6)


ABID означает идентификатор записи адресной книги, приведенный ниже код работает для получения идентификатора записи AB. Он чувствителен к использованию разделителей в самом URL-адресе. Так что первоначальные испытания не работали. Чтобы отправить заметку конкретному пользователю, используйте этот формат строки URL: whatsapp://send?abid=123&text=What%20a%20nice%20day - обратите внимание на использование & для пометки второго параметра.

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController    *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{   
    QR_whatsappABID  = (ABRecordID)ABRecordGetRecordID(person);
    ....
    QR_whatsapp_string = [NSString stringWithFormat:@"whatsapp://send?abid=%d&text=%@;",QR_whatsappABID, outmessage];
    ....
}

это можно закодировать без использования средства выбора людей, просто откройте адресную книгу:

пройтись по записям одну за другой, сравнивая имя или имя и номер -

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions (NULL, error);
int len = (int)ABAddressBookGetPersonCount(addressBook);
for(int i = 1; i < (len + 1); i++) {
    ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, (ABRecordID)i);
    NSString *first, *last;
    if (!person) {
        continue;
    }
    CFStringRef firstc = (CFStringRef)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    if (firstc) {
        CFStringRef lastc =(CFStringRef) ABRecordCopyValue(person, kABPersonLastNameProperty);
        if (lastc) {
            first = [NSString stringWithFormat:@"%@",firstc];
            last =[NSString stringWithFormat:@"%@",lastc];
            CFRelease(lastc);
        }
        CFRelease(firstc);
    }
    if ([[first lowercaseString] isEqualToString:[firstname lowercaseString]] && [[last lowercaseString] isEqualToString:[surname lowercaseString]]) {
        alreadyExists = YES;
        ABID = ABRecordGetRecordID(person);
        break;
    }
}
person Paulo    schedule 22.07.2013
comment
ABID означает ABRecordID — и приведенный выше пример работает — оказалось, что я боролся с разделителями в самом URL-адресе: ... Это работает следующим образом: QR_whatsapp_string = [NSString stringWithFormat:@whatsapp://send?abid=%d ;?text=%@;,QR_whatsappABID, исходящие сообщения]; - person Paulo; 23.07.2013
comment
Константин, идентификатор записи AB присваивается каждой записи в адресной книге. Он уникален в источнике адресной книги, но он будет меняться на разных устройствах. Есть несколько способов добраться до адресной книги, но наиболее распространенный способ — через контроллеры выбора людей, где ваш контроллер представления действует как делегат (пример выше). также есть способ использовать одну из функций адресной книги для заполнения объекта NSArray содержимым адресной книги. Это интересно, но с определенной сложностью по сравнению с обычным программированием на UIKit. - person Paulo; 23.07.2013

Обратите внимание, что WhatsApp удалил (в марте 2016 г.) схему URL-адресов для открытия беседы с определенным контактом.

Как вы можете видеть на их странице Пользовательская схема URL, больше нет параметра ABID. .

person andreacipriani    schedule 31.03.2016

Я описал один из способов получения пакетов ABID здесь: http://n8henrie.com/2014/02/how-to-get-the-abid-for-whatsapp-url-schemes/

Основная идея заключается в использовании iFunBox для доступа к базе данных sqlite на вашем телефоне, затем запустите скрипт, который извлекает все ABID и имена.

person n8henrie    schedule 18.08.2014

Два последних решения (июль 2017 г.)

Я нашел, протестировал и сослался на два новых разных решения в ЭТОМ ДРУГОМ ОТВЕТЕ (потому что политики SO мне пришлось поставить ссылку к решению, без дубликатов).

person DavidTaubmann    schedule 21.07.2017

abid означает идентификатор адресной книги, и это параметр, который вы используете со схемой URL-адреса Whatsapp, чтобы использовать данные, которые у вас есть в вашей адресной книге. С сайта WhatsApp.

Чтобы использовать схему URL-адреса для WhatsApp в вашем приложении для отправки текста «Hello World», вы должны сделать что-то вроде этого (пример с сайта):

 NSURL *whatsappURL = [NSURL URLWithString:@"whatsapp://send?text=Hello%2C%20World!"];
 if ([[UIApplication sharedApplication] canOpenURL: whatsappURL]) 
 {
  [[UIApplication sharedApplication] openURL: whatsappURL];
 }

Но поскольку вы не опубликовали код, я не могу сказать, как использовать вышеизложенное или куда его поместить. Но вы всегда можете ознакомиться с некоторыми учебными пособиями по использованию схем URL, если вам это нужно.

Надеюсь это ответит на твой вопрос!

person CaptJak    schedule 17.07.2013
comment
Нет, да, я полностью понял :) Я не понимаю, как создается идентификатор адресной книги или как я заставляю его работать. Например, насколько я понял, это должно быть так: whatsapp://send?abid=randomname Имя: Случайное Фамилия: Имя - person Constantin Jacob; 18.07.2013
comment
О. Я не уверен, что это так рано, ведь прошел всего день, верно? Но судя по всему, ваш код может работать... Вы пробовали? В противном случае попробуйте отправить им электронное письмо, чтобы узнать Whatsapp (ха-ха). Сообщите им, что их документации не хватает! - person CaptJak; 18.07.2013
comment
Да, я пробовал свой код, но ничего не произошло. Только открыл представление создания, но не выбрал контакт, на который я нацелился :( - person Constantin Jacob; 18.07.2013
comment
Я просто напишу их и буду занозой в заднице :/ Спасибо ;) - person Constantin Jacob; 18.07.2013
comment
Вы пробовали только с параметром abid? например whatsapp://send?abid;" or even whatsapp://abid` или `whatsapp://send/abid; просто чувствую себя в темноте здесь ... - person CaptJak; 18.07.2013

Для abid вы можете получить список контактов, а затем выбрать, чтобы отправить сообщение определенному человеку.

  1. Получить идентификатор записи из адресной книги

    contactList=[[NSMutableArray alloc] init];
        CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(m_addressbook);
        CFIndex nPeople = ABAddressBookGetPersonCount(m_addressbook);
        for (int i=0;i<nPeople;i++) {
         NSMutableDictionary *dOfPerson=[[NSMutableDictionary alloc] init];
    
        ABRecordRef ref = CFArrayGetValueAtIndex(allPeople,i);
            NSNumber *recordId = [NSNumber numberWithInteger:ABRecordGetRecordID(ref)];
            [dOfPerson setObject:recordId forKey:@"RecordID"];
            [contactList addObject:dOfPerson];
        }
    
  2. Получить выбранный RecordID, например:

    NSString *recordID = [dict objectForKey:@"RecordID"];

  3. Схема URL-адреса приложения Whats

    NSString *str = [NSString stringWithFormat:@"whatsapp://send?text=Whenitize&abid=%@",recordID];
    NSLog(@"%@", str);
    NSURL *whatsappURL = [NSURL URLWithString:str];
    if ([[UIApplication sharedApplication] canOpenURL:whatsappURL]) {
             [[UIApplication sharedApplication] openURL:whatsappURL];
     }  else  {
            [[[UIAlertView alloc] initWithTitle:@"" message:@"Please install What's App in your device." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
    }
    
person Ga Ne Sh    schedule 17.10.2014