web-dev-qa-db-ja.com

アプリからGmailアプリを開く

アプリからメールを送信しようとしています。しかし、私が欲しいのは、ユーザーが自分の電話でGmailアプリを使用している場合、それを使用してメールを送信することです。 Gmailアプリが利用できない場合、ユーザーはメールボックスにリダイレクトされます。

それで、ユーザーがGmailアプリを含んでいるかどうかをどのようにして知ることができ、ユーザーをそれにリダイレクトすることができますか?.

21
Ankita Shah

カスタム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
}  
23

IOS9以降のセットアップ

説明されているように ここiOS9 +を使用している場合info.plistgooglegmailLSApplicationQueriesSchemesを追加することを忘れないでください

my info.plist

Gmailを開くコード

次に、受け入れられた答えと同じことを行うことができます(以下はmy Swift 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)
        }
    }
}
30
ghashi

Swift 3.0 +の場合

ノート:

  1. このソリューションは、URLの引数でスペースまたは改行を使用する方法を示しています(Gmailは改行を考慮しない場合があります)。
  2. CanOpenURL(url)を呼び出さない限り、LSApplicationQueriesSchemesに登録する必要はありません。完了ハンドラを使用して、成功したかどうかを確認してください。

    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")
    }
    
2
biomiker

本番ファイルのinfo.plistではなくinfo_development.plistをターゲットにしていることに気づくまで、これがうまくいかない理由を理解できませんでした

私と同じように、複数のPlist(開発用、製品用など)がある場合は、どこでも編集できるようにしてください。 ;-)

1
Yasper