2010-02-17 37 views

Trả lời

6

Nếu bạn xóa ứng dụng của mình khỏi thiết bị, tất cả những gì bạn phải làm là thử gửi một thông báo tới thiết bị đó và lần tiếp theo bạn kết nối với máy chủ phản hồi, thiết bị sẽ trả về thiết bị đó. Sau đó nó sẽ không trả lại thiết bị cho đến khi bạn cố gắng gửi thông báo khác đến thiết bị đó.

Ngoài ra, nếu bạn gửi nhiều thông báo đến một thiết bị giữa các kết nối với máy chủ phản hồi, thiết bị sẽ được trả lại cho mọi thông báo đã bị bỏ qua.

+3

Không hoạt động ở chế độ hộp cát. Tôi không bao giờ nhận được phản hồi ... – jjxtra

+0

Xem nhận xét của DougC –

4

Tôi nhận ra câu trả lời đã được chấp nhận cho điều này nhưng để thực hiện vòng kiểm tra đầu tiên mà không phải liên tục cài đặt & xóa ứng dụng của tôi khỏi điện thoại/ipod của tôi Tôi đã tạo một tập lệnh ruby ​​RẤT đơn giản để hoạt động như máy chủ phản hồi. Tôi đã cấu hình lớp APNS ruby ​​của mình để kết nối với máy chủ này thay vì (localhost: 2196) và đọc từ nó. Tôi đã không bắt đầu một kết nối SSL vì vậy tôi chỉ sử dụng các ổ cắm cơ sở để thay thế. Dưới đây là kịch bản tôi đã sử dụng để 'lưu trữ' máy chủ.

#!/usr/bin/env ruby 

require 'socket' 

puts 'Opening server' 
server = TCPServer.open(2196) 

loop { 
    puts 'Waiting for connection' 
    client = server.accept 

    puts 'Connected preparing data' 
    data = [1, 2, 3, 4, 0, 32, ['d41c3767074f541814c2207b78f72e538569cb39eae60a8c4a8677549819e174']] 
    puts 'Data for delivery: ' + data.inspect 

    begin 
     data[6] = data[6].pack('H*') 
     data = data.pack('c6a*') 

     loop { 
      puts 'Writing Data' 
      client.write data 

      puts 'Sleeping for 5 seconds' 
      sleep 5 
     } 
    rescue 
    end 
    puts 'Done writing, closing' 
    client.close 
} 

Tập lệnh này sẽ nghe và khi nhận được kết nối mỗi 5 giây ghi gói vào ổ cắm. Nếu ổ cắm kết nối đóng (ví dụ bạn giết quá trình phản hồi của bạn) thì tập lệnh này sẽ đặt lại và chờ kết nối mới.

Hãy nhớ, không sử dụng công cụ kết nối SSL chỉ là ổ cắm ruby ​​chuẩn. Chúc may mắn!

+0

c: \ telnet localhost 2196 -> works. c: \ telnet 127.0.0.1 2196 -> không hoạt động Rất tiếc. tại sao điều này lại là? Ngoài ra, Indy TcpClient cho tôi kết nối bị từ chối. –

+1

@ T.S Lỗi có nghĩa là máy chủ không nghe trên 127.0.0.1. 'localhost' không nhất thiết chỉ là 127.0.0.1, các truy vấn tra cứu thông qua' gethostbyname() 'hoặc' getaddrinfo() 'có thể giải quyết nó thành các IP cục bộ thực tế, mà' telnet' sẽ thử kết nối đến khi thành công. Nhưng Indy chỉ xử lý 'localhost' là 127.0.0.1 mà không cần cố gắng giải quyết nó một cách tự động. Khi Indy giải quyết một tên máy chủ, nó không cố gắng kết nối với tất cả các IP được báo cáo. Đó là một mục todo. –

+0

Cố định bằng cách thay thế dòng này: "" server = TCPServer.open ("127.0.0.1", 2196) "" –

