ios MFMessageComposeViewController ipod 崩溃

Posted

技术标签:

【中文标题】ios MFMessageComposeViewController ipod 崩溃【英文标题】:ios MFMessageComposeViewController ipod crash 【发布时间】:2013-12-19 11:55:24 【问题描述】:

您好,我正在使用MFMessageComposeViewController 在 iPhone 应用程序中发送消息。 由于这是一个 iPhone 应用程序,它也支持 iPod。当点击消息按钮时,应用程序崩溃,因为 iPod 上没有消息。那么有没有办法检查设备是否是 iPod,这样我就可以隐藏消息按钮,这样用户就不会点击 iPod 中的消息并崩溃。

这是我用于消息传递的代码。

- (IBAction)Message:(id)sender

MFMessageComposeViewController *messaging=[[MFMessageComposeViewController alloc]init];
messaging.messageComposeDelegate=self;
[messaging setBody:@"Will of the People""\n""http://bit.ly/1gZhZye"];

[self presentViewController:messaging animated:YES completion:nil];



- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result

[self dismissViewControllerAnimated:YES completion:^UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Done" message:nil delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
    [alert show];
];

这似乎在 iPhone 上运行良好。当用户使用 iPod 时,我需要一种方法来禁用此按钮。

【问题讨论】:

【参考方案1】:

您可以使用canSendText 类方法来执行此操作:

- (IBAction)Message:(id)sender

   if ([MFMessageComposeViewController  canSendText])
   
      MFMessageComposeViewController *messaging=[[MFMessageComposeViewController alloc]init];
      messaging.messageComposeDelegate=self;
      [messaging setBody:@"Will of the People""\n""http://bit.ly/1gZhZye"];
      [self presentViewController:messaging animated:YES completion:nil];
   

参考:

canSendText

返回一个布尔值,指示当前设备是否为 能够发送短信。 + (BOOL)canSendText

返回值

如果设备可以发送短信,则为“是”,如果不能,则为“否”。 讨论

在尝试显示消息之前始终调用此方法 组成视图控制器。设备可能无法发送消息,如果它 不支持消息传递或当前未配置为 发送信息。此方法仅适用于发送文本的能力 通过 iMessage、SMS 和 MMS 发送消息。

收到发送文本可用性更改的通知 消息,注册为观察者 MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification 通知。可用性

Available in ios 4.0 and later.

在 MFMessageComposeViewController.h 中声明

【讨论】:

你的意思是 canSendText 对吗?可能是你混合MFMessageComposeViewController和MFMailComposeViewController @JanakNirmal:谢谢 Janak,这是一个错字。 [MFMessageComposeViewController canSendText] 在我的 ipad 上返回 YES,所以它无法避免这个意外。【参考方案2】:

MFMEssageComposeViewController 上有一个方法:

if ([MFMessageComposeViewController canSendText]) 



else 
    NSLog(@"Cannot send text");

【讨论】:

【参考方案3】:
    NSString *deviceType = [UIDevice currentDevice].model;
    if ([deviceType hasPrefix:@"iPod"])
    
        //It's iPod;
        //Disable button
    

【讨论】:

【参考方案4】:

首先使用以下方式检测设备,如果设备不支持信使则显示警报。

您可以在此处获取有关不同设备检测的更多信息: Determine device (iPhone, iPod Touch) with iPhone SDK

- (IBAction)Message:(id)sender

   NSString *deviceType = [UIDevice currentDevice].model;

    if([deviceType isEqualToString:@"iPod Touch 5G"])  

         // here your alert view to show msg 


     else 

        if ([MFMessageComposeViewController  canSendText])
        
          MFMessageComposeViewController *messaging=[[MFMessageComposeViewController alloc]init];
          messaging.messageComposeDelegate=self;
         [messaging setBody:@"Will of the People""\n""http://bit.ly/1gZhZye"];
         [self presentViewController:messaging animated:YES completion:nil];
      
   

【讨论】:

【参考方案5】:

您可以使用UIDevice 类来检查设备类型

NSString *deviceType = [UIDevice currentDevice].model;

if([deviceType hasPrefix:@"iPod"])
    // it's an iPod

或者您可以使用[MFMessageComposeViewController canSendText] 来检查消息是否可以从设备发送

【讨论】:

@CW0007007 能否请您仔细阅读问题?它说他想禁用 iPod 设备的按钮。所以我回答了这个问题。我知道这不是正确的方法。 嗯,不,他想为 iPod 禁用它,因为它由于 iPod 无法发送文本而崩溃(这是他的特定用例)。我的方法是针对所有可能不支持发短信的设备的包罗万象的方法。而您的方法仅限于 iPod,如果以后添加多设备支持,将难以维护。 @PgmFreek 可能你应该像其他人一样建议使用 canSendText ,如果他需要禁用按钮而不是尝试像这样的其他解决方案..?【参考方案6】:
 -(IBAction)btnByEmailPressed:(id)sender
 
     if ([MFMailComposeViewController canSendMail] == NO)
 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"This device is not able to send mail or Email account is not configured." delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
       [alert show];
       return;
   
   else
   

       MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
       controller.mailComposeDelegate = self;
       [controller setTitle:@"Invitation"];
       [controller setSubject:@"My Subject"];
       [controller setMessageBody:@"Your Text" ishtml:YES];
       [self presentViewController:controller animated:YES completion:nil];
   


 - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 

[self becomeFirstResponder];
NSString *strMailResult;
switch (result)

    case MFMailComposeResultCancelled:
        strMailResult = NSLocalizedString(@"E-Mail Cancelled",@"");
        break;
    case MFMailComposeResultSaved:
        strMailResult = NSLocalizedString(@"E-Mail Saved",@"");
        break;
    case MFMailComposeResultSent:
        strMailResult = NSLocalizedString(@"E-Mail Sent",@"");
        break;
    case MFMailComposeResultFailed:
        strMailResult = NSLocalizedString(@"E-Mail Failed",@"");
        break;
    default:
        strMailResult = NSLocalizedString(@"E-Mail Not Sent",@"");
        break;

   UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"STEP-BY-STEP-STORY",@"") message:strMailResult delegate:self  cancelButtonTitle:NSLocalizedString(@"OK",@"") otherButtonTitles:nil];
   [alertView show];
   [self dismissViewControllerAnimated:YES completion:nil];

【讨论】:

以上是关于ios MFMessageComposeViewController ipod 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别