Я стараюсь избегать странных библиотек или услуг с завышенной ценой, таких как Azure, или несовместимых служб, таких как Firebase, для отправки уведомлений в мое приложение. Поэтому я решил создать свой собственный нативный модуль, который может это сделать, но мои навыки в Swift все еще только начинаются, и я как бы застрял в этом:
По сути, я делаю это, чтобы зарегистрируйтесь для получения уведомлений после получения согласия:
import UserNotifications
@objc(PushNotificationManager)
class PushNotificationManager: NSObject, UNUserNotificationCenterDelegate {
private var deviceToken: String?
private var callback: RCTResponseSenderBlock?
@objc static let shared = PushNotificationManager()
@objc static func requiresMainQueueSetup() -> Bool {
return true
}
@objc func registerForPushNotifications(_ callback: @escaping RCTResponseSenderBlock) {
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
self.callback = callback
}
}
@objc func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
self.deviceToken = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print("Device token set: \(String(describing: self.deviceToken))")
self.callback?([NSNull(), self.deviceToken])
}
@objc func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("Failed to register for remote notifications with error: \(error)")
self.callback?([error.localizedDescription, NSNull()])
}
А затем в реакции на это:
if (Platform.OS === 'ios') {
console.log("get permission")
PushNotificationManager.requestPermission((error, granted) => {
console.log("step 1")
console.log(error)
if (granted) {
console.log("step 2")
console.log("granted")
PushNotificationManager.registerForPushNotifications((error, token) => {
if (error) {
console.log("step 3")
console.log(error)
} else {
console.log("step 3")
console.log(token)
}
});
}
});
}
Однако токен или ошибка никогда не регистрируются. Насколько я понимаю, UIApplication.shared.registerForRemoteNotifications является асинхронным, и это возвращает неопределенное значение в React-native из-за попытки запуска синхронно, но ни с помощью AI, ни с помощью поиска Google это не удалось исправить.
Любой совет?
РЕДАКТИРОВАТЬ:
и AppDelegate.m
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.moduleName = @"medux";
self.initialProps = @{};
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
PushNotificationManager *manager = [PushNotificationManager new];
center.delegate = manager;
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];
NSString *token = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
NSLog(@"Device Token: %@", token);
PushNotificationManager *manager = PushNotificationManager.shared;
[manager application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
PushNotificationManager *manager = PushNotificationManager.shared;
[manager application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... act-native
DidRegisterForRemoteNotificationsWithDeviceToken() не отправляет в ответный код ⇐ IOS
Программируем под IOS
1710848890
Anonymous
Я стараюсь избегать странных библиотек или услуг с завышенной ценой, таких как Azure, или несовместимых служб, таких как Firebase, для отправки уведомлений в мое приложение. Поэтому я решил создать свой собственный нативный модуль, который может это сделать, но мои навыки в Swift все еще только начинаются, и я как бы застрял в этом:
По сути, я делаю это, чтобы зарегистрируйтесь для получения уведомлений после получения согласия:
import UserNotifications
@objc(PushNotificationManager)
class PushNotificationManager: NSObject, UNUserNotificationCenterDelegate {
private var deviceToken: String?
private var callback: RCTResponseSenderBlock?
@objc static let shared = PushNotificationManager()
@objc static func requiresMainQueueSetup() -> Bool {
return true
}
@objc func registerForPushNotifications(_ callback: @escaping RCTResponseSenderBlock) {
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
self.callback = callback
}
}
@objc func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
self.deviceToken = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print("Device token set: \(String(describing: self.deviceToken))")
self.callback?([NSNull(), self.deviceToken])
}
@objc func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("Failed to register for remote notifications with error: \(error)")
self.callback?([error.localizedDescription, NSNull()])
}
А затем в реакции на это:
if (Platform.OS === 'ios') {
console.log("get permission")
PushNotificationManager.requestPermission((error, granted) => {
console.log("step 1")
console.log(error)
if (granted) {
console.log("step 2")
console.log("granted")
PushNotificationManager.registerForPushNotifications((error, token) => {
if (error) {
console.log("step 3")
console.log(error)
} else {
console.log("step 3")
console.log(token)
}
});
}
});
}
Однако токен или ошибка никогда не регистрируются. Насколько я понимаю, UIApplication.shared.registerForRemoteNotifications является асинхронным, и это возвращает неопределенное значение в React-native из-за попытки запуска синхронно, но ни с помощью AI, ни с помощью поиска Google это не удалось исправить.
Любой совет?
РЕДАКТИРОВАТЬ:
и AppDelegate.m
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.moduleName = @"medux";
self.initialProps = @{};
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
PushNotificationManager *manager = [PushNotificationManager new];
center.delegate = manager;
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];
NSString *token = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
NSLog(@"Device Token: %@", token);
PushNotificationManager *manager = PushNotificationManager.shared;
[manager application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
PushNotificationManager *manager = PushNotificationManager.shared;
[manager application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78185696/didregisterforremotenotificationswithdevicetoken-does-not-send-to-react-native[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия