【Unity】IOS14.6からmailtoで改行コードが使えなくなった対策
Unityでメーラー機能を実装するとき、mailtoを使っていた人に悲報です。
IOS14.6以降、mailtoで改行コードが認識されない仕様になりました。
改行コード'%0D%0A'を使用すると、改行されない上に<BR>が表示されてしまいます。
developer.apple.com
詳細は上記サイトに載っていますが、
とのことです。。。改行すらサポートしないのは致命的すぎませんか?
と思っちゃうのは私がハッカーに悩まされたことがないからでしょうか。。。
ということで今回は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)]; } }
ソース紹介【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