實際上我用一個依存服務,使我有過什麼,我可以向郵件客戶端更多的控制。
首先我創建了一個接口供被稱爲IEmailService的依賴性服務使用。
public interface IEmailService
{
void CreateEmail(List<string> emailAddresses, List<string> ccs, string subject, string body, string htmlBody);
}
我的依存服務的Android看起來是這樣的:
[assembly: Xamarin.Forms.Dependency(typeof(EmailService))]
namespace Droid.Services
{
public class EmailService : IEmailService
{
public void CreateEmail(List<string> emailAddresses, List<string> ccs, string subject, string body, string htmlBody)
{
var email = new Intent(Android.Content.Intent.ActionSend);
if (emailAddresses?.Count > 0)
{
email.PutExtra(Android.Content.Intent.ExtraEmail, emailAddresses.ToArray());
}
if (ccs?.Count > 0)
{
email.PutExtra(Android.Content.Intent.ExtraCc, ccs.ToArray());
}
email.PutExtra (Android.Content.Intent.ExtraSubject, subject);
email.PutExtra (Android.Content.Intent.ExtraText, body);
email.PutExtra (Android.Content.Intent.ExtraHtmlText, htmlBody);
email.SetType ("message/rfc822");
MainActivity.SharedInstance.StartActivity(email);
}
}
}
對於iOS:
[assembly: Xamarin.Forms.Dependency(typeof(EmailService))]
namespace iOS.Services
{
public class EmailService : NSObject, IEmailService, IMFMailComposeViewControllerDelegate
{
public void CreateEmail(List<string> emailAddresses, List<string> ccs, string subject, string body, string htmlBody)
{
var vc = new MFMailComposeViewController();
vc.MailComposeDelegate = this;
if(emailAddresses?.Count > 0)
{
vc.SetToRecipients(emailAddresses.ToArray());
}
if(ccs?.Count > 0)
{
vc.SetCcRecipients(ccs.ToArray());
}
vc.SetSubject(subject);
vc.SetMessageBody(htmlBody, true);
vc.Finished += (sender, e) =>
{
vc.DismissModalViewController(true);
};
UIApplication.SharedApplication.Windows[0].
RootViewController.PresentViewController(vc, true, null);
}
}
}
然後我就可以把這個在我的代碼:
DependencyService.Get<IEmailService>().CreateEmail(recipients, ccs, subject, body, bodyHtml);
這將打開每個郵件客戶端帶有to,subject和body字段的平臺可以選擇性地出現。
我希望有幫助。
Android模擬器說:'不支持的操作 - 該操作目前不支持。' – PaxForce
檢查您是否在模擬器中配置了郵件客戶端,並嘗試使用真實設備。 – apineda
當然可以。感謝名單。 – PaxForce