11

Tôi nghĩ rằng từ vòng đầu tiên của câu hỏi "Có bu làm thế nào để bạn có được một cái gì đó để hiển thị ở đó?" Thực sự đến từ thực tế là, các xét nghiệm của ông đã không trở về bất kỳ thiết bị, tức là, mặc dù ông có thể đã có các thông báo được gửi thành công đến iPhone/iPad, bất cứ khi nào anh truy vấn máy chủ FB, không có gì trở lại, chính xác vì ứng dụng chưa bao giờ bị xóa khỏi thiết bị, do đó máy chủ chỉ vui vẻ trả lời "0 thiết bị được tìm thấy" (ví dụ) vì không có thiết bị nào không nhận được thông báo.

Vì vậy, khi ứng dụng bị xóa khỏi thiết bị, chỉ khi đó, máy chủ thông báo sẽ cung cấp phản hồi, tức là cuối cùng nó sẽ trả lời bằng danh sách thiết bị đã xóa ứng dụng.

Ý tưởng về máy chủ cục bộ cũng khá tốt.

-Alex

==============

Đây là một tác dụng phụ khó chịu trên đề nghị của Apple để giữ ít nhất một đẩy bật ứng dụng. Đây là gợi ý của tôi đối với tài liệu được đăng trên luồng:

Trên "Sự cố với máy chủ phản hồi", thật thú vị khi lưu ý hai trường hợp: 1) ứng dụng được triển khai tới thiết bị thực, ở chế độ sản xuất; 2) ứng dụng được triển khai tới thiết bị phát triển, tới hộp cát;

Trong 1) gợi ý để lại một ứng dụng cuối cùng (tôi mong đợi nó) đúng và sẽ hoạt động như mô tả; không có vấn đề ở đây.

Trên 2), người dùng phải đảm bảo ứng dụng cuối cùng cũng là một ứng dụng phát triển. Hay nói cách khác, để làm cho mọi thứ trở nên đơn giản hơn, hãy có một "ứng dụng hộp cát" thứ hai chỉ có ở đó để nhấn "công tắc người cuối cùng".Vấn đề tôi gặp phải là khi tôi xóa ứng dụng phát triển của mình, không có gì xảy ra trên máy chủ phản hồi sandbox, mặc dù có các ứng dụng hỗ trợ push khác trên thiết bị, tuy nhiên chúng là tất cả các ứng dụng sản xuất, do đó, chúng sẽ "báo cáo" (nếu bạn có thể nói như vậy) với máy chủ phản hồi sản xuất.

Bản sao thứ hai của ứng dụng của bạn, (ứng dụng hộp cát) là những gì chúng tôi muốn có, để có thể giữ kết nối liên tục với máy chủ hộp cát ... khi bạn xóa ứng dụng của mình hy vọng sẽ báo cáo cho sandbox và bạn có thể làm thử nghiệm thực tế của mình.

Hy vọng điều này là chính xác ... sẽ kiểm tra tông màu.

+8

Tôi có thể xác nhận rằng bạn cần một ứng dụng thứ hai trên thiết bị đang sử dụng máy chủ hộp cát để có được phản hồi về ứng dụng bạn đang thử nghiệm. Điều này có thể chỉ đơn giản là một ứng dụng xương trần với dòng: [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert]; trong phương thức didFinishLaunchingWithOptions của ủy nhiệm ứng dụng. – DougC

+0

@DougC Cách tạo ứng dụng thứ hai. Nếu sử dụng cùng một certs để tạo và chỉ cần thay đổi tên của ứng dụng, thứ hai sẽ thay thế đầu tiên. Bạn có thể cho tôi một số lời khuyên về nó không. Cảm ơn nhiều! – Judy

+0

Trường hợp Apple ghi chú hai kịch bản này? Đó là một câu trả lời tuyệt vời, nhưng bạn đã tìm thấy nguồn này ở đâu? –

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