Chciałbym ręcznie sprawdzić, czy są dostępne nowe aktualizacje mojej aplikacji, gdy jest w niej użytkownik, i poprosić go o pobranie nowej wersji. Czy mogę to zrobić, sprawdzając wersję mojej aplikacji w sklepie z aplikacjami - programowo?
113
NSNumber
numerem wersji. Następnie umieściłem go na mojej stronie internetowej. Na tej samej stronie internetowej, której używam do obsługi aplikacji i stron internetowych aplikacji, następnieviewDidLoad
sprawdzam tam numer wersji witryny i sprawdzam aktualną wersję w mojej aplikacji. Następnie mam gotowe,alertView
które automatycznie monituje o aktualizację aplikacji. Mogę podać kod, jeśli chcesz.Odpowiedzi:
Oto prosty fragment kodu, który informuje, czy aktualna wersja jest inna
Uwaga: upewnij się, że po wprowadzeniu nowej wersji w iTunes jest ona zgodna z wersją w wydawanej aplikacji. Jeśli nie, powyższy kod zawsze zwróci TAK, niezależnie od tego, czy użytkownik aktualizuje.
źródło
Wersja Swift 3:
Myślę, że lepiej jest rzucić błąd zamiast zwracać false, w tym przypadku utworzyłem VersionError ale może to być jakiś inny, który zdefiniujesz lub NSError
Rozważ również wywołanie tej funkcji z innego wątku, jeśli połączenie jest wolne, może zablokować bieżący wątek.
Aktualizacja
Korzystanie z sesji URL:
Zamiast używać
Data(contentsOf: url)
i blokować wątek, możemy użyćURLSession
:przykład:
źródło
DispatchQueue.global()
daje kolejkę w tle, dane są ładowane w tej kolejce i wracają do głównej kolejki dopiero po załadowaniu danych.Dzięki Steve Moser za jego link, oto mój kod:
źródło
/en/
podścieżką. Po wyjęciu zadziałałoPonieważ miałem ten sam problem, znalazłem odpowiedź udzieloną przez Mario Hendricksa . Nieoczekiwanie, gdy próbowałem zastosować jego kod w moim projekcie, XCode narzekał na problemy z Castingiem, mówiąc: „MDLMaterialProperty nie ma elementów składowych indeksu”. Jego kod próbował ustawić ten MDLMaterial ... jako typ stałej „lookupResult”, przez co rzutowanie na „Int” za każdym razem kończyło się niepowodzeniem. Moim rozwiązaniem było dostarczenie adnotacji typu dla mojej zmiennej do NSDictionary aby jasno określić, jakiego rodzaju wartości potrzebuję. Dzięki temu mogłem uzyskać dostęp do wartości „wersja”, której potrzebowałem.
Obs: W przypadku tego YOURBUNDLEID możesz pobrać z projektu Xcode .... „ Cele> Ogólne> Tożsamość> Identyfikator pakietu ”
Oto mój kod z pewnymi uproszczeniami:
Wszelkie sugestie dotyczące ulepszenia tego kodu są mile widziane!
źródło
Po prostu użyj ATAppUpdater . Jest 1 wiersz, bezpieczny dla wątków i szybki. Ma również metody delegowania, jeśli chcesz śledzić akcję użytkownika.
Oto przykład:
Opcjonalne metody delegata:
źródło
Uproszczona świetna odpowiedź zamieszczona w tym wątku. Korzystanie
Swift 4
iAlamofire
.A następnie, aby go użyć:
źródło
{ "resultCount":0, "results": [] }
Zaktualizowano kod Swift 4 z Anup Gupta
Dokonałem pewnych zmian w tym kodzie . Teraz funkcje są wywoływane z kolejki w tle, ponieważ połączenie może być powolne i blokować główny wątek.
Zrobiłem również opcję CFBundleName jako opcjonalną, ponieważ prezentowana wersja miała „CFBundleDisplayName”, która prawdopodobnie nie działała w mojej wersji. Więc teraz, jeśli nie jest obecny, nie ulegnie awarii, ale po prostu nie wyświetli nazwy aplikacji w alercie.
Wzywam również do dodania przycisku potwierdzenia:
Lub nazwij to tak, aby mieć opcję wymuszania aktualizacji na:
źródło
Oto moja wersja wykorzystująca Swift 4 i popularną bibliotekę Alamofire (i tak używam jej w moich aplikacjach). Żądanie jest asynchroniczne i możesz przekazać wywołanie zwrotne, aby otrzymać powiadomienie po zakończeniu.
Użycie jest takie proste:
źródło
Czy mogę zasugerować tę małą bibliotekę: https://github.com/nicklockwood/iVersion
Jego celem jest uproszczenie obsługi zdalnych plist w celu wyzwalania powiadomień.
źródło
źródło
URLSession
.Ta odpowiedź to modyfikacja odpowiedzi datinc https://stackoverflow.com/a/25210143/2735358 .
Funkcja datinc porównuje wersję przez porównanie ciągów. Nie będzie więc porównywać wersji dla wartości większej lub mniejszej niż.
Ale ta zmodyfikowana funkcja porównuje wersję przez NSNumericSearch (porównanie numeryczne) .
Posługiwać się:
źródło
Widziałem wiele sposobów sprawdzania aktualizacji aplikacji. więc na podstawie wielu odpowiedzi mieszam je i tworzę swoje rozwiązanie, które jest dostępne na GitHubie. Jeśli wymagana jest jakakolwiek aktualizacja, daj mi znać. Ten kod dla Swift 4
Link do GitHub do tego kodu. https://github.com/anupgupta-arg/iOS-Swift-ArgAppUpdater
Odniesienie: https://stackoverflow.com/a/48810541/5855888 i https://github.com/emotality/ATAppUpdater
Miłego kodowania 👍 😊
źródło
Spróbuj tego z pojedynczym wywołaniem funkcji:
Funkcja ostrzegania, aby otworzyć adres URL AppStore:
Jak wywołać powyższą funkcję:
Aby uzyskać więcej szczegółów, wypróbuj poniższy link z pełnym kodem:
AppStoreUpdate.swift
ItunesAppInfoResult.swift
ItunesAppInfoItunes.swift
Mam nadzieję, że to pomoże!
źródło
Oto szybka metoda, która robi to, co sugerują niektóre z odpowiedzi Objective-C. Oczywiście po uzyskaniu informacji ze sklepu z aplikacjami w formacie JSON możesz wyodrębnić informacje o wersji, jeśli chcesz.
źródło
Jeśli nie ustawiasz typu zawartości w NSUrlRequest, na pewno nie otrzymasz odpowiedzi, więc wypróbuj poniższy kod, który działa dobrze dla mnie. Mam nadzieję, że to pomoże....
źródło
Pochodzący z punktu widzenia aplikacji hybrydowej, to jest przykład javascript. W menu głównym mam stopkę Dostępnej aktualizacji. Jeśli aktualizacja jest dostępna (tj. Mój numer wersji w pliku konfiguracyjnym jest mniejszy niż wersja pobrana, wyświetl stopkę) Spowoduje to skierowanie użytkownika do sklepu z aplikacjami, gdzie użytkownik może kliknąć przycisk aktualizacji.
Otrzymuję również informacje o nowościach (tj. Informacje o wydaniu) i wyświetlam je w trybie modalnym podczas logowania, jeśli jest to pierwszy raz w tej wersji.
Metodę Dostępna aktualizacja można uruchamiać tak często, jak chcesz. Mój jest uruchamiany za każdym razem, gdy użytkownik przejdzie do ekranu głównego.
Callback: Apple ma API, więc bardzo łatwe do uzyskania
źródło
Ostrzeżenie: większość udzielonych odpowiedzi pobiera adres URL synchronicznie (za pomocą
-dataWithContentsOfURL:
lub-sendSynchronousRequest:
. Jest to złe, ponieważ oznacza, że aplikacja nie będzie odpowiadać przez kilka minut, jeśli połączenie mobilne zostanie przerwane w trakcie przetwarzania żądania. Nigdy rób synchronicznie dostępu do Internetu na główny wątek.Prawidłowa odpowiedź to użycie asynchronicznego interfejsu API:
Domyślny limit czasu dla połączeń sieciowych wynosi kilka minut, a nawet jeśli żądanie zostanie przesłane, może być wystarczająco wolne w przypadku złego połączenia EDGE, aby zająć tak dużo czasu. W takim przypadku nie chcesz, aby Twoja aplikacja była bezużyteczna. Aby przetestować takie rzeczy, warto uruchomić kod sieciowy za pomocą Network Link Conditioner firmy Apple.
źródło
aby porównać ciąg wersji:
https://github.com/eure/AppVersionMonitor
źródło
DLA SWIFT 4 i 3.2:
Najpierw musimy pobrać identyfikator pakietu ze słownika informacji o pakiecie, ustawić isUpdaet na false.
Następnie musimy wywołać wywołanie urlSession, aby pobrać wersję z itunes.
PEŁNY KOD BĘDZIE TAK JAK:
Następnie możemy wywołać tę funkcję dowolnym oprogramowaniem, którego potrzebujemy.
źródło
C # odpowiednik @datinc, tak samo jak uzyskanie wersji z Apple App Store. Dołączony kod umożliwiający uzyskanie wersji zarówno dla pakietu, jak i pliku AssemblyInfo.
EDYCJA :: Zwróć uwagę na region „/ us /” zawarty w ciągach adresów URL. Ten kod kraju będzie wymagał odpowiedniej obsługi / zmiany.
źródło
To pytanie padło w 2011 roku, znalazłem je w 2018 roku, szukając sposobu nie tylko na sprawdzenie nowej wersji aplikacji w App Store, ale również na powiadomienie o tym użytkownika.
Po małych poszukiwaniach doszedłem do wniosku, że odpowiedź juanjo (związana ze Swift 3) https://stackoverflow.com/a/40939740/1218405 jest optymalnym rozwiązaniem, jeśli chcesz to zrobić w kodzie samodzielnie
Mogę również zasugerować dwa świetne projekty na GitHub (ponad 2300 gwiazdek każdy)
Przykład dla syreny (AppDelegate.swift)
źródło
Szybki 4
Możemy użyć nowego,
JSONDecoder
aby przeanalizować odpowiedź z itunes.apple.com/lookup i przedstawić ją za pomocą klas lub struktur Decodable:Możemy również dodać inne właściwości na
AppInfo
wypadek, gdybyśmy potrzebowali tejreleaseNotes
lub innej właściwości.Teraz możemy wykonać żądanie asynchroniczne za pomocą
URLSession
:ta funkcja otrzymuje zamknięcie zakończenia, które zostanie wywołane, gdy żądanie zostanie zakończone i zwróci wartość
URLSessionDataTask
w przypadku, gdy będziemy musieli anulować żądanie, i można ją wywołać w następujący sposób:źródło
LookupResult
iAppInfo
gdzieś w swoim projekcie, najlepiej w osobnym pliku: Są one używane podczas dekodowania odpowiedzi:JSONDecoder().decode(LookupResult.self, from: data)
i zawierają ciąg wersjiMoja propozycja kodu. Na podstawie odpowiedzi @datinc i @ Mario-Hendricks
Powinieneś oczywiście zastąpić
dlog_Error
swoim wywołaniem funkcji logowania.Taka struktura kodu powinna zapobiegać awariom aplikacji w przypadku wystąpienia błędu. Pobieranie pliku
appStoreAppVersion
nie jest konieczne i nie powinno prowadzić do błędów krytycznych. A jednak przy tego rodzaju strukturze kodu nadal będziesz rejestrować swój niekrytyczny błąd.źródło
jeśli chcesz sprawdzić aktualną wersję swojej aplikacji, użyj poniższego prostego kodu:
źródło