2009-11-20 37 views
6

Giờ đây, kiến ​​thức công khai rằng các lần gửi App Store đang được thử nghiệm để sử dụng API riêng tư, tôi cần đặt câu hỏi ... chính xác API riêng tư là gì để tôi có thể tránh chúng?API của Apple và riêng tư

Trả lời

14

API riêng tư là API không được ghi trong SDK. Ví dụ, một lớp khung công tác có thể khai báo một phương thức không được sử dụng bởi các nhà phát triển bên ngoài. Hành vi của một API riêng tư không được đảm bảo. Bạn thậm chí không thể chắc chắn rằng phương pháp sẽ có trong các bản cập nhật trong tương lai của nền tảng này. Tuyên bố của nó có thể không có sẵn trong các tệp tiêu đề SDK được phân phối công khai. Nếu bạn gắn bó với mọi thứ được xác định công khai trong tài liệu SDK, bạn sẽ OK.

+0

Được rồi. Cảm ơn tất cả vì phản hồi nhanh! – RyJ

+0

Vì vậy, thay vì gọi một phương thức trong một API riêng, sự khác biệt của bạn khi tạo phương thức của riêng bạn là gì? Tôi có đúng khi nói rằng đó không phải là vấn đề gọi một số phương thức API nhất định, thực tế là bạn đang cố gắng làm những việc mà họ không muốn bạn làm? –

+0

@Nick Không nhất thiết. Để ứng dụng được Apple phê duyệt, bạn nên có cả hai điều sau: 1. chỉ thực hiện những việc mà họ chưa hạn chế bạn, bất kể phương thức. 2. thực hiện chúng thông qua một cơ chế hợp lệ. Có thể có những điều có thể làm được nói chung, nhưng bạn không thể gọi một API riêng trực tiếp để hoàn thành chúng. Nghi thức là một API riêng tư có thể thay đổi trong các phiên bản trong tương lai và phá vỡ ứng dụng của bạn, trong khi viết một phương thức tùy chỉnh trên một API công cộng không được phép phá vỡ với bản nâng cấp iOS. –

1

Thường là do họ không có mặt trong tiêu đề SDK. Một trong những quy ước của Apple là hướng dẫn các tên phương thức ObjC với dấu gạch dưới.

5

Bạn sẽ gặp khó khăn khi sử dụng API riêng tư một cách tình cờ. Chúng không được ghi lại trong tài liệu SDK và chúng không hiển thị trong các đề xuất hoàn thành mã của XCode.

Lý do điều này đã trở thành tin tức gần đây là người sáng tạo một khung được sử dụng bởi một số ứng dụng sử dụng API riêng tư, vì vậy khi nhà phát triển đã bao gồm khung của mình cập nhật ứng dụng của họ, họ đã bị từ chối (mặc dù các nhà phát triển không sử dụng API riêng tư, khuôn khổ mà họ đã thêm vào ứng dụng của họ đã làm).

Đó là về cách duy nhất bạn có thể vô tình sử dụng API riêng tư.

+0

khuôn khổ nào? –

+1

Nó nằm trong khuôn khổ ba20, nhưng vấn đề đã được khắc phục từ lâu. Câu trả lời này đã hơn hai tuổi. – mmc

0

Không khó để bị từ chối bởi cái gọi là "sử dụng API riêng tư". Hãy thử sử dụng sau đây là thuộc tính Core Data và nó sẽ bị từ chối:

  • colorIndex
  • xảy ra
  • id

Nó cho thấy cách các robot quét API.

3

Đây không chỉ là các API riêng tư có thể khiến ứng dụng của bạn bị từ chối. Việc sử dụng các thành viên không có giấy tờ của một API công khai có thể khiến ứng dụng của bạn bị từ chối. Ví dụ, thư viện ba20 (kể từ khi cố định) truy cập _phase và các thành viên khác của UITouch trong một thể loại.

Họ cũng có thể phát hiện các cuộc gọi đến tin thành viên qua performSelector, như sau đây cũng đánh dấu một sự từ chối:

UIWindow* window = [UIApplication sharedApplication].keyWindow] 
return !![window performSelector:@selector(firstResponder)]; 

đáng lo ngại hơn, nếu bạn thực hiện công việc ứng dụng của bạn dưới 3.1 và 3.0 và khi chạy trong 3,0 bạn không sử dụng bất kỳ công cụ nào trong 3,1 ứng dụng của bạn vẫn có thể bị từ chối. Ví dụ có thể là cameraOverlayView của UIImagePickerController (xem here). Đây là loại khó hiểu.

1

Một công cụ tuyệt vời để sử dụng trước khi bạn gửi ứng dụng của mình là Trình quét ứng dụng. Nó quét tập tin .app của bạn để sử dụng API tin và cho bạn thấy những gì phương pháp chữ ký phù hợp và những gì các lớp học các phương pháp đó là trong

liên kết -.>http://www.chimpstudios.com/appscanner/

+0

Có vẻ như trang web này đang ngừng hoạt động. Có ai biết về bất kỳ ứng dụng nào khác thực hiện chức năng tương tự không? – rvijay007

1

Ứng dụng của tôi đã bị từ chối bởi táo vì sử dụng API tin .Đây là mã,

Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl"); 

    id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)]; 

    [activeInstance performSelector:@selector(dismissKeyboard)]; 
Các vấn đề liên quan