简体   繁体   English

从iOS SDK发送电子邮件

[英]Sending email from the iOS sdk

I am trying to send email from within my iOS app. 我正在尝试从iOS应用程序中发送电子邮件。

The idea is to have one class SendMessage which all classes use to send email from within the app. 想法是拥有一个SendMessage类,所有类都使用该类从应用程序内发送电子邮件。 It is a subclass of NSObject and is a MFMailComposeViewControllerDelegate 它是NSObject的子类,并且是MFMailComposeViewControllerDelegate

This is what the SendMessage class looks like 这就是SendMessage类的样子

@implementation SendMessage

- (void) sendEmailFromViewController : (UIViewController *)viewController withSubject : (NSString *) subject withRecipient : (NSString *)recipient withMessage : (NSString *)message withCompletionBlock : (void(^)(void))completionBlock withFailure : (void(^)(void))failure {

    self.viewController = viewController;

    if (![MFMailComposeViewController canSendMail]){
        if (failure)
            failure();
    }
    else {
        MFMailComposeViewController *messageController = [[MFMailComposeViewController alloc] init];
        messageController.mailComposeDelegate = self.viewController;
        [messageController setSubject:subject];
        [messageController setToRecipients:[NSArray arrayWithObject:recipient]];
        [messageController setMessageBody:message isHTML:NO];

        [self.viewController presentModalViewController:messageController animated:YES];

    }
}

-(void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [self.viewController dismissViewControllerAnimated:YES completion:nil];
}

@end

I am trying to call the class using: 我试图使用以下方法来调用该类:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 3) {
        SendMessage *sendFeedback = [[SendMessage alloc] init];
        [sendFeedback sendEmailFromViewController:self withSubject:@"App Feedback" withRecipient:@"ashisha@moj.io" withMessage:@"This is app feedback" withCompletionBlock:nil withFailure:nil];
    }
}

The problem is that although I am able to send the email, the delegate method is not being called. 问题是,尽管我能够发送电子邮件,但未调用委托方法。 How do I fix it ? 我如何解决它 ?

您的委托是UIViewController ,因此在此实现mailComposeController:didFinishWithResult:error委托方法。

I think the problem is that your object sendFeedback is released at the end of the block. 我认为问题在于您的对象sendFeedback在该块的末尾被释放。

The best solution is to create singleton object and than use it 最好的解决方案是创建单例对象并使用它

In the SendMessage.h file add SendMessage.h文件中添加

+ (instancetype) sharedManager;

In the SendMessage.m file add SendMessage.m文件中添加

+ (instancetype) sharedManager{
    static SendMessage* instance = nil;
    if(!instance){
        instance = [[SendMessage alloc] init];
    }
    return instance;
}

Than you can use your singleton anywhere in the code 比您可以在代码中的任何地方使用单例

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 3) {
        SendMessage *sendFeedback = [SendMessage sharedManager];
        [sendFeedback sendEmailFromViewController:self withSubject:@"App Feedback" withRecipient:@"ashisha@moj.io" withMessage:@"This is app feedback" withCompletionBlock:nil withFailure:nil];
    }
}

Also messageController.mailComposeDelegate must be set to self 同样, messageController.mailComposeDelegate必须设置为self

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM