2010-06-30 13 views
6

Để hỗ trợ iPhone OS 3.x và 4.0 tôi lập trình điều khiển chức năng MFMessageComposeViewController như thế này (chỉ sử dụng nó nếu phiên bản hệ điều hành là 4.0 trở lên):Lập trình điều khiển các phiên bản hệ điều hành iPhone để kích hoạt chức năng cho cả OS 3.x và 4 - Vấn đề 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]; 
    } 
} 

Tuy nhiên, khi tôi cố gắng chạy nó trên iPhone 3.1.3 thiết bị, ngay lập tức tôi nhận được lỗi sau (thậm chí trước khi ứng dụng được nạp):

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 

dữ liệu Định dạng tạm thời không khả dụng, sẽ thử lại sau khi 'tiếp tục'. (Không an toàn để gọi dlopen vào thời điểm này.)

Tôi đang làm gì sai?

Trả lời

17

Bạn cần phải chắc chắn rằng bạn đang làm một vài điều:

Ở các cơ sở xây dựng của mục tiêu của bạn:

  • bộ cơ sở SDK cho iPhone Device 4,0
  • thiết lập hệ điều hành iPhone Triển khai mục tiêu cho iPhone Hệ điều hành 3.1.3 (hoặc thấp hơn)

Trong cài đặt chung của mục tiêu, trong Thư viện được liên kết, hãy thay đổi "Loại" bên cạnh MessageUI.framework thành Yếu.

Không nhập <MessageUI/MFMessageComposeViewController.h> hoặc nó sẽ gặp sự cố khi khởi chạy ở 3.x. Chỉ cần nhập <MessageUI/MessageUI.h>

tôi không biết là gì os_version_num, nhưng đây là đoạn code tôi sử dụng để kiểm tra sự sẵn có của 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

Ngôn ngữ đã thay đổi từ "yếu" thành "tùy chọn" trong Xcode 4. – ma11hew28

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

Bạn có thể sử dụng các loại MFMessageComposeViewController như trong:

MFMessageComposeViewController *controller; 

Nhưng bạn không thể sử dụng đối tượng chung MFMessageComposeViewController như sau:

[MFMessageComposeViewController alloc]; 

Thay vì sử dụng tra cứu lớp, do đó bạn không phải phụ thuộc vào mối liên kết:

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

Nếu bạn nhập <MessageUI/MessageUI.h> và thiết lập tài liệu tham khảo yếu để khuôn khổ MessageUI, bạn có thể trực tiếp gọi:

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

Trên iOS 3.1.2, bạn sẽ nhận được số không trong mệnh đề if và phương thức cũ sẽ được khởi chạy.

0

Tôi đã có cùng một vấn đề, và giải quyết nó một cách khác nhau:

Mặt phía trái của cửa sổ XCode của bạn,

  1. Nếu bạn cuộn xuống Bulls Eye với " mục tiêu "và mở rộng mà

  2. Mở rộng của bạn

  3. < kiểm soát> + < nhấp chuột> trên" Li nk Binary Với Libraries"

  4. Chọn "Add" -> "Khung hiện tại"

  5. Chọn "MessageUI.framework" và click vào "Add"

Đó nên thêm tin nhắn Giao diện người dùng cho ứng dụng của bạn, cho tôi biết nếu ứng dụng hoạt động.

+0

Trong xcode 4, bạn có thể thực hiện tương tự bằng cách nhấp vào tiêu đề dự án trong Trình duyệt tệp, chuyển đến mục tiêu, sau đó chuyển đến tab "Tạo giai đoạn". –

+0

Cảm ơn Andrew, không biết điều đó, tôi sẽ kiểm tra. – Khattab

1

Trong các tham số mục tiêu của bạn, chỉ cần đặt messageUI.framework để gõ 'yếu'

+0

cảm ơn rất nhiều. nếu bạn không làm điều này messageUI.framework để gõ 'yếu' thì bất kỳ câu trả lời ở trên sẽ không làm việc cho bạn. – priyanka

0

gì về nếu bạn có chức năng mà bạn chỉ muốn bao gồm điều kiện.

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

Ví dụ, nếu định nghĩa hàm chứa MFMessageViewController, làm thế nào để bạn thực hiện phần này có điều kiện (có nghĩa là, không gây ra một vấn đề với OS 3.x). Hay nó không phải là vấn đề?

Các vấn đề liên quan