Bardzo się starałem stworzyć prostą, prostą aplikację na iOS, która może odbierać powiadomienia push. Jedynym powodem, dla którego to robię, jest ustanowienie procedury, z której mogliby korzystać inni członkowie zespołu, i nie byli w stanie znaleźć aktualnej, działającej wersji takich instrukcji w innym miejscu w sieci. Nasz sklep jest całkiem nowy dla programistów iOS, osobiście nie mam doświadczenia w programowaniu iOS i Xcode. Natknąłem się na dziesiątki samouczków, artykułów i postów o problemach z Apple i innych miejsc i czuję, że mogę być prawie na miejscu ...
Oto, gdzie muszę (uwaga, używam Xcode 4.3 i początkowo próbuję wdrożyć tylko na iOS 5.1 i rozumiem, że niektóre rzeczy mogły się ostatnio zmienić w porównaniu z wcześniejszymi wersjami Xcode, ale znowu jestem nowy dla wszystkich to - i uznając to za całkowicie zagmatwane i zagmatwane):
1) Mam profil informacyjny na moim iPhonie z włączoną opcją Push
2) W moim testowym projekcie Xcode mam ten profil aprowizacji wybrany jako tożsamość podpisu (w Ustawieniach kompilacji> Podpisywanie kodu)
3) Mam identyfikator pakietu w obszarze Podsumowanie i informacje> Niestandardowe właściwości docelowe systemu iOS ustawione prawidłowo * (myślę?)
4) Mam wywołanie registerForRemoteNotificationTypes w didFinishLaunchingWithOptions mojego delegata
5) Mam didRegisterForRemoteNotificationsWithDeviceToken i didFailToRegisterForRemoteNotificationsWithError w moim pełnomocniku, skonfigurowałem odpowiednio do logowania tokenu urządzenia lub błędu
6) Mam zaznaczone Włącz uprawnienia w Podsumowaniu.
7) Tuż pod wybranym plikiem uprawnień jest Tinker6 (nazwa mojego projektu testowego), który został wygenerowany automatycznie, gdy zaznaczyłem opcję Włącz uprawnienia
8) W pliku Tinker6.entitlements mam następujące informacje (które zebrałem są poprawne na podstawie kilku różnych postów w całej sieci, ale nie mogę znaleźć niczego ostatecznego w samym Apple):
Zaktualizowano
9) Ponadto wypróbowałem całość bez pliku uprawnień i otrzymałem zasadniczo ten sam wynik.
10) Zawartość mojego pliku mobileprovision zawiera poprawnie uprawnienia (zaszyfrowałem numer i domenę, ale strukturalnie są takie same):
<key>application-identifier</key>
<string>12355456A7.com.whatever.tinker</string>
<key>aps-environment</key>
<string>development</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>12355456A7.*</string>
</array>
/ koniec aktualizacji
Kiedy próbuję uruchomić to na moim urządzeniu, pojawia się następujący błąd w danych wyjściowych Xcode:
2012-06-11 12:45:23.762 Tinker6[13332:707] Failed to get token, error:
Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment'
entitlement string found for application" UserInfo=0x24a3b0
{NSLocalizedDescription=no valid 'aps-environment' entitlement string
found for application}
Próbowałem ustawić get-task-allow na NO, aps-environment to production, wszystkie cztery możliwe kombinacje, to samo.
Jak mogę to obejść? Gdzie jest ostateczna dokumentacja na ten temat?
- następuje dalsze tło -
* Jeśli chodzi o identyfikator pakietu, nadal nie wiem, jak należy to ustawić w odniesieniu do identyfikatorów aplikacji i identyfikatorów profilu w profilu aprowizacji. W portalu obsługi administracyjnej pod identyfikatorami aplikacji mam to (ponownie zaszyfrowałem numer i domenę):
A identyfikator zestawu dwóch miejsc jest ustawiony, mam to:
Wcale nie jestem pewien, czy są one poprawne, ani czy jeden lub oba powinny być ustawione na 12355456A7.com.cokolwiek.tinker, chociaż wypróbowałem je wcześniej bez powodzenia ...
Uwaga: Zdaję sobie sprawę, że istnieje wiele postów o podobnych tytułach, jednak wszystkie wydają się być nieaktualne w oparciu o podane nazwy plików i inne, a także fakt, że żadne z rozwiązań nie wydaje się przydatne. Mam nadzieję, że wyższy poziom szczegółowości zagwarantuje dobrą odpowiedź. Prawdopodobnie przydzielę nagrodę tak szybko, jak to możliwe, a jeśli udzielisz wysokiej jakości odpowiedzi, która prowadzi do rozwiązania, nagrodzę Cię, a także będę promować Twoją odpowiedź na Twitterze i moim blogu. Zwłaszcza jeśli opublikujesz naprawdę dobry „tutaj jest dokładnie 500 kroków, których potrzebujesz, aby uzyskać prostą aplikację powiadomień push działającą, w tym obsługę administracyjną i cokolwiek innego” na swoim blogu lub cokolwiek innego.
Przede wszystkim nie potrzebujesz pliku uprawnień, chyba że dodajesz niestandardowe pary klucz / wartość, które nie istnieją w profilu informacyjnym. Po utworzeniu aplikacji wszelkie uprawnienia z profilu informacyjnego zostaną skopiowane do aplikacji.
Biorąc pod uwagę, że nadal widzisz komunikat o błędzie dotyczący brakujących uprawnień, mogę tylko założyć, że opcje podpisywania kodu są nieprawidłowe w ustawieniach kompilacji.
Musisz upewnić się, że dla konfiguracji „Debugowania” jest wybrany prawidłowy profil, oraz dla bezpieczeństwa, że wybrałeś prawidłowy profil zarówno dla „Debugowania”, jak i węzła podrzędnego z etykietą „Dowolny pakiet SDK systemu iOS”:
Chociaż ten zrzut ekranu pokazuje wybrany profil „Automatyczny programista”, wybierz dokładny profil informacyjny z listy rozwijanej, tylko do celów testowych. Może się zdarzyć, że Xcode automatycznie wybiera inny profil niż ten, który chcesz.
Upewnij się również, że wykonałeś czystą kompilację, całkowicie usunąłeś aplikację z urządzenia itp. Ma to na celu upewnienie się, że nie masz w pobliżu starego puchu.
źródło
-
przed ścieżką:codesign -d --entitlements - /path/to/my.app
. Warto również w tym miejscu dokładnie sprawdzić, czy jesteś w katalogu Debug-iphoneos, ponieważ „Pokaż w Finderze” może czasami przenieść Cię w niewłaściwe miejsce.Napotkałem ten problem w Xcode 8. Musisz włączyć Target—> możliwości—> powiadomienia push. Sprawdź zrzut ekranu.
źródło
Najłatwiej jest to zrobić na swoich kontach z Xcode:
Przejdź przez Xcode -> Preferencje -> Wybierz kartę Konta -> Wyświetl szczegóły -> Naciśnij przycisk odświeżania w lewym dolnym rogu -> Gotowe.
Zbuduj ponownie i powinno działać.
źródło
Ok, już wcześniej miałem problem. Ponieważ powiadomienia push wymagają implementacji po stronie serwera, dla mnie odtworzenie profilu nie było opcją. Więc znalazłem to rozwiązanie BEZ tworzenia nowego profilu aprowizacji.
Xcode nie wybiera prawidłowo prawidłowego profilu obsługi administracyjnej, chociaż wybieramy go poprawnie.
Najpierw udaj się do organizatora. Na karcie Urządzenia z listy Profil aprowizacji z listy Biblioteka wybierz profil, którego próbujemy użyć. Kliknij go prawym przyciskiem myszy, a następnie „Pokaż profil w Finderze”.
W otwartym oknie Findera zostanie wybrany właściwy profil. Zanotuj nazwę.
Teraz przejdź do Xcode> Log Navigator. Wybierz filtr dla „Wszystkie” i „Wszystkie wiadomości”. Teraz w ostatniej fazie (Build Target) poszukaj kroku o nazwie „ProcessProductPackaging”, rozwiń go. Zanotuj nazwę profilu informacyjnego. NIE powinny pasować, jeśli występuje błąd.
Teraz w oknie Opened Finder usuń fałszywy profil udostępniania, którego używa Xcode. Teraz buduj ponownie. Błąd powinien zostać rozwiązany. Jeśli nie, powtórz proces, aby znaleźć inny fałszywy profil i go usunąć.
Mam nadzieję że to pomoże.
źródło
Odpowiedź brzmiała: zacznij od nowa, zrób wszystko tak samo, ale utwórz nowy profil informacyjny i zainstaluj go. To się udało. Sprawdzenie wszystkich szczegółów (uprawnień w usłudze mobilnej) wygląda dokładnie tak samo, jak wszystko w moim pytaniu tutaj. Ale teraz to działa. Apple: WAT?
Oczywiście byłoby to oczywiste, gdyby można było usunąć profile obsługi administracyjnej. Ale ponieważ nie jest to możliwe, nie chciałem zaśmiecać naszego zespołu kilkoma profilami testowymi. Mimo to w końcu straciłem cierpliwość i mimo wszystko spróbowałem, a ostatecznie zadziałało. Whatevs.
źródło
Usuń stary profil informacyjny z XCode w Organizatorze.
Następnie wygeneruj nowy profil aprowizacji dla tego samego identyfikatora pakietu w portalu obsługi administracyjnej systemu iOS (po włączeniu wypychania).
Zaimportuj nowy profil aprowizacji w XCode, ustaw go w ustawieniach kompilacji aplikacji.
Buduj, uruchamiaj, to działa.
Właśnie to zrobiłem.
Od błędu do sukcesu zajęło mi 10 minut.
źródło
XCode 6.1.1 i wiele kont programistów Apple
Kolejna odpowiedź na tę już dość obszerną mieszankę: dzisiaj ponownie natknąłem się na ten problem i tym razem było to spowodowane tym, że miałem wiele kont Apple. Najpierw musiałem dodać drugie konto programisty w XCode> Preferencje> Konta> +
Upewnij się, że funkcja powiadomień push jest WŁĄCZONA
Następnie musiałem faktycznie wyraźnie włączyć zakup w aplikacji w aplikacji (wcześniej nie musiałem tego robić). XCode> (okno aplikacji)> Cele> Możliwości> Zakup w aplikacji WŁĄCZONY (na tym etapie dano mi możliwość wyboru właściwego certyfikatu)
Zauważ, że już dodałem certyfikat z włączoną opcją Push, klikając go dwukrotnie w Finderze.
źródło
(Xcode 5) Cóż, po spędzeniu godziny rozwiązałem swój problem. Nawet jeśli ponownie wygenerujesz plik obsługi administracyjnej w Xcode 5, powinieneś ręcznie zaktualizować swoje konto. Zmieniłem tylko plik obsługi administracyjnej na karcie Organizator, który nie działał, Xcode nadal kompilował ze starym plikiem informacyjnym.
Więc idź do
Następnie odśwież pliki udostępniania.
źródło
Mój problem polegał po prostu na tym, że podpisywałem się za pomocą profilu aprowizacji z użyciem symboli wieloznacznych zarządzanego przez Xcode.
Po utworzeniu profilu aplikacji (i pobraniu go, dwukrotnym kliknięciu i upewnieniu się, że moje ustawienia kompilacji odnoszą się do niego), pomyślnie otrzymałem token urządzenia APNS.
źródło
Miałem ten sam problem, co wszyscy inni i próbowałem wszystkich powyższych sztuczek, nic nie działało. Usunąłem nawet i zacząłem od nowa z innym kontem programisty.
W końcu zadziałało dla mnie
Nie wiem, czy możesz włączyć to dla aplikacji wieloznacznej, ale po wypróbowaniu co najmniej 12 różnych sugestii i utracie kilku dni mam nadzieję, że to komuś pomoże
źródło
Wspominasz o profilu informacyjnym, ale nie widzę żadnej wzmianki o profilu Apple Push.
Aby użyć Push, musisz mieć profil wypychania (są dwa, jeden do programowania i jeden do wydania). Po utworzeniu musisz upewnić się, że zawiera odpowiednie certyfikaty (zobacz sekcję EDYCJA poniżej).
To doskonały samouczek, który przeprowadzi Cię przez wszystkie kroki:
http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12
Napisanie dokładnej, szczegółowej odpowiedzi, takiej jak ten samouczek, zajęłoby mi lub komukolwiek innemu, więc nie zamierzam próbować, ani rościć sobie prawa do nagrody, skoro ten samouczek już istnieje.
PS Uważam, że nie potrzebujesz już uprawnień, to jest dziedzictwo.
EDYCJA: Powinieneś także sprawdzić, czy posiadasz niezbędne profile na urządzeniu - przejdź do ustawień, następnie ogólne, profile, sprawdź, czy są wymienione profile, zwłaszcza profil push. Możesz to również sprawdzić w sekcji Organizator w XCode. W Organizatorze są dwie sekcje, które mówią Profile aprowizacji - jedna w lewym górnym rogu Biblioteki (są to profile w XCode, których używasz do podpisywania itp.) Zobaczysz również sekcję wywołującą Profile obsługi administracyjnej dla podłączonego urządzenia, to to profil zainstalowany na słuchawce. Jeśli nie masz ich zainstalowanych w telefonie, możesz je pobrać ze strony internetowej portalu obsługi administracyjnej, a następnie kliknij przycisk Dodaj u dołu okna Organizatora.
Będąc w portalu obsługi administracyjnej, powinieneś także sprawdzić, czy profil Apple Push zawiera certyfikaty: - kliknij Provisioning w menu po lewej stronie - zobaczysz listę swojego profilu, wybierz EDYTUJ profil Apple push - zobaczysz sekcja certyfikatów, z listą programistów lub testerów itp., które masz w swoim projekcie, upewnij się, że pole wyboru jest dla nich zaznaczone. - zobaczysz również sekcję urządzeń, upewnij się, że urządzenie, na którym testujesz, zostało dodane.
Jeśli masz jakieś stare profile w XCode lub na urządzeniu, usuń je i pobierz / odśwież / zainstaluj wszystkie nowe profile z portalu obsługi administracyjnej
źródło
Sam napotkałem ten sam problem. W moim przypadku problem polegał na tym, że nazwa mojego produktu ($ TARGET_NAME) nie została zapisana wielkimi literami w taki sam sposób, jak w certyfikacie dostarczonym przez Apple. Na przykład mam com.companyid.APNDemo, podczas gdy certyfikat Apple używa com.companyid.apndemo.
Zmieniłem cel na małe litery i zadziałało. Uwaga: wskazówką dla mnie było ustawienie kodowania w ustawieniach kompilacji na mój domyślny certyfikat programisty; nie profil aprowizacji APNTest.
źródło
Wiele z powyższych odpowiedzi jest poprawnych. Wydaje się jednak, że podczas radzenia sobie z tym istnieje więcej niż jeden możliwy błąd.
Ten, który miałem, to problem z wielkimi literami w moim identyfikatorze aplikacji. Mój identyfikator aplikacji z jakiegoś powodu nie był pisany wielką literą, ale moja aplikacja była. Po odtworzeniu identyfikatora aplikacji z poprawną wielkością liter wszystko działało płynnie. Mam nadzieję że to pomoże. Jednak frustrujące jak diabli.
PS, jeśli nadal nie działa, spróbuj ręcznie edytować pole tożsamości podpisywania kodu za pomocą opcji „edytuj”. Zmień drugi wiersz, wpisując nazwę poprawnej nazwy profilu informacyjnego.
źródło
Rozwiązanie go zajęło mi godziny. Biorąc pod uwagę, że ktoś używa niestandardowych skryptów do podpisywania i pakowania, podczas gdy inni używają samego xcode, istnieje tylko jeden sposób, aby sprawdzić, co zakończyło się w Twojej aplikacji. Zrzuć uprawnienia z
codesign --display --entitlements :- path/to/MyApp.app
i sprawdź
aps-environment
iapplication-identifier
.źródło
Ten błąd może wystąpić, gdy wygasła ważność certyfikatu.
Rozwiązaniem jest odnowienie certyfikatu i podpisanie nim aplikacji.
źródło
Musisz się upewnić, że w swoich profilach obsługi administracyjnej ( https://developer.apple.com/account/ios/profile/ ) masz profil dystrybucji iOS.
Podczas przesyłania z xCode do App Store upewnij się, że w uprawnieniach masz środowisko aps. Jeśli nie, pobierz je z Wyświetl konta -> Wyświetl szczegóły -> Pobierz wszystko.
źródło
Miałem podobny problem. Skakałem między XCode 7 i 8 z różnych powodów. Kiedy użyjesz 8 do budowania, będziesz musiał użyć 8. Po prostu użyłem Xcode 8 i zastosowałem niektóre z sugerowanych powyżej zmian i zadziałało.
źródło
odtworzenie tymczasowych plików rozwiązało wszystkie moje problemy.
źródło
Wydaje się, że jest coś dziwacznego z uprawnieniami „automatycznymi” w Xcode 4.6.
Istnieje plik Entitlement.plist dla każdego zestawu SDK pod adresem:
Rozwiązaniem, które wymyśliłem, była edycja tego pliku i ręczne dodanie podstępnego klucza środowiska aps:
Następnie Xcode generuje poprawny plik Xcent, który zawiera klucz środowiska aps pod adresem:
Możesz zlokalizować miejsce, w którym tworzony jest plik Xcent, używając nawigatora dziennika Xcode,
poszukaj „ProcessProductPackaging”.
Niestety jest to jedyny sposób, jaki znalazłem, który rozwiązuje problem .
(i wreszcie w stanie poprawnie uzyskać teraz token push)
Zastanawiam się tylko, czy jest dostępne inne, bardziej eleganckie rozwiązanie.
Proszę zapoznać się z moim pytaniem dotyczącym SO, aby uzyskać więcej informacji na ten temat:
Automatyczne uprawnienia Xcode 4.6 nie działają - „brak prawidłowego środowiska aps”
źródło
Przed usunięciem i ponownym utworzeniem identyfikatorów AppID / profili upewnij się, że w bibliotece i urządzeniu są zainstalowane te same (i prawidłowe) profile.
Zacząłem widzieć ten błąd po migracji na nowy komputer. Push działał poprawnie przed migracją.
Problem polegał na tym, że (duh) nie zaimportowałem profili do biblioteki Xcode na nowym komputerze (w Organizatorze / Urządzenia w Bibliotece-> Profile aprowizacji).
Mylące było to, że URZĄDZENIE miało już odpowiednie profile i pojawiły się zgodnie z oczekiwaniami w ustawieniach kompilacji, więc wszystko wyglądało tam poprawnie, ale XCode LIBRARY ich nie miało, więc podpisywał aplikację z ... ?? ?
źródło
To właśnie naprawiło to dla mnie. (Próbowałem już włączać / wyłączać te funkcje, odtwarzać profil informacyjny itp.).
Na karcie Ustawienia kompilacji w polu Uprawnienia do podpisywania kodu mój plik .entitlements nie był odsyłaczem do wszystkich sekcji. Po dodaniu go do sekcji Any SDK błąd został rozwiązany.
źródło
Wypróbowałem wszystkie wymienione tutaj odpowiedzi, ale nikt nie rozwiązał mojego problemu. W moim przypadku ten błąd jest spowodowany moim głupim błędem w tworzeniu Appid. Użyłem Wildcard App ID zamiast używania Explicit App ID spowodowało problem
Jeśli chcesz, aby aplikacja otrzymywała zdalne powiadomienia (powiadomienia wypychane), musisz użyć jawnego identyfikatora aplikacji , takiego jak com.tutsplus.push , zamiast com.tutsplus. *
Znajdź ScreenShot,
źródło