In order to support iPhone OS 3.x and 4.0 I programmatically control MFMessageComposeViewController functionality like this (use it only if the OS version is 4.0 or above):
In your target parameters, simply set messageUI.framework to type 'weak'
You need to make sure you're doing a few things:
In your target's build settings:
In your target's general settings, under Linked Libraries, change the "Type" next to MessageUI.framework to Weak.
Don't import <MessageUI/MFMessageComposeViewController.h>
or it will crash on launch in 3.x. Just import <MessageUI/MessageUI.h>
I don't know what os_version_num is, but here's the code I use to test for the availability of MFMessageComposeViewController:
Class smsClass = (NSClassFromString(@"MFMessageComposeViewController"));
if (smsClass != nil && [MFMessageComposeViewController canSendText]) {
MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
controller.body = text;
controller.recipients = [NSArray arrayWithObjects: nil];
controller.messageComposeDelegate = self;
[self presentModalViewController:controller animated:YES];
[controller release];
}
Class theClass = NSClassFromString(@"MFMessageComposeViewController");
MFMessageComposeViewController *controller = theClass ? [[theClass alloc] init] : nil;
You can use the type MFMessageComposeViewController as in:
MFMessageComposeViewController *controller;
But you cannot use the global object MFMessageComposeViewController as in:
[MFMessageComposeViewController alloc];
Instead use the class lookup so you are not dependent on the linker:
[NSClassFromString(@"MFMessageComposeViewController") alloc];
I was having the same problem, and solved it a different way:
On the Left hand-side of your XCode window,
If you scroll down to the Bulls Eye with "Targets" and expand that
Expand your
< control > + < click > on "Link Binary With Libraries"
Choose "Add" --> "Existing Frameworks"
Choose "MessageUI.framework" and click on "Add"
That should add the Message UI to your app, tell me if it works.
What about if you have functions that you only want to include conditionally.
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller
didFinishWithResult:(MessageComposeResult)result {
[self dismissModalViewControllerAnimated:YES];
}
For example, if the function definition contained MFMessageViewController
, how do you make this part conditional (that is, not cause a problem with OS 3.x). Or is it not a problem at all?
If you import <MessageUI/MessageUI.h>
and set weak reference to MessageUI framework, you can directly call:
if ([MFMessageComposeViewController canSendText]) {
controller.body = body;
controller.recipients = [NSArray arrayWithObjects:number, nil];
controller.messageComposeDelegate = self;
[self presentModalViewController:controller animated:YES];
[controller release];
} else {
[[UIApplication sharedApplication] openURL: [NSURL URLWithString:[NSString stringWithFormat:@"sms:%@",number]]];
}
On iOS 3.1.2 you will get nil in the if clause and old method will be launched.