2012-02-18 22 views
6

Tôi vừa nâng cấp lên 4.3 Xcode mới nhất. Tôi có plist.which của tôi là preprocessed và so với 4.2 không có vẻ làm việc nữa.Xcode 4.3 - preprocess plist không hoạt động nữa cho #define với "http: //"?

Tôi đặt Info.plist other pre-processor cờ -traditional (để có thể bỏ qua // được coi là nhận xét).

tôi đặt

#define MYSERVER http://127.0.0.1:1234/ 

và trong plist tôi

<key>myhost</key> 
    <string>MYSERVER</string> 

Khi tôi kiểm tra trong Xcode mới 4.3 tôi thấy bên trong NSDictionary *bundle = [[NSBundle mainBundle] infoDictionary];

myhost = "http:/ /127.0.0.1:1234/" 

Tôi có một cách nhanh chóng hack cho nó .

NSString *hack = [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"myhost"] stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    url = [NSURL URLWithString:hack]; 

Điều này làm cho ứng dụng của tôi hoạt động trở lại, nhưng tôi muốn có giải pháp sạch. Bất kỳ ý tưởng?

+0

Nhận xét trong lỗi clang nói rằng điều này là cố định (https://llvm.org/bugs/show_bug.cgi?id=12035), nhưng tính đến Xcode 7.2 nó không hoạt động đối với tôi. Tài liệu cho '-traditional' là ở đây: https://developer.apple.com/library/mac/technotes/tn2175/_index.html –

Trả lời

3

Đây thực sự là lỗi trong bộ tiền xử lý của clang được chuyển bằng Xcode 4.3 (clang 3.1) và nó ảnh hưởng đến tất cả tiền xử lý, không chỉ Info.plists. Tôi đã gửi một lỗi (LLVM bug 12035, rdar: // 10883862).

Giải pháp cho việc này là bắt buộc Xcode 4.3 sử dụng llvm-gcc để xử lý tiền tố Info.plist thay vì clang. Cách duy nhất tôi đã tìm thấy cho đến nay là để viết lại "cc" liên kết tượng trưng được sử dụng trong giai đoạn tiền xử lý Info.plist:

sudo ln -fs /usr/bin/llvm-gcc /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc

Để trở lại hack này, chỉ cần viết lại nó trở lại Clang: sudo ln -fs /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc

+0

Cảm ơn thông tin này. Tôi sẽ tiếp tục theo dõi lỗi bạn đã gửi và hy vọng nó sẽ được khắc phục trong thời gian ngắn. –

+0

Một giải pháp khác, không yêu cầu thay thế liên kết mềm cc, là đặt tất cả giá trị mở rộng macro Info.plist trong dấu ngoặc kép và cắt các trích dẫn khi đọc các giá trị khi chạy. Các giá trị được trích dẫn sẽ được bộ xử lý trước của clang bảo toàn. –

+0

cảm ơn. Điều đó tương tự như (tạm thời) hack :-) 'NSString * hack = [[[[[NSBundle mainBundle] infoDictionary] objectForKey: @" myhost "] stringByReplacingOccurrencesOfString: @" "withString: @" "];' –

0

Bạn có thể xem xét bỏ qua bộ xử lý trước và sử dụng PlistBuddy.

Something như thế này trong giai đoạn viết kịch của việc xây dựng nên làm việc:

#!/bin/sh 

MYSERVER = 'http://127.0.0.1:1234/' 

/usr/libexec/PlistBuddy -c "Set :myhost ${MYSERVER}" path/to/Info.plist 

Chú ý rằng nếu bạn làm điều đó trên ProejctName-Info.plist trong một thiết lập Xcode tiêu chuẩn, các tập tin sẽ được đánh dấu là sửa đổi bởi svn/github mỗi khi bạn xây dựng và tùy thuộc vào nhu cầu của bạn có thể không lý tưởng.

+0

cảm ơn, nhưng tôi có nhiều hơn' # define' tôi sử dụng '#if đã định nghĩa .... 'để chuyển đổi giữa các môi trường khác nhau. Di chuyển đến một công cụ khác sẽ không thẳng tiến. –

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