Что мне здесь не хватает?
Код: Выделить всё
async getTokenWithChromeDetection() {
try {
console.log('Getting FCM token...');
const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
console.log('Browser is Chrome:', isChrome);
if (isChrome) {
console.log('Using Chrome workaround...');
// Chrome workaround: Try without any service worker manipulation
try {
console.log('Attempting Chrome direct method...');
const token = await Promise.race([
this.messaging.getToken({ vapidKey: this.vapidKey }),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Chrome direct timeout')), 25000)
)
]);
if (token) {
console.log('Chrome direct method succeeded');
return token;
}
} catch (directError) {
console.log('Chrome direct method failed:', directError.message);
}
// Chrome fallback: Clear everything and try again
console.log('Trying Chrome fallback method...');
try {
// Clear existing token
await this.messaging.deleteToken();
console.log('Cleared existing token');
// Wait a bit
await new Promise(resolve => setTimeout(resolve, 3000));
// Try again
const token = await Promise.race([
this.messaging.getToken({ vapidKey: this.vapidKey }),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Chrome fallback timeout')), 20000)
)
]);
if (token) {
console.log('Chrome fallback method succeeded');
return token;
}
} catch (fallbackError) {
console.log('Chrome fallback method failed:', fallbackError.message);
}
throw new Error('All Chrome methods failed');
} else {
// Standard method for non-Chrome browsers
console.log('Using standard method...');
const token = await Promise.race([
this.messaging.getToken({ vapidKey: this.vapidKey }),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Standard timeout')), 30000)
)
]);
return token;
}
} catch (error) {
console.error('Token retrieval failed:', error);
throw error;
}
}
Я использую последние файлы Google FCM JS версии 12.4.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -messaging
Мобильная версия