のにっき

【Unity】IOS14.6からmailtoで改行コードが使えなくなった対策

Unityでメーラー機能を実装するとき、mailtoを使っていた人に悲報です。
IOS14.6以降、mailtoで改行コードが認識されない仕様になりました。
改行コード'%0D%0A'を使用すると、改行されない上に<BR>が表示されてしまいます。
developer.apple.com
詳細は上記サイトに載っていますが、

iOS 14.6以降のmailtoリンクでは、HTMLなどのリッチコンテンツのサポートが削除されました

とのことです。。。改行すらサポートしないのは致命的すぎませんか?
と思っちゃうのは私がハッカーに悩まされたことがないからでしょうか。。。
ということで今回はmailtoを利用していたメーラー機能に
IOSのみ別のやり方で、改行のサポートを行う実装方法を紹介します。

作成したアセット公開

github.com
アセットの内容は上記URLで公開しています。
ソースファイルと説明を一緒に見ていただけるとわかりやすいと思います。

ソース紹介【IOSプラグイン

mailtoに変わるメーラー機能を利用します。
MessageUIフレームワークMFMailComposeViewControllerを利用することで、
アプリケーション内でメールの作成や送信ができます。
IOS専用のプラグインになるのでObject-C形式で呼び出します。
▼MailerPlugin.mm

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

@interface SocialWorker : NSObject<UIDocumentInteractionControllerDelegate, MFMailComposeViewControllerDelegate>
@property(nonatomic, retain) UIDocumentInteractionController *_dic;
@end

@implementation SocialWorker
/**
 * メール投稿
 * @param to 宛先
 * @param subject タイトル
 * @param message メッセージ
 */
- (void)postMail:(NSString *)to subject:(NSString *)subject message:(NSString *)message {
    if([MFMailComposeViewController canSendMail]) {
        MFMailComposeViewController *vc = [[MFMailComposeViewController alloc] init];
        vc.mailComposeDelegate = self;
        [vc setToRecipients:[to componentsSeparatedByString:@","]];
        [vc setSubject:subject];
        [vc setMessageBody:message isHTML:NO];
        [UnityGetGLViewController() presentViewController:vc animated:YES completion:nil];
    } else {
    }
}

/** 
 * メール結果
 */
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [UnityGetGLViewController() dismissViewControllerAnimated:YES completion:nil];
}

@end

/**
 * Unityから呼び出されるネイティブコード
 */
extern "C" {
    static SocialWorker *worker =[[SocialWorker alloc] init];
    UIViewController *UnityGetGLViewController();
    void UnitySendMessage(const char *, const char *, const char *);
    static NSString *getStr(char *str){
        if (str) {
            return [NSString stringWithCString: str encoding:NSUTF8StringEncoding];
        } else {
            return [NSString stringWithUTF8String: ""];
        }
    }
    void postMail(char *to, char *subject, char *message){
        [worker postMail:getStr(to) subject:getStr(subject) message:getStr(message)];
    }
}
プラグイン設定

.mmファイルはプロジェクトのAssets直下のPlugins/iOSフォルダに配置します。
ファイル作成後、Inspectorで以下の画像の設定を行います。

f:id:apuridasuo:20210628010705p:plain
メーラープラグイン設定

ソース紹介【Unity呼び出し】

上記で作成したプラグインC#で呼び出します。
▼OpenMailer.cs

public class OpenMailer 
{
    /// <summary>
    /// ネイティブプラグイン定義
    /// </summary>
#if UNITY_IPHONE
        [DllImport("__Internal")]
        private static extern void postMail(string to, string subject, string message);
#endif

    public void OpenMailerBase(string Address,string Kenmei, string Message)
    {
#if UNITY_IOS
            postMail(Address, Kenmei, Message);
#else
        string kenmeiOff = System.Uri.EscapeDataString(Kenmei);
        string messageOff = System.Uri.EscapeDataString(Message);
        string Url = $"mailto:{Address}?subject={kenmeiOff}&body={messageOff}";
        Application.OpenURL(Url);
#endif
    }
}

IOSのみ、プラグインを呼び出します。
他のプラットフォームはmailto機能できちんと改行されますので大丈夫です。
あとは宛先等の情報を引数にOpenMailerBaseを呼び出せばOKです。
※以下、呼び出す関数のサンプルコード

    void MakeMailer()
    {
        string to = "testAddressTo@gmail.com";
        string kenmei = "件名:テスト";
        string message = "▼本文\r\n" +
        "----------------------------\r\n" +
        "\r\n\r\n" +
        "----------------------------";
        OpenMailer mailCls = new OpenMailer();
        mailCls.OpenMailerBase(to, kenmei, message);
    }

参考サイト

SocialWorkerのプラグインはメール機能だけでなく、
TwitterやFaseBook連携も行っているようですので多機能でおすすめです!
github.com