Зарегистрировать удаленные уведомления за пределами делегата приложения

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

Можно ли поместить некоторые из этого кода в метод viewDidLoad контроллера просмотра, отличный от моего делегата приложения? Должен ли я оставить эти два нижних метода "didRegisterForRemoteNotificationsWithDeviceToken" и "didReceiveRemoteNotification" в своем делете приложения или мне нужно перемещать их туда, где я пытаюсь зарегистрироваться для удаленных уведомлений?

Я регистрирую для push-уведомлений в своем приложении с блоками кода ниже:

В методе didFinishLaunchingWithOptions моего делегата приложения:

[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|
                                                UIRemoteNotificationTypeAlert|
                                                UIRemoteNotificationTypeSound];

Методы, добавленные в делегат моего приложения:

- (void)application:(UIApplication *)application
        didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // Store the deviceToken
}

- (void)application:(UIApplication *)application 
        didReceiveRemoteNotification:(NSDictionary *)userInfo {
    //handle push notification
}

Ресурсы, которые я посетил, показывают, что этот блок кода

Ответ 1

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

Обратные вызовы двух делегатов приложения должны быть в вашем делете приложения, хотя, поскольку вы регистрируетесь для типов уведомлений в делетете приложения, и у вас есть только один. Я бы предложил сделать метод делегирования приложения для вызова, а затем выполнить регистрацию, вы можете вызвать его из своего контроллера представления через [[UIApplication sharedApplication] delegate] (передать результат этого вызова классу делегирования приложения).

Ответ 2

этот ответ - "откликнуться" на ответ от Кендалла Хельмстеттера Гельнера (ответ Кендалла имеет 0 голосов, но он отлично подойдет для меня, и у меня нет достаточного количества баллов, чтобы проголосовать за ответ). следуя рекомендациям Кендалла, мой контроллер представления, CMRootViewController.m →

#pragma mark - push notificaiton
-(void)registerToReceivePushNotification {
    // Register for push notifications
    UIApplication* application =[UIApplication sharedApplication];
    [application registerForRemoteNotificationTypes:
     UIRemoteNotificationTypeBadge |
     UIRemoteNotificationTypeAlert |
     UIRemoteNotificationTypeSound];
}

а два обратных вызова делегирования делегатов находятся в моем делете приложения, CMAppDelegate.m →

// handle user accepted push notification, update parse
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken {
    // Store the deviceToken in the current installation and save it to Parse.
    PFInstallation *currentInstallation = [PFInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:newDeviceToken];

    // enable future push to deviceId
    NSUUID *identifierForVendor = [[UIDevice currentDevice] identifierForVendor];
    NSString* deviceId = [identifierForVendor UUIDString];
    [currentInstallation setObject:deviceId forKey:@"deviceId"];

    [currentInstallation saveInBackground];
}


// handle push notification arrives when app is open
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
    [PFPush handlePush:userInfo];
}

спасибо Кендалл.

Ответ 3

Лучший метод заключается в том, чтобы в методе делегата приложения обрабатывать уведомление об удалении отправляйте уведомление с помощью NSNotificationCenter

[[NSNotificationCenter defaultCenter] postNotification:@"remoteNotification" withObject:whateverYouWantHere];

Затем используйте NSNotificationCenter, чтобы добавить любые заинтересованные UIViewControllers в качестве наблюдателя для уведомления remoteNotification.

Ответ 4

SWIFT 3 и выше

Вызов уведомления о вызове извне AppDelegate

import UserNotifications

class HomeViewController: UIViewController
{
    override func viewDidLoad() {
        super.viewDidLoad()

        let application = UIApplication.shared

        registerPushNotification(application)
    }



    func registerPushNotification(_ application: UIApplication){

            UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]){ (granted, error) in

                if granted {
                    print("Notification: Granted")

                } else {
                    print("Notification: not granted")

                }
            }

            application.registerForRemoteNotifications()
        }

}



extension HomeViewController{

    // 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 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)")
    }

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