我正在做一个Xamarin项目,Forms和我已经集成了Xam.Plugins.Messaging从我的应用程序发送短信。为此,我在iOS项目中创建了一个自定义渲染器,代码如下:
AppDelegate smsObj = new AppDelegate();
bool a= smsObj.ShowAndSendSMS(new string[] { "123" }, "Hi there");
在我的AppDelegate中,我有以下代码:
public bool ShowAndSendSMS(string[] recipients, string body)
{
UIViewController sms = new UIViewController();
if (MFMessageComposeViewController.CanSendText)
{
MFMessageComposeViewController message = new MFMessageComposeViewController();
message.Finished += (sender, e) => {
message.DismissViewController(true, null);
};
message.Body = body;
message.Recipients = recipients;
sms.PresentModalViewController(message, false);
}
return true;
}
我面临的问题是我第一次启动应用程序时,共享SMS的功能不起作用,调试日志会给出警告,例如“尝试显示其视图不在窗口层次结构中!”< / p>
但是,如果我重新启动应用程序,相同的功能就像魅力一样。我犯错误的任何想法?
答案 0 :(得分:0)
我认为问题在于你正在新建AppDelegate并从那里调用ShowAndSendSMS。在应用程序启动时iOS会为你推出新的AppDelegate,你应该总是使用它,而不是创建一个新的AppDelegate实例(至少我从未见过需要多AppDelegate实例模式的情况) )。所以,试试这个:
在你的项目中创建一个这样的辅助类(我不太喜欢“帮助器”这个词,但这不是重点;请将它命名为适合你项目的东西):
using Foundation;
using UIKit;
public class SmsHelper
{
public bool ShowAndSendSMS(string[] recipients, string body)
{
if (MFMessageComposeViewController.CanSendText)
{
UIViewController sms = new UIViewController();
MFMessageComposeViewController message = new MFMessageComposeViewController();
message.Finished += (sender, e) => {
message.DismissViewController(true, null);
};
message.Body = body;
message.Recipients = recipients;
sms.PresentModalViewController(message, false);
}
return true;
}
}
然后更改您的页面渲染器以使用它:
public class SMS_Ios: PageRenderer
{
private readonly TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
SmsHelper smsObj = new SmsHelper();
bool a = smsObj.ShowAndSendSMS(new string[] {"123"}, "Hi there");
}
}
最后,从你的AppDelegate.cs中删除ShowAndSendSMS,因为你将来会使用你的短信助手。
请告诉我这是否适合您。
答案 1 :(得分:0)
如果您已在PCL和平台中安装了Xam.Plugins.Messaging
软件包。你可以在PCL中使用它来实现它,而不需要在iOS平台上使用任何特殊代码。
您可以在PCL中使用Xam.Plugins.Messaging
的API,如下所示:
// Send Sms
var smsMessenger = CrossMessaging.Current.SmsMessenger;
if (smsMessenger.CanSendSms)
smsMessenger.SendSms("+27213894839493", "Well hello there from Xam.Messaging.Plugin");