Откройте приложение Gmail из моего приложения

Я пытаюсь отправить электронное письмо из своего приложения. Но я хочу, чтобы у пользователя было приложение Gmail на его/ее телефоне, тогда его следует отправлять по почте. Если приложение Gmail недоступно, пользователь должен быть перенаправлен на Почтовый ящик.

Итак, как я могу узнать, содержит ли пользователь приложение Gmail и как я могу перенаправить его на него.

Ответ 1

Вам нужно использовать собственную схему URL. Для приложения gmail его:

googlegmail://

Если вы хотите написать сообщение, вы можете добавить дополнительные параметры к этому URL-адресу:

co?subject=Example&body=ExampleBody

Вы можете определить, установлено ли какое-либо приложение с помощью этого кода (просто замените customURL, очевидно, для других приложений):

NSString *customURL = @"googlegmail://";

if ([[UIApplication sharedApplication] 
canOpenURL:[NSURL URLWithString:customURL]])
{
  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
}
else
{
  //not installed, show popup for a user or an error
}  

Ответ 2

Настройка для iOS9 +

Как описано здесь, , если вы на iOS9 +, не забудьте добавить googlegmail в LSApplicationQueriesSchemes на своем info.plist

my info.plist

Код для открытия GMail

Затем вы можете сделать то же самое, что и принятый ответ (ниже моя версия 2.3):

let googleUrlString = "googlegmail:///co?subject=Hello&body=Hi"
if let googleUrl = NSURL(string: googleUrlString) {
    // show alert to choose app
    if UIApplication.sharedApplication().canOpenURL(googleUrl) {
        if #available(iOS 10.0, *) {
          UIApplication.sharedApplication().openURL(googleUrl, options: [:], completionHandler: nil)
        } else {
          UIApplication.sharedApplication().openURL(googleUrl)
        }
    }
}

Ответ 3

Для Swift 3. 0+

Заметки:

  1. Это решение показывает, как использовать пробелы или символы новой строки в аргументах URL-адреса (Gmail может не учитывать символы новой строки).
  2. Нет необходимости регистрироваться в LSApplicationQueriesSchemes, если вы не вызываете canOpenURL (url). Просто попробуйте использовать обработчик завершения, чтобы определить, удалось ли это.

    let googleUrlString = "googlegmail:///co?to=\(address.addingPercentEncoding(withAllowedCharacters: .alphanumerics) ?? "")&subject=\(subject.addingPercentEncoding(withAllowedCharacters: .alphanumerics) ?? "")&body=\(buildInfo.addingPercentEncoding(withAllowedCharacters: .alphanumerics) ?? "")"
    
    if let googleUrl = URL(string: googleUrlString) {
        UIApplication.shared.open(googleUrl, options: [:]) {
            success in
            if !success {
                 // Notify user or handle failure as appropriate
            }
        }
    }
    else {
        print("Could not get URL from string")
    }
    

Ответ 4

Я не мог понять, почему это не работает для меня, пока я не понял, что нацеливаюсь на info_development.plist вместо производственного файла info.plist

Если вы похожи на меня и у вас есть несколько списков Plist (один для разработки, один для продукта и т.д.), Убедитесь, что вы редактируете его везде. ;-)