Вопрос по ios, xcode – Как я могу внедрить службу push-уведомлений Apple в приложении iOS?

3

Есть ли пример проекта, показывающий, как интегрироватьAPNS наIPhone, а как получить deviceToken?

stackoverflow.com/questions/1052645/… icecurtain

Ваш Ответ

3   ответа
24

in your app delegate's didFinishLaunchingWithOptions you should register for remote notifications. notice that apple's documentations suggests to register each time the app runs since the token may change from time to time. you do this by calling:

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];

after registering for remote notifications a method in your app delegate will be called which had been passed the token, you need to implement this method in your app delegate and send the token to your server (that will send you notifications). the method will look like this:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{

    NSLog(@"device token is: %@",deviceToken);
    [server sendToken:deviceToken];
}

Вы также должны реализовать это:

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

you need to handle notifications once you get them. there are few different scenarios in which you handle received notifications (the app is in the background or foreground etc.), the method that handles a notification if the app is in the foreground when you receive it should be implemented in the app delegate. this is it:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    NSLog(@"received notification");
    //handle the notification here
}

чтобы узнать больше о структуре userInfo и охватить все различные сценарии, внимательно прочитайтеhttp://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html, это было просто суть вещей :)

0
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 // Register for Push Notitications, if running on iOS 8
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
 }else{
    [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}
  return YES;
}
#pragma mark
#pragma mark -- Push Notification Delegate Methods
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:   (UIUserNotificationSettings *)notificationSettings{
//register to receive notifications
[application registerForRemoteNotifications];
}
-(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{
// Prepare the Device Token for Registration (remove spaces and < >)
 NSString* devToken = [[[[deviceToken description]
              stringByReplacingOccurrencesOfString:@"<"withString:@""]
             stringByReplacingOccurrencesOfString:@">" withString:@""]
            stringByReplacingOccurrencesOfString: @" " withString: @""];
NSLog(@"My token is: %@", devToken);
}
-(void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error{
//  NSLog(@"Failed to get token, error: %@", error);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
NSLog(@"%s..userInfo=%@",__FUNCTION__,userInfo);
/**
 * Dump your code here according to your requirement after receiving push
 */
 }
возможно, немного улучшить это с небольшим комментарием. Кстати, хорошие ответы в последнее время
0

OS.

Enabling Push Notifications

Первым шагом в настройке push-уведомлений является включение функции в Xcode 8 для вашего приложения. Просто зайдите в редактор проекта для вашей цели и затем нажмите на вкладку Возможности. Найдите Push-уведомления и установите для него значение ON:

enter image description here

Toggle Capability

Xcode должен отображать две галочки, указывающие, что возможность была успешно включена. За кулисами XCode создает идентификатор приложения в Центре разработчиков и включает службу push-уведомлений для вашего приложения.

Registering Devices

Устройства должны быть однозначно идентифицированы для получения push-уведомлений.

Каждому устройству, устанавливающему ваше приложение, APN присваивает уникальный токен устройства, который вы можете использовать для его отправки в любой момент времени. Как только устройству был присвоен уникальный токен, он должен быть сохранен в вашей серверной базе данных.

Пример токена устройства выглядит следующим образом:

5810F4C8C2AF5F7 F7 D6AF71A 22745D0FB50DED 665E0E882 BC5370D9CF0A F19E16  

Чтобы запросить маркер устройства для текущего устройства, откройте AppDelegate.swift и добавьте следующее в функцию обратного вызова didFinishLaunchingWithOptions перед оператором return:

// iOS 10 support
if #available(iOS 10, *) {  
    UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]){ (granted, error) in }
    application.registerForRemoteNotifications()
}
// iOS 9 support
else if #available(iOS 9, *) {  
    UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
    UIApplication.shared.registerForRemoteNotifications()
}
// iOS 8 support
else if #available(iOS 8, *) {  
    UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
    UIApplication.shared.registerForRemoteNotifications()
}
// iOS 7 support
else {  
    application.registerForRemoteNotifications(matching: [.badge, .sound, .alert])
}

