Программно управляйте версиями iPhone OS, чтобы включить функции для обеих ОС 3.x и 4-проблема MFMessageComposeViewController

для того, чтобы поддержать iPhone OS 3.x и 4.0 я программно контролирую функциональность MFMessageComposeViewController следующим образом (используйте его, только если версия ОС 4.0 или выше):

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

но, когда я пытаюсь запустить его на устройстве iPhone 3.1.3, я сразу же получаю следующую ошибку (даже до загрузки приложения):

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

Форматеры данных временно недоступны, повторите попытку после "продолжить". (Небезопасно вызывать dlopen при этом время.)

что я делаю не так?

6 ответов


вы должны убедиться, что вы делаете несколько вещей:

в настройках сборки вашей цели:

  • установить базовый SDK для iPhone устройства 4.0
  • установите цель развертывания iPhone OS на iPhone OS 3.1.3 (или ниже)

в общих настройках вашей цели в разделе Связанные библиотеки измените "тип" рядом с MessageUI.рамки для слабых.

не импорт <MessageUI/MFMessageComposeViewController.h> или он рухнет при запуске в 3.х. Просто импорт <MessageUI/MessageUI.h>

Я не знаю, что такое os_version_num, но вот код, который я использую для проверки доступности 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;

вы можете использовать тип MFMessageComposeViewController как в:

MFMessageComposeViewController *controller;

но вы не можете использовать глобальный объект MFMessageComposeViewController как в:

[MFMessageComposeViewController alloc];

вместо этого используйте поиск класса, чтобы вы не зависели от компоновщика:

[NSClassFromString(@"MFMessageComposeViewController") alloc];

в ваших целевых параметрах просто установите messageUI.фреймворк для ввода 'weak'


Если вы импортируете <MessageUI/MessageUI.h> и установить слабую ссылку на messageui framework, вы можете напрямую вызвать:

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

в iOS 3.1.2 вы получите ноль в предложении if и будет запущен старый метод.


У меня была та же проблема, и я решил ее по-другому:

в левой части окна XCode,

  1. Если вы прокрутите вниз до бычьего глаза с помощью "Targets" и разверните это

  2. расширить свой

  3. + on "связать двоичный файл с библиотеками"

  4. Выберите "Добавить" -- > "Существующие Фреймворки"

  5. выбрать "MessageUI.framework "и нажмите кнопку "Добавить"

Это должно добавить сообщение UI в ваше приложение, скажите мне, если он работает.


Что делать, если у вас есть функции, которые необходимо включить только условно.

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

например, если определение функции MFMessageViewController, Как вы делаете эту часть условной (то есть не вызываете проблемы с OS 3.икс.) Или это вообще не проблема?