1

私はXamarinのプロジェクトをやっている、フォームにウィンドウの階層ではなく、私は私のアプリからSMSを送信するためにXam.Plugins.Messagingを統合しています。このために、私は以下のコードで自分のiOSプロジェクトでカスタムレンダラを作成しました:警告:ビューがXamarin.Forms

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を共有する機能が動作せず、デバッグログに「ビューがウィンドウ階層に表示されないようにしようとしました!

私はアプリを再起動する場合は、同じ機能が魔法のように動作します。私が間違っていたところからのアイデア?

答えて

0

私はこの問題は、あなたがAppDelegate NEWINGアップしているし、そこからShowAndSendSMSを呼び出しているという事実であると思います。 AppDelegateの新しいインスタンスを作成するのとは対照的に、iOSは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"); 
    } 
} 

そして、あなたは、今後あなたのSMSのヘルパーを使用することがありますので、最終的には、あなたのAppDelegate.csからShowAndSendSMSを削除します。

それがあなたに役立つかどうか教えてください。

+0

あなたが行く:https://www.dropbox.com/s/ncd9r2za3voeewu/AppDelegate.cs?dl=0 –

+0

ありがとう!また、どこでAppDelegate smsObj =新しいAppDelegate()行ですか?別のAppDelegateインスタンスを新しくするべきではありません。 ShowAndSendSMSをいくつかのSMSヘルパークラスにリファクタリングするか、MonoがスピンアップするAppDelegateインスタンスを保持する静的なシングルトンを作成し、コード全体でその参照を使用できます。個人的には、私はSMSのヘルパークラスと責任の分離の観点から行きたいと思います。 –

+0

私は私のiOSプロジェクトでカスタムレンダラーを作成して、次のようにAppDelegateのインスタンスを作成しています: 'public class SMS_Ios:PageRenderer { private readonly TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); OnElementChanged 保護オーバーライドボイド(VisualElementChangedEventArgs電子) {base.OnElementChanged(E); AppDelegate smsObj =新しいAppDelegate(); bool a = smsObj。ShowAndSendSMS(新しい文字列[] {"123"}、 "こんにちは"); } } } –

0

あなたはPCLとあなたのプラットフォームでXam.Plugins.Messagingパッケージをすでにインストールしている場合。 PCLのAPIを使用して、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"); 

参考:Messaging Plugin for Xamarin and Windows。ここで

+0

私はその解決策を試しましたが、iOSのMessagingパッケージではうまく動作しません。 Androidでは完全に動作しますが、iOSでは最初のアプリの起動には向いていません。 –

+0

メッセージングパッケージがうまく動作します。どこで 'smsMessenger.SendSms()'をトリガーしましたか? –

+0

こんにちはKevin、私は共有アプリケーションプロジェクトのコンテンツページでsmsMessenger.SendSms()を起動しています。 (smsMessenger.CanSendSms) ' ' smsMessenger.SendSms( "smsMessenger.CanSendSms")の場合は、 "var smsMessenger = CrossMessaging.Current.SmsMessenger;" "var message =" abc ";ボタンをクリックして、 "、メッセージ); 'また、使用しているプラ​​グインのバージョンを教えてください。 –