1

Xamarin 프로젝트에서 Forms를하고 Xam.Plugins.Messaging을 통합하여 내 응용 프로그램에서 SMS를 보냈습니다. 이를 위해 나는 아래의 코드 내 아이폰 OS 프로젝트에서 사용자 정의 렌더러를 만들었습니다경고 : 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를 새로 만들고 거기에서 ShowAndSendSMS를 호출하고 있다는 사실과 관련이 있다고 생각합니다. iOS는 AppDelegate를 처음 시작할 때 AppDelegate를 새로 만들 예정이며 AppDelegate의 새 인스턴스를 만드는 것과는 반대로 항상이를 사용해야합니다 (적어도 AppDelegate-instance 패턴을 요구하는 상황은 본 적이 없습니다.).

이 같은 프로젝트에서 헬퍼 클래스를 만듭니다 (정말 단어 "도우미"싫어,하지만이 점 옆의 그것은 당신의 프로젝트에 대한 피팅 뭔가 이름) : 그래서,이 시도

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 = new AppDelegate() 줄은 어디에 있습니까? 다른 AppDelegate 인스턴스를 새로 작성하지 않아야합니다. 일부 SMS 도우미 클래스로 ShowAndSendSMS를 리팩토링하거나 Mono가 회전하는 AppDelegate 인스턴스를 보유 할 정적 싱글 톤을 만들어 코드 전체에서 해당 참조를 사용할 수 있습니다. 개인적으로 책임 분리 관점에서 SMS 도우미 클래스를 사용합니다. –

+0

그래서 아래의 AppDelegate 인스턴스를 생성하는 iOS 프로젝트에서 사용자 정의 렌더러를 만들었습니다. public class SMS_Ios : PageRenderer { private readonly TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 보호 된 무효 OnElementChanged (VisualElementChangedEventArgs e) { 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의 메시징 패키지에서만 작동하지 않습니다. 그것은 안드로이드에서 완벽하게 작동하지만, iOS에서는 최초의 앱 실행을 위해 작동하지 않습니다. –

+0

메시징 패키지가 제대로 작동합니다. 어디서 'smsMessenger.SendSms()'를 실행 시켰습니까? –

+0

안녕하세요 Kevin, 공유 응용 프로그램 프로젝트의 콘텐츠 페이지에서 smsMessenger.SendSms()가 실행되고 있습니다. (smsMessenger.CanSendSms) ' 'smsMessenger.SendSms ("var smsMessenger = CrossMessaging.Current.SmsMessenger;"var message = "abc") " " ", 메시지);' 또한 사용중인 플러그인의 버전을 알려주시겠습니까? –

관련 문제