2012-10-28 22 views
7

Q1. Czy muszę to zrobić na początku mojej aplikacji? Lub czy mogę włączyć monit o zezwolenie/niedopuszczenie w dowolnym momencie mojej aplikacji?Rejestracja systemu iOS dla powiadomień push w ramach aplikacji

Q2. Czy istnieje sposób sprawdzenia, czy użytkownik kliknął przycisk Tak/Nie? (oddzwaniam?)

Q3. Jeśli użytkownik kliknął już nie, (w poprzedniej sesji), czy mój monit rzeczywiście zostanie uruchomiony? Czy muszę powiedzieć użytkownikowi, aby przejść do ustawień telefonu i włączyć go?

Powód jest taki, że mam aplikację z sekcją w niej zwaną "Powiadomieniami", dzięki której mogą włączać/wyłączać otrzymywanie powiadomień o pewnych rzeczach, więc chcę tylko poprosić ich o włączenie itd., Gdy są w tym sekcja nie na początku aplikacji.

+0

w iOS 10, jeśli używasz 'UserNotifications' * framework *, wtedy możesz sprawdzić, czy użytkownik kliknął yes/no używając wywołania zwrotnego. Zobacz [tutaj] (http://useyourloaf.com/blog/local-notifications-with-ios-10/) – Honey

Odpowiedz

21

A1: Nie, to nie musi być na początku aplikacji. Możesz wywołać registerForRemoteNotificationTypes z dowolnego miejsca w kodzie.

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 

Będziesz musiał obsłużyć następujące metody delegatów (w delegate), które zostaną wywołane przy pomyślnym/nieudanym rejestrowaniu powiadomienia push.

// Delegation methods 
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { 
    const void *devTokenBytes = [devToken bytes]; 
    self.registered = YES; 
    [self sendProviderDeviceToken:devTokenBytes]; // this will send token to your server's database 
} 

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
    NSLog(@"Error in registration. Error: %@", err); 
} 

A2: Tak, możesz. Istnieją dwa możliwe scenariusze. Jeśli twoja aplikacja nie działa, będziesz obsługiwać powiadomienia push w didFinishLaunchingWithOptions. W takim przypadku, jeśli użytkownik wybrał opcję "Otwórz" w komunikacie o wiadomości lub kliknął na Banery (w zależności od ustawień użytkownika), aplikacja uruchomi się automatycznie i będzie mogła obsługiwać parametry użytkownika przekazane w powiadomieniu wypychanym.

/* Push notification received when app is not running */ 
NSDictionary *params = [[launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"] objectForKey:@"appsInfo"]; 

    if (params) { 
     // Use params and do your stuffs 
    } 

Jeśli aplikacja jest już uruchomiona, powiadomienia Push zostaną dostarczone do application:didReceiveRemoteNotification: metody delegata, gdzie można po prostu obecny UIAlertView z komunikatem w zgłoszeniu push i uchwyt delegatów alertView OK/Cancel Kliknij przycisk w standardowy sposób.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    NSDictionary *apsInfo = [userInfo objectForKey:@"apsinfo"]; // This appsInfo set by your server while sending push 

    NSString *alert = [apsInfo objectForKey:@"alert"]; 

    UIApplicationState state = [application applicationState]; 

    if (state == UIApplicationStateActive) { 
     application.applicationIconBadgeNumber = 0; 

     AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); 

     UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Push Notification" 
                  message:alert 
                  delegate:self 
                cancelButtonTitle:@"NO" 
                otherButtonTitles:@"YES"]; 
     [alertview show]; 
     [alertview release]; 

    } else { 
     [self setTabs:contentsInfo]; 
    } 
} 


- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex { 
    if (buttonIndex != [alertView cancelButtonIndex]) { 
    // User pressed YES, do your stuffs 
    } 
} 

A3: Jeśli użytkownik odmówi przyjęcia powiadomienia push z aplikacji i następnie jego didFailToRegisterForRemoteNotificationsWithError cię stąd nie dostaniesz DEVTOKEN użytkownika, które są wymagane, aby być na serwerze wysyłać powiadomienia push dla tego użytkownika. Jeśli użytkownik początkowo zaakceptuje, ale później, jeśli zmieni ustawienia, aby wyłączyć powiadomienie push, serwer Apple nie będzie wysyłać powiadomień push tego użytkownika. W tym przypadku identyfikator UDID użytkownika pojawi się w usłudze Feedback, a najlepiej, aby serwer usunął identyfikator UDID tego użytkownika z bazy danych i zaprzestał wysyłania powiadomienia push do tych użytkowników w przyszłości. Jeśli wysyłasz nieprawidłowe powiadomienie push, serwer Apple może po cichu zrzucić połączenie i nie będzie mógł wysyłać powiadomień push.

Aby uzyskać szczegółowe informacje na temat implementacji, zapoznaj się z dokumentami Apple Push Notification.

+0

Jeśli użytkownik odrzuci powiadomienie push lub wyłączy powiadomienie push z ustawień, jak możemy obsłużyć przypadek ponownego -promptowanie użytkownika? .i.e., Jak się dowiedzieć, że użytkownik nie jest zarejestrowany do wypychania i dać mu ponowne zgłoszenie? –

+1

** Ta odpowiedź (i prawdopodobnie inne odpowiedzi) jest częściowo nieaktualna **. dotyczy tylko iOS <7. w iOS789 trzeba było zrobić osobne "[zgłoszenie registerForRemoteNotifications]", ponieważ dostaniesz token (coś, co możesz zrobić bez pozwolenia użytkownika, pozwolenie jest wymagane tylko wtedy, gdy masz dać ostrzeżenie/odznakę, dźwięk dla użytkownika). w iOS 10 istnieje nowa platforma o nazwie "UserNotifications', która pozwoli ci dowiedzieć się, czy użytkownik zezwolił na dostęp, czy nie. Zobacz [tutaj więcej na iOS 10] (http://useyourloaf.com/blog/local-notifications-with-ios-10/) (1/2) – Honey

+0

W poprzednich wersjach trzeba było "[application isRegisteredForRemoteNotifications]" aby sprawdzić, czy jesteś zarejestrowany, czy nie (2/2) – Honey

5
  • Q1 To nie jest konieczne, aby umieścić rejestr Push podczas uruchamiania aplikacji, ale niektóre zrobić umieścić go w application: didFinishLaunchingWithOptions: jakoś zapewnić token urządzenie jest przechowywane na serwerze powodzeniem dewelopera.
  • Q2 Co oznacza "tak/nie"? Jeśli masz na myśli "tak/nie" w "jeśli otrzymasz powiadomienie push", to jeśli użytkownik kliknął "tak", zostanie uruchomiony delegat application: didRegisterForRemoteNotificationsWithDeviceToken, w przeciwnym razie nie będzie to .
  • Q3 Jeżeli użytkownik kliknie „nie”, aby odrzucić otrzymaniu powiadomienia push, a następnie albo można później przypomnieć mu, aby ją włączyć w ustawieniach, lub mieć funkcji, jak rzeczy UISwitch, aby umożliwić użytkownikom wyzwalać [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound)]; ponownie.
5

Można użyć poniższy poradnik dla Swift (Visit Link) i stosowania w związku z prostego kodu w celu C dla Apple powiadomienia wypychania.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
     if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) 
     { 
     // iOS 8 Notifications 
      [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound |UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; 
      [application registerForRemoteNotifications]; 
     } 
     return YES; 
    } 


    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
     NSLog(@"Did Register for Remote Notifications with Device Token (%@)", deviceToken); 
    } 

    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { 

     NSLog(@"Did Fail to Register for Remote Notifications"); 
     NSLog(@"%@, %@", error, error.localizedDescription); 
    } 

    -(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 
     NSLog(@"%@",userInfo); 
    } 
+0

skorzystaj z tej odpowiedzi ... @ applefreak's answer jest teraz przestarzałe – karan

+0

możemy również pominąć część iOS <8 Powiadomienia .. jak teraz dni, w które wchodzimy ios 8 i wyżej ... Mohammad dobry kod obj. – karan

0

odpowiedzi na pytanie: do 2 w iOS 10.

W iOS: 10, procedura obsługi ukończenie jest realizowany. W związku z tym użytkownik zostanie natychmiast powiadomiony w ramach bloku procedury obsługi zakończenia.

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.f){ 
    UNUserNotificationCenter* notificationCenter = [UNUserNotificationCenter currentNotificationCenter]; 
    [notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge completionHandler:^(BOOL granted, NSError * _Nullable error) { 
     NSLog(@"grant Access:%d",granted); 
    }]; 
Powiązane problemy