В iOS 10 была представлена новая инфраструктура под названием UserNotifications, которую необходимо импортировать, чтобы получить доступ к классу UNUserNotificationCenter.

Добавьте следующий оператор импорта в начало AppDelegate.swift:

import UserNotifications 

Затем перейдите в редактор проекта для своей цели и на вкладке Общие найдите раздел Связанные фреймворки и библиотеки.

Нажмите + и выберите UserNotifications.framework:

enter image description here

Затем добавьте следующие обратные вызовы в AppDelegate.swift, которые будут вызываться, когда APN либо успешно зарегистрировали, либо не смогли зарегистрировать устройство для получения уведомлений:

// Called when APNs has assigned the device a unique token
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {  
    // Convert token to string
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})

    // Print it to console
    print("APNs device token: \(deviceTokenString)")

    // Persist it in your backend in case it's new
}

// Called when APNs failed to register the device for push notifications
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {  
    // Print the error to console (you should alert the user that registration failed)
    print("APNs registration failed: \(error)")
}

Вы должны реализовать логику, которая сохранит маркер в бэкенде вашего приложения. Далее в этом руководстве ваш внутренний сервер будет подключаться к APN и отправлять push-уведомления, предоставляя этот самый маркер устройства, чтобы указать, какое устройство (устройства) должно получать уведомление.

Обратите внимание, что токен устройства может измениться в будущем по разным причинам, поэтому используйте NSUserDefaults, локальное хранилище значений ключей, чтобы локально сохранить токен и обновлять свой бэкэнд только после того, как токен изменился, чтобы избежать ненужных запросов.

Запустите ваше приложение на физическом устройстве iOS (симулятор iOS не может получать уведомления) после внесения необходимых изменений в AppDelegate.swift. Найдите следующий диалог и нажмите OK, чтобы разрешить вашему приложению получать push-уведомления:

Alert Dialog

В течение секунды или двух консоль XCode должна отобразить уникальный токен вашего устройства. Скопируйте его и сохраните на потом.

enter image description here

Prepare to Receive Notifications

Добавьте следующий обратный вызов в AppDelegate.swift, который будет вызываться, когда ваше приложение получит push-уведомление, отправленное вашим внутренним сервером:

// Push notification received
func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {  
    // Print notification payload data
    print("Push notification received: \(data)")
}

Обратите внимание, что этот обратный вызов будет вызываться только тогда, когда пользователь щелкнул или провел пальцем, чтобы взаимодействовать с вашим push-уведомлением с экрана блокировки / Центра уведомлений, или если ваше приложение было открыто, когда push-уведомление было получено устройством.

Вы должны разработать реальную логику, которая будет выполняться при взаимодействии с уведомлением. Например, если у вас есть приложение для обмена сообщениями, «новое сообщение» push-уведомление должно открыть соответствующую страницу чата и привести к обновлению списка сообщений с сервера. Используйте объект данных, который будет содержать любые данные, которые вы отправляете из серверной части вашего приложения, такие как ID чата, в примере приложения мессенджера.

Важно отметить, что в случае, если ваше приложение открыто при получении push-уведомления, пользователь вообще не увидит уведомление, и вы сами должны каким-либо образом уведомить пользователя. В этом вопросе StackOverflow перечислены некоторые возможные обходные пути, например, отображение баннера в приложении, аналогичного баннеру уведомлений на iOS.

Generate an APNs Auth Key

Откройте страницу «Ключ аутентификации APNs» в Центре разработчика и нажмите кнопку «+», чтобы создать новыйAPNs Auth Key.

enter image description here

На следующей странице выберите ключ аутентификации push-уведомлений Apple («Песочница и производство») и нажмите «Продолжить» внизу страницы.

enter image description here

Apple затем сгенерирует.p8 ключевой файл, содержащий ваши APNs Auth Key.

enter image description here

Скачать.p8 файл ключа на ваш компьютер и сохраните его на потом. Кроме того, обязательно запишите где-нибудь идентификатор ключа, так как он понадобится вам позже при подключении к APN.

Send Push Notifications

Теперь, посмотрите здесь, чтобы понять, APNS поток:Как работают push-уведомления iOS?

Похожие вопросы