Question

This is some code from my sms plugin for phonegap. I'm trying to make callbacks work properly: https://github.com/aharris88/phonegap-sms-plugin/issues/11

Here's the code I'm working on. You can see that I get the callback function at the beginning of the send method like this:

NSString* callback = command.callbackId;

Then I present an MFMessageComposeViewController and I need to call that callback when it finishes. So I'm using the messageComposeViewController:didFinishWithResult:, but how can I access that callback function that I need to call?

#import "Sms.h"
#import <Cordova/NSArray+Comparisons.h>

@implementation Sms

- (CDVPlugin *)initWithWebView:(UIWebView *)theWebView {
    self = (Sms *)[super initWithWebView:theWebView];
    return self;
}

- (void)send:(CDVInvokedUrlCommand*)command {

    NSString* callback = command.callbackId;

    if(![MFMessageComposeViewController canSendText]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Notice"
                                                        message:@"SMS Text not available."
                                                       delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        return;
    }

    MFMessageComposeViewController* composeViewController = [[MFMessageComposeViewController alloc] init];
    composeViewController.messageComposeDelegate = self;

    NSString* body = [command.arguments objectAtIndex:1];
    if (body != nil) {
        [composeViewController setBody:body];
    }

    NSArray* recipients = [command.arguments objectAtIndex:0];
    if (recipients != nil) {
        [composeViewController setRecipients:recipients];
    }

    [self.viewController presentViewController:composeViewController animated:YES completion:nil];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}

#pragma mark - MFMessageComposeViewControllerDelegate Implementation
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {

    int webviewResult = 0;
    CDVPluginResult* pluginResult = nil;

    switch(result) {
        case MessageComposeResultCancelled:
            webviewResult = 0;
            break;
        case MessageComposeResultSent:
            webviewResult = 1;
            break;
        case MessageComposeResultFailed:
            webviewResult = 2;
            break;
        default:
            webviewResult = 3;
            break;
    }

    [self.viewController dismissViewControllerAnimated:YES completion:nil];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];

    if (webviewResult == 1) {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
    } else {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Arg was null"];
    }
    [self.commandDelegate sendPluginResult:pluginResult callbackId:callback];
}

@end
Was it helpful?

Solution

You'll want to store the callback ID as a property on the class.

@interface Sms

@property (nonatomic, strong) NSString *callbackId

@end

And then store it when you are in your send method.

- (void)send:(CDVInvokedUrlCommand*)command {

    self.callbackId = command.callbackId;

You can then access it again from your delegate method:

NSString *callbackId = self.callbackId;

You should be good to go.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top