Viber WhatsApp Telegram

Быстрая отправка сообщений в мессенджеры

Бывает, надо сделать кнопку «Поделиться» для определенного мессенджера. Самый быстрый способ — это url-схемы. Можно просто вызвать [[UIApplication sharedApplication] openURL:url];  для правильно сконфигурированной ссылки и установленный на телефоне мессенджер примет переданный текст для дальнейшей обработки.

Сейчас покажу, как это сделать для WhatsApp, Viber и Telegram.Для начала определим формат сообщения. Пусть это будет текст и ссылка:

NSString *text = [NSString stringWithFormat:@"%@ %@", shareText, shareURL.absoluteString];

Найти формат url для каждого приложения не составляет труда. Обычно справку публикуют на официальном сайте, например, так выглядит справка WhatsApp.

NSURL *whatsappURL = [NSURL URLWithString:@"whatsapp://send?text=Hello%2C%20World!"];

Как видно, для подстроки с содержимым необходимо экранировать символы.

В Foundation есть набор методов для обработки строк. Возьмем метод -stringByAddingPercentEncodingWithAllowedCharacters:  и набор символов [NSCharacterSet URLQueryAllowedCharacterSet] . Но есть один нюанс, раз у нас в подстроке содержится shareUrl, то нужно из набора изъять некоторые символы: [set removeCharactersInString:@»:/?&=»]

Теперь просто соберем всё части вместе:

// 1 компонуем строку для полной ссылки
NSString *text = [NSString stringWithFormat:@"%@ %@", shareText, shareURL.absoluteString];
// 2 заменяем символы
NSMutableCharacterSet *set = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
[set removeCharactersInString:@":/?="];
text = [text stringByAddingPercentEncodingWithAllowedCharacters:set];
// 3 создаем объект NSURL
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"whatsapp://send?text=%@", text]];

И итоговый метод может выглядеть так:

+(void)openShare:(ShareType)accountType
             URL:(NSURL*)shareURL
            text:(NSString*)shareText
{
    DLog(@"");
    NSString *text = [NSString stringWithFormat:@"%@ %@", shareText, shareURL.absoluteString];
    
    NSMutableCharacterSet *set = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
    [set removeCharactersInString:@":/?="];
    text = [text stringByAddingPercentEncodingWithAllowedCharacters:set];
    
    NSURL *url = nil;
    switch (accountType) {
        case ShareTypeWhatsApp: {
            url = [NSURL URLWithString:[NSString stringWithFormat:@"whatsapp://send?text=%@", text]];
            break;
        }
        case ShareTypeViber: {
            url = [NSURL URLWithString:[NSString stringWithFormat:@"viber://forward?text=%@", text]];
            break;
        }
        case ShareTypeTelegram: {
            url = [NSURL URLWithString:[NSString stringWithFormat:@"tg://msg?text=%@", text]];
            break;
        }
        default:
            break;
    }
    
    if (url && [[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    } else {
        [MyAppDelegate
         showError:[NSError
                    errorWithDomain:[NSString stringWithFormat:@"%@.api",[NSBundle mainBundle].bundleIdentifier]
                    code:404
                    userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"sharing.messangers.no-app-on-device", nil)}]];
    }
}

Опубликовано

в

от

Метки:

Комментарии

Добавить комментарий