Зарегистрировать удаленные уведомления за пределами делегата приложения
Все, что я видел до сих пор, указывает на то, что я установил оповещение 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)")
}
}