Hej! Muszę wiedzieć, jak mogę uruchomić aplikację na iOS w tle aplikacji (np. Pobierz plik w pliku AppDelegate), więc zmiana kontrolerów ViewControllers nie spowoduje przerwania pobierania. Muszę też móc uzyskać postęp pobierania (0.00000 - 1.00000
), aby ustawić obiekt UIProgressView
, co oznacza również, że potrzebuję funkcji - (void)progressDidChangeTo:(int)progress
.Pobieranie aplikacji w tle iOS
Odpowiedz
Wystarczy użyć ASIHTTPRequest to sposób łatwiejszy niż NSURLRequest i robi dokładnie to, czego potrzebujesz. To examples pokazuje, jak pobrać w tle i jak zgłaszać postęp.
Nie pobrałbym niczego bezpośrednio w AppDelegate. Zamiast tego utworzyłbym oddzielną klasę właśnie w tym celu. Nazwijmy to: MyService
Chciałbym zainicjować tę klasę w moim delegacie aplikacji.
Ta klasa może działać jako singleton lub może zostać przekazana do każdego kontrolera widoku, który tego wymaga.
W klasie MyService
dodałbym ASINetworkQueue i kilka metod obsługi żądań, gdy są gotowe. Oto kod z przykładów ASI, których można użyć:
- (IBAction)startBackgroundDownloading:(id)sender
{
if (!self.queue) {
self.queue = [[[ASINetworkQueue alloc] init] autorelease];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[self.queue addOperation:request]; //queue is an NSOperationQueue
[self.queue go];
}
- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
//Do something useful with the content of that request.
}
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
Jeśli musisz ustawić pasek postępu. Chciałbym po prostu wystawiać setDownloadProgressDelegate z ASINetworkQueue w mojej klasie MojaUsluga i ustawić go w moich ViewControllers tak:
[[MyService service] setDownloadProgressDelegate: self.myUIProgressView];
BTW. Jeśli chcesz kontynuować pobieranie nawet po wyjściu z aplikacji, możesz ustawić właściwość swojej prośby na TAK na ShouldContinueWhenAppEntersBackground
.
można użyć NSURLConnection, aby uruchomić asynchroniczne żądanie, które nie spowoduje zablokowania interfejsu użytkownika. Można to zrobić wykonując coś takiego:
NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
[urlRequest release];
, aby mieć swoje postępy można użyć:
connection:didReceiveResponse:(NSURLResponse *)response;
delegata wezwanie do wglądu response.expectedContentLength a następnie użyć
connection:didReceiveData:(NSData *)data
, aby śledzić ilość pobranych danych i obliczyć procent.
Nadzieja to pomaga, Moszi
Mam część pobierania w dół, przy użyciu ASIHTTPRequest, po prostu muszę wiedzieć, jak zaimplementować pobieranie, aby rozpocząć w tle, zamiast bieżącego otwarty UIViewController, więc gdy kontroler widoku zostanie zwolniony, pobieranie będzie kontynuowane. –
Można utworzyć klasę singleton do zarządzania pobieraniem, w ten sposób klasa ta będzie dostępna nawet wtedy, gdy kontroler widoku zostanie zwolniony. (wzór singletonowy na wikipedia: http://en.wikipedia.org/wiki/Singleton_pattern) – Moszi
- 1. Pobieranie w tle iOS w tle dla lokalnych powiadomień
- 2. iOS - Programowe pobieranie użycia baterii aplikacji
- 3. Tryb tła w tle iOS
- 4. iOS: Odbieranie mediów w tle
- 5. Czasowe przetwarzanie w tle iOS
- 6. Pobieranie obrazów w tle przy wyświetlaniu listy
- 7. Dźwięk w tle dla aplikacji wideo na iOS
- 8. Pobieranie i wyświetlanie obrazów z serwisu Facebook w aplikacji iOS
- 9. iOS zamiar tle po uruchomieniu
- 10. iOS: odtwarzanie w tle z przeglądarki?
- 11. Zadania w tle dla aplikacji
- 12. iOS 4: Zdalne sterowanie dźwiękiem w tle
- 13. iOS - jak ukończyć długi proces w tle
- 14. Przechwytywanie strumienia audio w tle na iOS
- 15. Uzyskać lokalizację w aplikacji Ionic/Cordova, gdy w tle
- 16. Pobieranie danych w tle danych za pomocą nowego NSPrivateQueueConcurrencyType
- 17. Jak wstrzymać/wznowić pobieranie w iPhone (iOS)?
- 18. Globalnie ukrywany kursor (z aplikacji w tle)
- 19. Zadanie w tle i wykrywanie uruchomionej aplikacji
- 20. Aplikacja nie działa w tle w ios 7
- 21. Tekstury iOS Pobieranie 33% dodatkowej pamięci
- 22. Monitorowanie kalendarza iOS w tle - jak to się robi?
- 23. Szyfrowanie w iOS w poziomie aplikacji
- 24. Pobieranie pliku "mobileconfig" z aplikacji
- 25. Reklamy i skanowanie w technologii iOS Corebluetooth podczas działania aplikacji w tle
- 26. Jak uzyskać szczegółowe informacje o aplikacjach działających w tle w mojej aplikacji dla systemu iOS?
- 27. Jak w aplikacji odtwarzać dźwięk w tle (phonegap 1.5.0 na iOS)?
- 28. PowerShell: pobieranie wielu aplikacji w AppPool
- 29. Pobieranie pliku "Symulacja" w aplikacji internetowej HTML5
- 30. Pobieranie plików w aplikacji hostującej samoobsługę Nancy
... Jestem. Potrzebuję pobierania w pliku AppDelegate, aby pobieranie nie zakończyło się, gdy uruchamiany jest UIViewController, który go zainicjował. Muszę wiedzieć, w jaki sposób można uzyskać UIViewController, aby uruchomić i uzyskać dostęp do obiektu ASIHTTPRequest, ale mają obiekt zatrzymany w AppDelegate. –
@ hankweb, właśnie zaktualizowałem swoją odpowiedź. –
Problem polega na tym, że reportFailure będzie wywoływany w ASIHTTPRequest.m za każdym razem, gdy moja aplikacja wróci z tła. Używam w taki sam sposób, jak zasugerowałeś w poście, a obiekt ShouldContineWhenAppEntersBackground ma wartość TAK. –