You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用next-pwa的Next.js应用中集成OneSignal推送通知?解决自动生成Service Worker不可编辑难题

Integrating OneSignal Push Notifications with next-pwa (Auto-Generated Service Worker)

I’ve been in your exact situation before—using next-pwa to handle offline functionality without touching the auto-generated, minified service worker, then needing to add OneSignal push notifications. The good news is you don’t have to edit that compressed SW file at all; next-pwa gives you clean ways to inject custom logic. Here’s a step-by-step breakdown that works reliably:

Step 1: Set Up OneSignal Dependencies

First, install the OneSignal web SDK (npm makes dependency management easier, but you can use their CDN if you prefer):

npm install onesignal-web-sdk

Step 2: Configure next-pwa to Import Custom SW Logic

next-pwa has an importScripts option that lets the auto-generated service worker load additional scripts. This is perfect for adding OneSignal’s SW code without modifying the core SW next-pwa creates.

Update your next.config.js with this configuration:

const withPWA = require('next-pwa')({
  dest: 'public',
  register: true,
  skipWaiting: true,
  // Tell the auto-generated SW to load our OneSignal script
  importScripts: ['/onesignal-sw.js'],
});

module.exports = withPWA({
  // Add your existing Next.js config here (env variables, image domains, etc.)
});

Step 3: Create Your Custom OneSignal Service Worker File

Make a new file at public/onesignal-sw.js (this path matters because importScripts references files in the public directory). Add this code to initialize OneSignal’s SW SDK:

// Load OneSignal's official Service Worker SDK
importScripts('https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.sw.js');

// Initialize OneSignal with your app ID from the OneSignal dashboard
OneSignal.init({
  appId: 'YOUR_ONESIGNAL_APP_ID',
  // Optional: Add extra configs like serviceWorkerParam or enableNotifications
});

Step 4: Initialize OneSignal on the Client Side

You need to set up the client-side SDK to request notification permissions and handle user interactions. Add this to your _app.js (or layout.js if you’re using the App Router):

import { useEffect } from 'react';
import OneSignal from 'onesignal-web-sdk';

function MyApp({ Component, pageProps }) {
  useEffect(() => {
    // Only run this on the client to avoid server-side rendering issues
    OneSignal.init({
      appId: 'YOUR_ONESIGNAL_APP_ID',
      notifyButton: {
        enable: true, // Shows the default opt-in button for notifications
      },
    });

    // Request notification permission from the user
    OneSignal.Notifications.requestPermission();
  }, []);

  return <Component {...pageProps} />;
}

export default MyApp;

Step 5: Test and Validate

  • Build and run in production mode: PWA features (including service workers) don’t work reliably in Next.js’s dev server. Run:
    npm run build
    npm run start
    
  • Check service workers: Open your browser’s dev tools → Application → Service Workers. You should see the auto-generated SW from next-pwa, and it should have loaded your onesignal-sw.js script.
  • Test a push notification: Go to your OneSignal dashboard, create a test notification, and send it to your device. If you granted permission, you should receive it even if the tab is closed.

Key Notes to Avoid Headaches

  • HTTPS Requirement: Push notifications require HTTPS. Localhost is exempt (browsers trust it), but for production, make sure your site is served over HTTPS.
  • OneSignal SDK Version: Always use the latest SDK version (check their docs for the current CDN link) to avoid compatibility bugs.
  • Manifest File: next-pwa auto-generates a manifest, but double-check it has name, short_name, and icons defined—OneSignal uses these for notification styling.

内容的提问来源于stack exchange,提问作者adamine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:52:42