2010-06-30 11 views
6

Para soportar iPhone OS 3.xy 4.0, controlo programáticamente la funcionalidad MFMessageComposeViewController de esta manera (úselo solo si la versión del SO es 4.0 o superior):Controlar mediante programación las versiones de iPhone OS para habilitar las funciones para OS 3.x y 4 - Problema MFMessageComposeViewController

// if iPhone OS version >= 4.0 
if (os_version_num >= 4) { 
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init]; 
    if([MFMessageComposeViewController canSendText]) 
    { 
     controller.body = text; 
     controller.recipients = [NSArray arrayWithObjects: nil]; 
     controller.messageComposeDelegate = self; 
     [self presentModalViewController:controller animated:YES]; 
     [controller release]; 
    } 
} 

embargo, cuando intento ejecutarlo en iPhone 3.1.3 dispositivo, inmediatamente me sale el siguiente error (incluso antes de la aplicación se carga):

dyld: Symbol not found: _OBJC_CLASS_$_MFMessageComposeViewController 
    Referenced from: /var/mobile/Applications/7232C474-FAD5-4E28-ABC5-8520F62300B0/TextMe.app/TextMe 
    Expected in: /System/Library/Frameworks/MessageUI.framework/MessageUI 

datos Formateadores temporalmente no disponible, se volverá a intentar después de un 'continuar'. (No es seguro llamar a Dlopen en este momento)

¿Qué estoy haciendo mal?

Respuesta

17

usted necesita para asegurarse de que está haciendo un par de cosas:

En configuración de generación de su objetivo:

  • conjunto Base SDK para iPhone de dispositivos 4.0
  • establecer iPhone OS Destino de despliegue de iPhone OS 3.1.3 (o inferior)

En la configuración general de su destino, en Bibliotecas vinculadas, cambie el "Tipo" junto a MessageUI.framework a Débil.

No importe <MessageUI/MFMessageComposeViewController.h> o se bloqueará al iniciarse en 3.x. Sólo tiene que importar <MessageUI/MessageUI.h>

No sé lo que os_version_num es, pero aquí está el código que utilizo para comprobar la disponibilidad de 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];     
} 
+0

El lenguaje ha cambiado de "débil" a "opcional" en Xcode 4. – ma11hew28

2
Class theClass = NSClassFromString(@"MFMessageComposeViewController"); 
MFMessageComposeViewController *controller = theClass ? [[theClass alloc] init] : nil; 

Usted puede utilizar el tipo MFMessageComposeViewController como en:

MFMessageComposeViewController *controller; 

pero no se puede utilizar el objeto global MFMessageComposeViewController como en:

[MFMessageComposeViewController alloc]; 

usar en su lugar las operaciones de búsqueda de clase por lo que no dependen del enlazador:

[NSClassFromString(@"MFMessageComposeViewController") alloc]; 
0

Si importa <MessageUI/MessageUI.h> y configurar referencia débil al marco MessageUI, puede llamar directamente:

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]]]; 
    } 

En iOS 3.1.2 obtendrá nil en la cláusula if y se lanzará el método anterior.

0

que estaba teniendo el mismo problema y lo resolvió de una manera diferente:

En el lado izquierdo de la ventana de XCode,

  1. Si se desplaza hacia el ojo de toros con " objetivos "y ampliar esa

  2. ampliar su

  3. < de control> + clic> < en" Li nk binario con Bibliotecas"

  4. seleccione "Agregar" -> "Existing Frameworks"

  5. Elija "MessageUI.framework" y haga clic en "Añadir"

Eso debe añadir el mensaje UI a su aplicación, dígame si funciona.

+0

En xcode 4, puede hacer casi lo mismo haciendo clic en el encabezado de su proyecto en el Explorador de archivos, yendo a su destino y luego yendo a la pestaña "Crear Fases". –

+0

Gracias Andrew, no lo sabía, lo comprobaré. – Khattab

1

En sus parámetros de destino, basta con establecer messageUI.framework para escribir 'débil'

+0

muchas gracias. Si no haces este mensajeUI.framework para escribir 'weak', entonces cualquier respuesta anterior no funcionará para ti. – priyanka

0

¿Qué pasa si usted tiene funciones que sólo se desee incluir condicionalmente.

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller 
       didFinishWithResult:(MessageComposeResult)result { 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Por ejemplo, si la definición de la función contenía MFMessageViewController, ¿cómo hacer que esta parte condicional (es decir, no causar un problema con 3.x OS). ¿O no es un problema en absoluto?