Unityでメーラー機能を実装するとき、mailtoを使っていた人に悲報です。
IOS14.6以降、mailtoで改行コードが認識されない仕様になりました。
改行コード'%0D%0A'を使用すると、改行されない上に<BR>が表示されてしまいます。
developer.apple.com
詳細は上記サイトに載っていますが、
iOS 14.6以降のmailtoリンクでは、HTMLなどのリッチコンテンツのサポートが削除されました
とのことです。。。改行すらサポートしないのは致命的すぎませんか?
と思っちゃうのは私がハッカーに悩まされたことがないからでしょうか。。。
ということで今回はmailtoを利用していたメーラー機能に
IOSのみ別のやり方で、改行のサポートを行う実装方法を紹介します。
作成したアセット公開
github.com
アセットの内容は上記URLで公開しています。
ソースファイルと説明を一緒に見ていただけるとわかりやすいと思います。
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
- (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
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で以下の画像の設定を行います。
メーラープラグイン設定
ソース紹介【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);
}