DidRegisterForRemoteNotificationsWithDeviceToken() не отправляет в ответный кодIOS

Программируем под IOS
Ответить
Anonymous
 DidRegisterForRemoteNotificationsWithDeviceToken() не отправляет в ответный код

Сообщение 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];
}


Подробнее здесь: https://stackoverflow.com/questions/781 ... act-native
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»