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.
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