Tập lệnh PHP để gửi thông báo đẩy

Hello I have created an app that sucessfully receives push notifications form pushtry. com tôi tải lên. pem and enter the passphrase, and it works

I am now taking the same . pem file and passphrase and adding it to a php script. I run it and the script throws an error on the last line shown below. Any help would be graetly appreciated


As far as the . pem file is concerned I exported the "Apple Development IOS Push Servicer. com. mycompany. myapp" and my associated private key. then converted each to a . pem then concatenated the two files


$ctx = stream_context_create();

stream_context_set_option($ctx, 'ssl', 'local_cert', 'aps_dev. pem');

stream_context_set_option($ctx, 'ssl', 'passphrase', self. $passphrase);

$fp = stream_socket_client( 'ssl. //gateway. sandbox. xô. quả táo. com. 2195', $err, $errstr, 60,

STREAM_CLIENT_CONNECT. STREAM_CLIENT_PERSISTENT, $ctx);


Cảnh báo. stream_socket_client(). Không thể đặt tệp khóa riêng `/Users/twolff/Desktop/APNS-PHP/aps_dev. pem' trong /Users/twolff/Desktop/APNS-PHP/PushNotifications. php trên dòng 44

Cảnh báo. stream_socket_client(). Không bật được tiền điện tử trong /Users/twolff/Desktop/APNS-PHP/PushNotifications. php trên dòng 44

Cảnh báo. stream_socket_client(). không thể kết nối với ssl. /

Kết nối thất bại. 0


Kiểm tra telnet có vẻ tốt


cổng telnet. hộp cát. xô. quả táo. com 2195

thử 17. 188. 165. 216

Đã kết nối với cổng. hộp cát. trái táo. com. biệt danh. mạng lưới

Ký tự thoát là '^]'



Tôi đã thử kết nối openssl s_client


~/Desktop/APNS-PHP $ openssl s_client -cổng kết nối. hộp cát. xô. quả táo. com. 2195 -chứng chỉ aps_combined. pem -key aps_combined. pem

Nhập cụm mật khẩu cho aps_combined. pem

ĐÃ KẾT NỐI(00000003)

độ sâu=1 /C=US/O=Entrust, Inc. /OU=Xem www. giao phó. net/legal-terms/OU=(c) 2012 Entrust, Inc. - chỉ dành cho mục đích sử dụng được ủy quyền/CN=Cơ quan cấp chứng chỉ ủy thác - L1K

xác minh lỗi. số=20. không thể lấy chứng chỉ nhà phát hành địa phương

xác minh trở lại. 0

---

Chuỗi chứng chỉ

0 giây. /C=US/ST=California/L=Cupertino/O=Apple Inc. /CN=cổng. hộp cát. xô. quả táo. com

i. /C=US/O=Entrust, Inc. /OU=Xem www. giao phó. net/legal-terms/OU=(c) 2012 Entrust, Inc. - chỉ dành cho mục đích sử dụng được ủy quyền/CN=Cơ quan cấp chứng chỉ ủy thác - L1K

1 giây. /C=US/O=Entrust, Inc. /OU=Xem www. giao phó. net/legal-terms/OU=(c) 2012 Entrust, Inc. - chỉ dành cho mục đích sử dụng được ủy quyền/CN=Cơ quan cấp chứng chỉ ủy thác - L1K

i. /O=Giao thác. mạng/OU=www. giao phó. net/CPS_2048 kết hợp. bởi giới thiệu. (Giới hạn nói dối. )/OU=(c) 1999 Ủy thác. net Limited/CN=Ủy thác. Cơ quan chứng nhận mạng (2048)

---

Chứng chỉ máy chủ

-----BẮT ĐẦU GIẤY CHỨNG NHẬN----

MIIFUTCCBDmgAwIBAgIRAP/KN+WwyNu6AAAAAFDYCGYwDQYJKoZIhvcNAQELBQAw

/*Đã xóa một loạt các dòng ở giữa ở đây*/

Hke/uLEPEGV/r6N1NSgQqbajUVgqUCrG3GPHsmuVHCFWSP1YYc+2FwKYOLEUgbma

yYBeaZ+LYzqYxyZzBvj+jTaRKi56

-----GIẤY CHỨNG NHẬN KẾT THÚC-----

chủ đề=/C=US/ST=California/L=Cupertino/O=Apple Inc. /CN=cổng. hộp cát. xô. quả táo. com

tổ chức phát hành=/C=US/O=Entrust, Inc. /OU=Xem www. giao phó. net/legal-terms/OU=(c) 2012 Entrust, Inc. - chỉ dành cho mục đích sử dụng được ủy quyền/CN=Cơ quan cấp chứng chỉ ủy thác - L1K

---

Tên CA chứng chỉ ứng dụng khách được chấp nhận

/C=US/O=Apple Inc. /OU=Cơ quan cấp chứng chỉ Apple/CN=Apple Root CA

/C=US/O=Apple Inc. /OU=Cơ quan cấp chứng chỉ Apple/CN=Cơ quan cấp chứng chỉ tích hợp ứng dụng Apple 2/OU=Cơ quan cấp chứng chỉ Apple/O=Apple Inc. /C=Mỹ

Để triển khai thông báo đẩy web trên trang web của bạn, chức năng thích hợp phải được cung cấp ở cả phía máy khách của người dùng và trên máy chủ

Trước tiên, khách hàng của người dùng phải đăng ký nhận thông báo, sau đó nhận và hiển thị chúng. Về phía khách hàng, JavaScript được sử dụng cho việc này. API đẩy web tiêu chuẩn được triển khai trong hầu hết các trình duyệt di động và máy tính để bàn phổ biến

Đăng ký phải được lưu và quản lý ở phía máy chủ và gửi tin nhắn mong muốn. Trong hướng dẫn này, phía máy chủ được triển khai với PHP, vì đây là nền tảng được sử dụng nhiều nhất và do đó, đây có thể là cách dễ nhất để tích hợp vào một hệ thống hiện có

Tất cả các gói được tìm thấy trên Internet đều có nhiều phụ thuộc vào các gói khác (ký, mã hóa, gửi yêu cầu HTTP không đồng bộ) và do đó cũng có chi phí rất cao của chấn lưu không sử dụng. Vì lý do này, tôi quyết định tạo một gói dựa trên các nguồn có sẵn không có phụ thuộc bên ngoài nào khác

Bạn có thể tìm thấy mã nguồn hoàn chỉnh của các bước được mô tả bên dưới và gói PHP để gửi thông báo đẩy tại đây

1. 1. Một cái nhìn ngắn gọn về thông báo đẩy web

Thông báo đẩy web cho phép gửi tin nhắn trực tiếp tới người dùng, ngay cả khi họ hiện không truy cập trang web của người gửi

Ưu đãi, tin tức hoặc thông tin liên quan khác có thể được gửi bất cứ lúc nào và người dùng có thể được chuyển hướng đến một URL mong muốn. Theo quan điểm của người dùng, thông báo đẩy có lợi thế là toàn bộ quá trình đăng ký là ẩn danh (nhà cung cấp không cần tên hoặc chi tiết liên hệ như địa chỉ email hoặc thông tin khác) và dịch vụ có thể bị chấm dứt bất cứ lúc nào

Để nhà cung cấp được phép gửi thông báo đẩy cho người dùng, trước tiên người dùng phải thực hiện bất kỳ hành động nào trên trang web của người gửi một cách rõ ràng để xác nhận rằng anh ta muốn nhận những thông báo này

Ngoài ra, tùy chọn hủy đăng ký được tự động tích hợp trong mỗi thông báo đẩy được gửi (cách thức và vị trí tùy chọn hủy đăng ký này được cung cấp tùy thuộc vào hệ điều hành và/hoặc trình duyệt của người dùng)

Thông báo đẩy không được hiển thị trong khu vực trang web của trình duyệt mà trong cửa sổ bật lên riêng biệt hoặc thông qua dịch vụ do hệ điều hành cung cấp (điều này thay đổi tùy thuộc vào thiết bị, hệ điều hành và trình duyệt và một số trình duyệt cho phép cài đặt nhẹ -

Một thông báo thường bao gồm tiêu đề, một đoạn văn bản ngắn (tùy chọn có biểu tượng và/hoặc hình ảnh) và thường chứa liên kết trực tiếp đến trang web mà thông báo liên quan

Hệ thống thông báo là một phương tiện cực kỳ mạnh mẽ để tương tác với người dùng. Tuy nhiên, nhà cung cấp phải luôn chú ý không xuất bản quá nhiều trên phương tiện này, nếu không người dùng sẽ tắt tất cả các thông báo

1. 2. Thông báo đẩy web hoạt động như thế nào

Dịch vụ đẩy bên ngoài được kết nối giữa trình duyệt ở phía máy khách và máy chủ của nhà cung cấp tin nhắn. Dịch vụ đẩy chịu trách nhiệm gửi tin nhắn từ máy chủ đến người dùng tương ứng

Khi yêu cầu thông tin về đăng ký từ API đẩy web, phần công khai của khóa phải được chuyển. Với sự trợ giúp của phần riêng tư của khóa này, đến lượt máy chủ phải mã hóa các tin nhắn trước khi gửi chúng

 

Tập lệnh PHP để gửi thông báo đẩy

1. 2. 1. Quá trình đăng ký

Mã cho hai nhiệm vụ phải được tích hợp trên trang web của bạn. Đầu tiên là cung cấp cho khách truy cập cơ hội đăng ký thông báo đẩy trên web. Ngoài ra, trang của trang web phải cài đặt một dịch vụ ('service-worker'), trong đó ứng dụng khách được đăng ký trên máy chủ và các tin nhắn nhận được sẽ được xử lý. Service-worker được tải xuống ở chế độ nền cho nền tảng máy khách để nó có thể được thực thi bên ngoài ngữ cảnh của trang web

Nếu người dùng đăng ký dịch vụ, nhân viên dịch vụ được đăng ký (1). Đến lượt nhân viên dịch vụ yêu cầu tất cả thông tin cần thiết thông qua API đẩy web (2) và gửi thông tin này qua yêu cầu HTTP (3) đến máy chủ. Máy chủ lưu trữ thông tin này trong cơ sở dữ liệu của mình (4) để có thể gửi thông báo đến máy khách

1. 2. 2. gửi thông báo

Thông báo hiện có thể được gửi từ máy chủ tới tất cả các đăng ký đã đăng ký bằng yêu cầu HTTP (2). Để nhận dạng chính xác bản thân, chữ ký phải được truyền trong tiêu đề yêu cầu. Chữ ký này được tạo từ khóa chung được sử dụng để đăng ký cùng với phần riêng tư của khóa (1). Tin nhắn thực tế và có thể là thông tin khác được truyền dưới dạng dữ liệu người dùng - cũng được mã hóa. Nếu định dạng và mã hóa là chính xác và chữ ký được xác thực, dịch vụ đẩy sẽ gửi thông báo cho khách hàng (3)

1. 2. 3. Cặp khóa bắt buộc (VAPID)

Cần có một cặp khóa chứa khóa chung và khóa riêng cho toàn bộ quá trình. Hai khóa này được gọi là khóa VAPID (VAPID. Nhận dạng Máy chủ Ứng dụng Tự nguyện cho Web Push; . //công cụ. vietf. org/html/rfc8292) và phải được tạo một lần cho một trang web

Có nhiều công cụ khác nhau để tạo cặp khóa VAPID. Ngoài ra, một cặp khóa trực tuyến có thể được tạo e. g. tại https. //công cụ. phản ứng. com/vapid. Khóa riêng không bao giờ được hiển thị cho người dùng cuối (e. g. trong tập lệnh JS hoặc ở nơi nào khác), nhưng chỉ nên được sử dụng trên máy chủ để mã hóa khi tạo thông báo. Bảo vệ VAPID đảm bảo rằng thông báo chỉ có thể được gửi tới khách hàng từ máy chủ được ủy quyền

Thông tin rất chi tiết về VAPID có thể được tìm thấy trong bài đăng trên blog sau
https. //Blog. mozilla. org/services/2016/04/04/using-vapid-with-webpush/

2. Thực hiện

Sau khi xem xét chung trong chương trước, bây giờ chúng ta chuyển sang lập trình thực tế

2. 1. Đăng ký ở phía khách hàng

Vì phía máy khách chạy trong trình duyệt web nên mọi thứ trên máy khách được triển khai bằng JavaScript. Lưu ý rằng việc tích hợp các chức năng trong giao diện người dùng của trang web không phải là một phần của hướng dẫn này

Một số chức năng liên quan đến API đẩy web được xử lý không đồng bộ, đó là lý do tại sao mẫu lời hứa được sử dụng nhiều lần trong đoạn mã sau. Nhiều bài viết về chủ đề này có thể được tìm thấy trên internet - tại https. // trang web. nhà phát triển/lời hứa/người mới bắt đầu có thể tìm thấy lời giải thích rất hay

2. 1. 1. Kiểm tra xem có thông báo đẩy không

Trước hết, phải kiểm tra xem tất cả các yêu cầu có được đáp ứng để có thể nhận thông báo đẩy trên trình duyệt hiện tại hay không. Để làm được điều này, trình duyệt phải hỗ trợ API đẩy web và trang Web phải chạy trong ngữ cảnh an toàn (HTTPS)

Để biết thêm thông tin về API và tính khả dụng trong các trình duyệt hiện tại, hãy xem https. //www. w3. org/TR/push-api/ và

hàm pnAvailable() {
var bCó sẵn = false;
nếu (cửa sổ. isSecureContext) {
// chạy trong ngữ cảnh an toàn - kiểm tra Push-API khả dụng
bAvailable = (('serviceWorker' trong bộ điều hướng) &&
('PushManager' trong cửa sổ) &&
('Thông báo' trong cửa sổ));
} khác {
bảng điều khiển. log('site phải chạy trong ngữ cảnh an toàn. ');
}
trở lại bCó sẵn;
}

2. 1. 2. Xin phép gửi thông báo đẩy cho người dùng

Do việc lạm dụng thông báo đẩy trong quá khứ, chỉ nên yêu cầu đồng ý hiển thị thông báo sau khi người dùng đã cố tình thực hiện hành động đó (e. g. bằng cách nhấp vào nút - không tự động khi tải trang. )

Do đó, chức năng sau đây tốt nhất nên được tích hợp trên trang Web của riêng bạn bằng cách sử dụng liên kết hoặc nút trong một khu vực riêng biệt với các giải thích tương ứng cho thông báo đẩy. Điều này nên được coi là một quy tắc và không chỉ là 'thực tiễn tốt nhất'

Là một nhà cung cấp, cần lưu ý rằng nhiều (. hầu hết) người dùng có nhiều khả năng từ chối yêu cầu sớm mà không có giải thích chi tiết. Và một khi yêu cầu đã bị từ chối, rất khó để người dùng quay lại sau

Nếu người dùng đã từ chối hiển thị thông báo, anh ta sẽ không còn phải bận tâm đến các thông tin khác liên quan đến việc đăng ký thông báo đẩy, vì trước tiên anh ta phải tắt tính năng chặn thông báo thông qua chức năng trình duyệt tương ứng. Nếu cần, điều này có thể được giải thích chi tiết hơn ở một điểm thích hợp (e. g. trong Câu hỏi thường gặp)

chức năng async pnSubscribe() { if (pnAvailable()) { // nếu không được cấp hoặc bị từ chối cho đến nay. nếu (cửa sổ. Thông báo. quyền === 'mặc định') { cửa sổ đang chờ. Thông báo. xin phep(); . quyền === 'được cấp') { // nhân viên dịch vụ đăng ký đang chờ pnRegisterSW();

Trình duyệt ghi nhớ lựa chọn cuối cùng của người dùng. Điều này có thể được xác định bất cứ lúc nào thông qua thông báo. tài sản cho phép. Nếu người dùng chưa đưa ra quyết định, thuộc tính này được đặt thành 'mặc định', nếu không thì thành 'bị từ chối' hoặc 'được cấp'. Với hầu hết các trình duyệt, người dùng có thể đặt lại quyết định trong thanh tiêu đề hoặc trong cài đặt trang

2. 1. 3. Đăng ký nhân viên phục vụ

Để nhận và hiển thị thông báo đẩy, ngay cả khi người dùng không ở trên trang web đó, một dịch vụ phải được đăng ký chạy trong nền bên ngoài ngữ cảnh của trang web và do đó luôn sẵn sàng phản hồi thông báo

Cái gọi là service-worker là một tệp javascript riêng biệt mà trình duyệt sao chép từ vị trí gốc trên web sang máy tính cục bộ và được thực thi ở đó

chức năng không đồng bộ pnRegisterSW() { hoa tiêu. nhân viên phục vụ. đăng ký ('PNServiceWorker. js'). then((swReg) => { // bảng điều khiển đăng ký đã hoạt động. log('Đăng ký thành công. Phạm vi là ' + swReg. phạm vi); . catch((e) => { // bảng điều khiển đăng ký không thành công. log('Đăng ký thất bại với ' + e);

Không cần kiểm tra xem service-worker đã được đăng ký chưa. Trình duyệt (� API đẩy web) sẽ lo việc đó. Sau khi đăng ký, mọi thứ trong ngữ cảnh của trang web đã hoàn tất. Tất cả các bước tiếp theo được thực hiện trong service-worker

Tất cả các chức năng cần thiết và một số trình trợ giúp trong khi thử nghiệm được bao gồm trong PNClient. js

2. 1. 4. Triển khai service-worker

Trong bối cảnh trang web của chúng tôi, chúng tôi đã đăng ký nhân viên dịch vụ cho đến nay và hiện đang dành riêng cho các nhiệm vụ của anh ấy. Khi đăng ký, tệp javascript được chỉ định đã được tải xuống và thực thi. Việc đăng ký chỉ thành công nếu tập lệnh có thể được thực thi mà không có lỗi

Mã duy nhất trong nhân viên dịch vụ được thực thi trực tiếp là đăng ký người nghe cho một số sự kiện

// thêm trình lắng nghe sự kiện để đăng ký và tự gửi đăng ký đến máy chủ. addEventListener('kích hoạt', khi đăng ký); . addEventListener('push', pnPopupNotification); . và nghe tự click. addEventListener('notificationclick', pnNotificationClick);

2. 1. 4. 1. Đăng ký thông báo đẩy và gửi đăng ký đến máy chủ

Trong trình nghe sự kiện 'kích hoạt', thông báo được đăng ký bằng API đẩy web. Khóa VAPID công khai (xem 1. 2. 3. ) là cần thiết cho việc này. Ngoài ra, hàm yêu cầu giá trị boolean 'userVisibleOnly' làm tham số, giá trị này phải luôn được đặt thành true

Nhận xét về thông số này
Khi thiết kế API đẩy web, đã cân nhắc liệu tham số này có thể được sử dụng để kiểm soát xem một thông báo thường phải được hiển thị cho người dùng hay liệu một số hành động nhất định chỉ có thể được thực hiện trong nền

Tuy nhiên, có những lo ngại rằng điều này sẽ tạo khả năng cho các nhà phát triển thực hiện các hành động không mong muốn mà người dùng không hề hay biết. Do đó, tham số này có thể được coi là một "thỏa thuận im lặng" rằng người dùng luôn nhận được tin nhắn khi có thông báo đẩy đến

chức năng không đồng bộ pnSubscribe (sự kiện) { console. nhật ký ('Nhân viên phục vụ. kích hoạt sự kiện'); . appPublicKey, userVisibleOnly. ĐÚNG VẬY }; . sự đăng ký. pushManager. đăng ký (chọn). then((sub) => { // đăng ký thành công - gửi tới máy chủ pnSaveSubscription(sub). sau đó ((phản hồi) => { bảng điều khiển. nhật ký (phản hồi); . bắt ((e) => { // bảng điều khiển đăng ký không thành công. log('SaveSubscription thất bại với. ' + e); . bắt ((e) => { // bảng điều khiển đăng ký không thành công. log('Đăng ký không thành công với. ' + e); . log('Lỗi đăng ký thông báo. ' + e);

Khóa VAPID công khai phải được chuyển đến trình quản lý đẩy dưới dạng mảng UInt8. Nếu thành công, trình quản lý đẩy sẽ trả về một đối tượng đăng ký. Đối tượng này chứa tất cả thông tin mà máy chủ cần ngoài các khóa VAPID của chính nó để có thể mã hóa và gửi thông báo đẩy tới máy khách này. Với mục đích này, thông tin nhận được phải được gửi đến máy chủ

Dữ liệu được gửi đến máy chủ dưới dạng văn bản có định dạng JSON trong phần thân của yêu cầu POST HTTP. Để truyền, chúng tôi sử dụng phương thức tìm nạp () của API tìm nạp javascript. Phương pháp này cho phép các tài nguyên dễ dàng được truy cập hoặc gửi không đồng bộ qua mạng

async function pnSaveSubscription(sub) { // xâu chuỗi đối tượng để đăng dưới dạng nội dung với yêu cầu HTTP var fetchdata = { method. 'bài đăng', tiêu đề. { 'Loại nội dung'. 'ứng dụng/json' }, nội dung. JSON. stringify(phụ), }; . json();

Mục tiêu 'strSubscriberURL' là dịch vụ phải được cung cấp trên máy chủ của bạn. Nó chấp nhận dữ liệu được truyền và lưu trữ trong cơ sở dữ liệu. Việc triển khai dịch vụ này được mô tả trong phần 2. 2

Nếu cần thêm thông tin cụ thể ngoài đăng ký hiện tại (e. g. dữ liệu đăng nhập của người dùng, tham chiếu đến một đơn đặt hàng hoặc đặt chỗ cụ thể,. ), cái này cũng nên được chuyển vào đây, vì đây là liên kết trực tiếp duy nhất giữa máy khách và máy chủ

2. 1. 4. 2. Hiển thị các thông báo PUSH đã nhận

Ngược lại với phía máy chủ, ở phía máy khách, API đẩy web (và các dịch vụ đẩy) đảm nhận tất cả các nhiệm vụ liên quan đến xác minh và giải mã, cho phép chúng tôi tập trung vào việc hiển thị thông báo

Khi có thông báo đẩy, sự kiện 'đẩy' tương ứng được kích hoạt cho nhân viên dịch vụ. Vì vậy, điều đầu tiên cần làm là thiết lập một người nghe sự kiện này. Tất cả thông tin liên quan được chuyển đến người nghe trong tham số 'sự kiện'

Ngoài một số thuộc tính bên trong, đối tượng này chủ yếu chứa dữ liệu được gửi bởi máy chủ. Định dạng trong đó dữ liệu được truyền là trách nhiệm duy nhất của người gửi. Tại thời điểm này, văn bản thuần túy được giả định - điều này cũng có thể được gửi cho mục đích thử nghiệm từ một số công cụ hoặc từ một số công cụ dành cho nhà phát triển trình duyệt. (Xem Phụ lục)

Sau khi chúng tôi đã thực hiện việc gửi thông báo trong chương 2. 3. chúng ta sẽ chuyển sang một đối tượng được mã hóa dưới dạng chuỗi JSON. Thông qua đối tượng này, chúng tôi có thể kiểm soát hầu hết các thuộc tính của thông báo sẽ được hiển thị. Trước hết, đó chỉ là hiển thị một tin nhắn văn bản đơn giản

chức năng pnPushNotification (sự kiện) { bảng điều khiển. nhật ký ('đẩy sự kiện. ' + sự kiện); . '; . dữ liệu) { strText = sự kiện. dữ liệu. chữ(); . sự đăng ký. showNotification(strTitle, opt); . waitUntil(lời hứa);

Để hiển thị thông báo, hàm showNotification() phải được sử dụng, được truyền vào tiêu đề và một đối tượng tùy chọn. Đối tượng tùy chọn này có thể chứa các thuộc tính để kiểm soát nội dung, định dạng và hành vi của thông báo

Một mô tả chi tiết hơn sau trong Chương 2. 3 khi thông báo được gửi từ máy chủ. Cuộc gọi cuối cùng của waitUntil() đảm bảo rằng thông báo (được tạo không đồng bộ) thực sự được hiển thị trước khi chức năng thoát và trình duyệt chấm dứt nhân viên dịch vụ

2. 1. 4. 3. Phản hồi hành động của người dùng

Để có thể phản ứng với các hành động của người dùng, phải thiết lập một trình lắng nghe cho sự kiện 'notificationclick'. Với tham số 'sự kiện', chức năng này nhận tất cả dữ liệu cho thông báo trong 'sự kiện'. thuộc tính thông báo. Dữ liệu dành riêng cho người dùng có thể được chuyển trong 'sự kiện. thông báo. dữ liệu'. Ví dụ: dữ liệu này có thể chứa một URL sẽ được mở khi người dùng nhấp vào thông báo

chức năng pnNotificationClick (sự kiện) { console. nhật ký ('sự kiện click thông báo. ' + sự kiện); . thông báo. dữ liệu && sự kiện. thông báo. dữ liệu. url) { lời hứa const = khách hàng. openWindow(sự kiện. thông báo. dữ liệu. địa chỉ); . waitUntil(lời hứa);

Các chức năng khách hàng. openWindow() có sẵn để mở một URL trong trình duyệt. Ở đây cũng vậy, hàm waitUntil() phải được sử dụng để chờ cuộc gọi kết thúc đúng cách trước khi nhân viên dịch vụ có thể kết thúc

Các hành động khác có thể xảy ra bên trong sự kiện 'notificationclick' được thảo luận trong chương 2. 3 khi tin nhắn được gửi từ máy chủ

2. 2. Nhận và lưu đăng ký trên máy chủ

Để nhận và lưu các đăng ký, một dịch vụ được thiết lập trên máy chủ nhận dữ liệu được gửi bởi yêu cầu HTTP từ máy khách và lưu trữ nó trong cơ sở dữ liệu. Do đó, trước tiên phải kiểm tra xem đó có phải là yêu cầu POST hay không. Ngoài ra, phải kiểm tra xem nội dung của yêu cầu đã thực sự được xác định là dữ liệu JSON chưa

Nếu đúng yêu cầu, dữ liệu sẽ được lưu lại. Để đơn giản, chúng tôi sử dụng nhà cung cấp dữ liệu SQLite ở đây, vì nó tạo tệp dữ liệu của riêng mình và có thể được sử dụng mà không cần cấu hình thêm. Bằng cách sử dụng cùng một nhà cung cấp dữ liệu, các đăng ký sẽ được truy cập sau để gửi thông báo.  

Để tích hợp gói vào hệ thống của riêng bạn, bạn có thể sử dụng nhà cung cấp dữ liệu MySQL hoặc nhà cung cấp dữ liệu của riêng bạn triển khai giao diện PNDataProvider

// chỉ phục vụ yêu cầu POST chứa dữ liệu json hợp lệ if (strtolower($_SERVER['REQUEST_METHOD']) == 'post') { if (isset($_SERVER['CONTENT_TYPE']) && trim(strtolower($_SERVER[' . // đầu vào'))) === false) { $result['msg'] = 'dữ liệu JSON không hợp lệ. '; . == false) { $result['msg'] = 'đăng ký đã lưu trên máy chủ. '; . '; . '; . ';

2. 3. Tạo và gửi thông báo

Để gửi thông báo đẩy, chúng tôi phải tuân theo các định nghĩa của giao thức đẩy web (xem https. //công cụ. vietf. org/html/draft-ietf-webpush-protocol-12). Về cơ bản, cần có hai bước khi tạo thông báo đẩy

Để xác định chính bạn với dịch vụ đẩy, chữ ký phải được chuyển bằng khóa VAPID trong tiêu đề của yêu cầu. Bản thân thông báo được truyền ở dạng mã hóa và thông tin tương ứng cũng được truyền trong tiêu đề để trình duyệt có thể giải mã dữ liệu nhận được. Nếu thông báo được giải mã chính xác, trình duyệt sẽ kích hoạt sự kiện 'đẩy' tới nhân viên dịch vụ

2. 3. 1. Tiêu đề VAPID

Để xác định với dịch vụ đẩy, máy chủ phải ký một số thông tin ở định dạng JSON bằng khóa VAPID riêng của nó và chuyển nó vào tiêu đề. Dịch vụ đẩy xác minh điều này và nếu thành công sẽ chuyển tiếp thông báo tới người dùng

Chữ ký được cung cấp dưới dạng Mã thông báo Web JSON (JWT). JWT đã ký không gì khác hơn là một chuỗi, bao gồm ba thành phần được phân tách bằng dấu chấm

JWTInfo. JWTData. Chữ ký

Hai chuỗi đầu tiên là dữ liệu có định dạng JSON, phải được mã hóa 'URL safe base64', phần thứ ba chứa chữ ký được mã hóa

Thông tin JWT

Điều này chứa thông tin về chính JWT và thuật toán mã hóa được sử dụng

Dữ liệu JWT

Chứa thông tin về người gửi, người nhận (không phải người nhận cuối cùng mà là dịch vụ đẩy. ) và tin nhắn có hiệu lực trong bao lâu

Chữ ký

Chữ ký được tạo từ hai phần không dấu đầu tiên. Để làm được điều này, chúng được mã hóa bằng thuật toán ES256 (viết tắt của. ECDSA sử dụng đường cong P-256 và thuật toán băm SHA-256) sử dụng khóa VAPID

Dịch vụ đẩy hiện xác thực JWT bằng cách giải mã chữ ký bằng khóa VAPID công khai và so sánh nó với hai phần đầu tiên

JWT hoàn chỉnh (i. e. cả ba phần được phân tách bằng dấu chấm) được chuyển dưới dạng ủy quyền trong tiêu đề. Ngoài ra, khóa VAPID công khai 'URL safe base64' được mã hóa phải được chuyển thành giá trị khóa mật mã

Các tiêu đề VAPID bắt buộc được tạo bằng lớp PNVapid. Các khóa VAPID được truyền một lần trong hàm tạo vì chúng không thay đổi. Điểm cuối (i. e. người nhận) được chuyển lại cho mỗi thông báo được tạo

// thông tin $aJwtInfo = array('typ' => 'JWT', 'alg' => 'ES256'); . encodeBase64URL(json_encode($aJwtInfo)); . getOrigin($strEndpoint), 'exp' => time() + 43200, 'sub' => $this->strSubject ); . encodeBase64URL(json_encode($aJwtData)); . JwtData" sử dụng đường cong P-256 // và thuật toán băm SHA-256 $strData = $strJwtInfo. '. '. $strJwtDữ liệu; . getP256PEM($this->strPublicKey, $this->strPrivateKey); . signatureFromDER($strSignature)). == false) { $strSignature = self. encodeBase64URL($sig); . $strJwtThông tin. '. '. $strJwtDữ liệu. '. '. $strSignature, 'Khóa tiền điện tử' => 'p256ecdsa='. bản thân. encodeBase64URL($this->strPublicKey) );

2. 3. 2. Mã hóa tải trọng

Do các thông báo đẩy được gửi bởi nhiều nhà cung cấp dịch vụ đẩy khác nhau nên dữ liệu người dùng thực tế được truyền ở dạng mã hóa. Dịch vụ đẩy không thể giải mã và đọc dữ liệu này

Điều này được định nghĩa trong 'Mã hóa tin nhắn cho Web Push' (xem https. //công cụ. vietf. org/html/draft-ietf-webpush-encryption-09)

Các kỹ thuật được sử dụng trong quá trình mã hóa nằm ngoài phạm vi của hướng dẫn này và do đó không được giải thích chi tiết. Bạn sẽ tìm thấy lời giải thích hay trong cuốn sách đẩy web của Matt Gaunt (https. //web-push-sách. mặt hốc hác. com) trong chương 4. 2

Tất cả các chức năng cần thiết được cung cấp bởi lớp PNEncryption. Lớp này cũng cung cấp các tiêu đề yêu cầu bổ sung cần thiết để thông báo có thể được giải mã. Trong hàm tạo, lớp này yêu cầu khóa chung và mã xác thực do trình duyệt tạo khi đăng ký và tất nhiên dữ liệu người dùng phải được mã hóa

2. 3. 3. tải trọng

Tại thời điểm này, chúng tôi sẽ xem xét kỹ hơn dữ liệu người dùng mà chúng tôi muốn gửi cùng với thông báo. Như đã đề cập trong phần 2. 1. 4, các tùy chọn khả thi có thể được chuyển đến hàm showNotification() trong service-worker hiện được giải thích chi tiết hơn

Vì định dạng và nội dung của tải trọng có thể được xác định tự do (miễn là độ dài của dữ liệu người dùng không vượt quá khoảng. 4000 ký tự), tôi đã quyết định gộp tất cả thông tin để hiển thị thông báo ở phía máy chủ vào một đối tượng. Ngoài tiêu đề và URL mục tiêu mà chúng tôi muốn hướng người dùng đến, đối tượng này cũng chứa các tùy chọn hoàn chỉnh cho hàm showNotification()

Mọi thứ cùng nhau sau đó được mã hóa JSON và gửi dưới dạng tải trọng. Điều này mang lại cho chúng tôi sự linh hoạt cao nhất để xác định cách hiển thị và hành vi của thông báo từ PHP mà không phải thực hiện các thay đổi đối với nhân viên dịch vụ

2. 3. 3. 1. Các tùy chọn của showNotification()

Để giải quyết người dùng bằng một thông báo rõ ràng, thông báo này phải bao gồm ít nhất một tiêu đề ngắn, có ý nghĩa, một biểu tượng có giá trị nhận dạng (-> tốt nhất là logo của công ty hoặc sản phẩm) và một văn bản ngắn, chính xác

Tiêu đề được truyền trực tiếp dưới dạng tham số, hai giá trị còn lại là một phần của đối tượng tùy chọn. Không thể đưa ra khuyến nghị rõ ràng về định dạng của ký hiệu. Trong mọi trường hợp, nên chọn định dạng hình vuông, vì hầu hết các trình duyệt hoặc nền tảng đều cắt các định dạng khác cho phù hợp

Kích thước 64dp (px * tỷ lệ pixel của thiết bị - điều này mang lại 192px cho giá trị là 3) đã được chứng minh. Văn bản không được dài hơn khoảng 200 ký tự. Ở đây, các trình duyệt và nền tảng cũng khác nhau về hành vi khi một văn bản dài hơn được cung cấp. Một số giới hạn văn bản ở một số ký tự nhất định, số khác giới hạn ở một số dòng nhất định. Ở đây cũng cần lưu ý rằng một văn bản quá dài thường không nhận được sự quan tâm cần thiết từ người dùng

Với tùy chọn 'thẻ', thông báo có thể được nhóm cho người dùng. Điều này đảm bảo rằng chỉ những thông báo nhận được gần đây nhất có cùng chỉ báo mới được hiển thị cho người dùng để anh ta không bị "ngập" trong một chuỗi nhiều thông báo cùng loại. Nếu tùy chọn 'renotify' cũng được đặt, người dùng sẽ được thông báo và thông báo sẽ vẫn được nhóm trong danh sách hiển thị. Nếu không được đặt, sẽ không có thông báo nào được hiển thị

Sự hỗ trợ của các thuộc tính sau, có thể được xác định để định dạng thông báo hoặc hành vi của nó, rất khác nhau giữa một số trình duyệt/nền tảng và do đó nên thận trọng khi sử dụng

Hình ảnh

URL tới một hình ảnh lớn hơn, thường được hiển thị bên dưới văn bản. Một lần nữa, rất khó để đưa ra một quy tắc về kích thước hoặc định dạng

huy hiệu

URL tới huy hiệu (thường là đơn sắc). Huy hiệu được sử dụng để phân loại tốt hơn người gửi tin nhắn. Cho đến nay, điều này chỉ được hỗ trợ bởi một số trình duyệt - hầu hết chúng đều hiển thị biểu tượng của riêng chúng

hành động bổ sung

Một số trình duyệt cho phép hiển thị một số hành động nhất định trong thông báo để người dùng có thể chọn một trong số đó. Mã javascript tương ứng phải được xác định trong nhân viên dịch vụ trong sự kiện 'notificationclick'. Nếu chức năng này được sử dụng, phải luôn cung cấp một màn hình và xử lý thay thế nếu trình duyệt hoặc hệ thống đích không hỗ trợ chức năng này

Một hành động được xác định bởi
- hoạt động. ID nội bộ được sử dụng trong sự kiện 'notificationclick'
- tiêu đề. văn bản được hiển thị
- biểu tượng. [tùy chọn] URL tới một biểu tượng được chỉ định cho hành động

Số lượng hành động có thể được hiển thị trong một thông báo cũng khác nhau. Một bài viết thú vị về chủ đề này có thể được tìm thấy tại https. // nhà phát triển. Google. com/web/cập nhật/2016/01/thông báo-hành động

Dấu thời gian

Điều này cho phép bạn đặt thời gian khi tin nhắn được tạo. Nếu tùy chọn này không được đặt, thời gian tin nhắn đến với người dùng sẽ được đặt

Yêu cầu tương tác

Thuộc tính này chỉ định rằng tương tác của người dùng là bắt buộc đối với thông báo. Popup thường hiển thị ngay lập tức và biến mất sau một thời gian nhất định. Nếu tùy chọn này được kích hoạt, cửa sổ bật lên sẽ tồn tại cho đến khi người dùng trả lời. Thuộc tính này nên được sử dụng cẩn thận (chỉ dành cho các sự cố rất quan trọng hoặc bảo mật) vì người dùng có thể cảm thấy khó chịu và có thể chặn thông báo vĩnh viễn

Im lặng

Không có âm thanh được phát hoặc rung được kích hoạt

Rung

Một kiểu rung để chạy với màn hình thông báo. Mẫu rung động phải là một mảng có ít nhất một phần tử. Các giá trị là thời gian tính bằng mili giây trong đó các chỉ số chẵn (0, 2, 4, v.v. ) cho biết thời gian rung và các chỉ số lẻ cho biết thời gian tạm dừng. Ví dụ: [300, 100, 400] sẽ rung 300 mili giây, tạm dừng 100 mili giây, sau đó rung 400 mili giây

Âm thanh

URL tới tệp âm thanh. Cho đến nay tôi vẫn chưa tìm thấy trình duyệt nào hỗ trợ điều này

2. 3. 3. 2. Mở rộng trình xử lý sự kiện 'push' trong service-worker

Để tạo thông báo, lớp PNPayload cung cấp tất cả các phương thức để xác định các thuộc tính được mô tả và tạo Đối tượng

Vì ban đầu chúng ta coi văn bản thuần túy là dữ liệu người dùng khi tạo service-worker trong phần 2. 1. 4, trình xử lý sự kiện hiện phải được mở rộng cho dữ liệu có trong thông báo. Tất cả những gì cần làm là giải mã dữ liệu định dạng JSON đã nhận và chuyển dữ liệu đó khi gọi hàm showNotification()

chức năng pnPushNotification (sự kiện) { bảng điều khiển. nhật ký ('đẩy sự kiện. ' + sự kiện); . strDefIcon }; . data) { // Đối tượng PushMessageData chứa tải trọng được đẩy try { // cố gắng phân tích cú pháp chuỗi JSON của tải trọng oPayload = JSON. phân tích (sự kiện. dữ liệu. chữ()); . //. có thể xuất hiện trong khi thử nghiệm trực tiếp từ DevTools opt = { icon. strDefIcon, nội dung. sự kiện. dữ liệu. chữ(), }; . tiêu đề. = không xác định && oPayload. tiêu đề. = '') { strTitle = oPayload. tiêu đề; . opt; . opt. biểu tượng == không xác định. o Tải trọng. opt. biểu tượng == null. o Tải trọng. biểu tượng == '') { // nếu không có biểu tượng nào được xác định, hãy sử dụng tùy chọn mặc định. biểu tượng = strDefIcon; . sự đăng ký. showNotification(strTitle, opt); . waitUntil(lời hứa);

2. 3. 4. Gửi thông báo qua Http-request

Bước cuối cùng là gửi (các) thông báo đến các dịch vụ đẩy tương ứng thông qua yêu cầu HTTP. Để độc lập nhất có thể, điều này được thực hiện trực tiếp bằng cURL

Để có ít thời gian nhàn rỗi nhất có thể ngay cả khi có một số lượng lớn thông báo được gửi, trước tiên, tất cả các tin nhắn đang chờ xử lý đều được tạo hoàn toàn, mã hóa và sau đó gửi bằng cách sử dụng Đa yêu cầu cURL

Vì PHP không hỗ trợ đa luồng nên đây là giải pháp tao nhã nhất mà không cần các phần mở rộng PHP bên ngoài phức tạp. Sau khi tất cả các thông báo đã được gửi, mã phản hồi của tất cả các yêu cầu được đọc để lọc ra bất kỳ đăng ký nào không còn hợp lệ và, nếu được định cấu hình, để xóa chúng khỏi cơ sở dữ liệu

Toàn bộ quá trình gửi thông báo

  • tạo chữ ký tiêu đề VAPID
  • tạo tải trọng thông báo
  • mã hóa tải trọng
  • gửi qua yêu cầu HTTP
  • Nếu cần, hãy xóa các đăng ký đã hết hạn/không còn hiệu lực
được triển khai trong PNServer bằng cách sử dụng các lớp tương ứng

3. ruột thừa

3. 1. Đăng ký có hiệu lực trong bao lâu?

Về nguyên tắc, thông tin do trình duyệt cung cấp cho đăng ký cũng chứa dấu thời gian khi hết hạn. Hầu như không có trình duyệt nào gán giá trị hợp lệ cho trường dữ liệu này (giá trị đúng chỉ được đặt bởi MS Edge)

Theo thông số kỹ thuật cho các đăng ký có ngày hết hạn, dịch vụ đẩy sẽ gửi sự kiện 'pushsubscriptionchange' tới nhân viên dịch vụ tương ứng trước khi hết hạn. Trong trường hợp này, nhân viên dịch vụ nên đăng ký lại các thông báo

Nếu người dùng thoát đăng ký hiện có (thường bằng cách chặn thông báo cho trang trong trình duyệt), điều này sẽ được trình duyệt chuyển tiếp đến dịch vụ đẩy tương ứng. Nếu sau đó, máy chủ cố gắng gửi thông báo đến điểm cuối này thì nó không được chuyển tiếp tới trình duyệt mà thay vào đó, dịch vụ đẩy sẽ gửi mã phản hồi 410 trở lại máy chủ

Đối với những trường hợp đó, Máy chủ thông báo có tùy chọn xóa các đăng ký không còn hợp lệ khỏi cơ sở dữ liệu của nó để tránh lưu lượng dữ liệu không cần thiết

Tuy nhiên, nếu trình duyệt không còn được sử dụng, bị gỡ cài đặt hoặc hệ thống không còn được sử dụng vì lý do khác (cài đặt lại, lỗi thời, bị lỗi), các đăng ký hiện có không có ngày hết hạn sẽ được giữ lại trong cơ sở dữ liệu

W3C và các nhà cung cấp trình duyệt tiêu chuẩn đang xem xét kiểm soát vấn đề này. Thật không may, bản thân máy chủ thông báo không có cách đáng tin cậy để phát hiện các đăng ký không hoạt động

3. 2. Cài đặt trình duyệt tiêu chuẩn để hiển thị thông báo

Hầu hết các trình duyệt tiêu chuẩn (máy tính để bàn) cung cấp tùy chọn cài đặt xem nên sử dụng dịch vụ do hệ điều hành cung cấp hay triển khai riêng để hiển thị thông báo

3. 2. 1. firefox

Nhập 'về. config' trong trường điều hướng cho URL Internet và tìm kiếm 'cảnh báo'. Giá trị 'cảnh báo. useSystemBackend' kiểm soát hành vi. Nếu được đặt thành true, thông báo sẽ được hiển thị bởi hệ điều hành, nếu không, triển khai nội bộ của trình duyệt sẽ được sử dụng để hiển thị thông báo

3. 2. 2. Google Chrome

Nhập 'cơm. //flags' trong trường điều hướng cho URL Internet và sau đó tìm kiếm 'thông báo'. Cài đặt 'Bật thông báo gốc' kiểm soát đầu ra

3. 2. 3. Microsoft Cạnh

Do Trình duyệt Edge được tích hợp rất nhiều vào hệ điều hành Windows nên về cơ bản, nó sử dụng Trung tâm điều khiển để hiển thị các thông báo

3. 3. Gỡ lỗi và kiểm tra các công nhân dịch vụ

Có nhiều tùy chọn khác nhau để gỡ lỗi và kiểm tra nhân viên dịch vụ trong các công cụ dành cho nhà phát triển của các trình duyệt tiêu chuẩn

3. 3. 1. firefox

Nhập 'về. gỡ lỗi #/runtime/this-firefox' trong trường điều hướng cho URL Internet. Tất cả các nhân viên dịch vụ đã đăng ký được hiển thị bên dưới danh sách các tiện ích mở rộng

Service-worker có thể được bắt đầu hoặc đăng xuất tại đây. Sau khi nhân viên dịch vụ được bắt đầu, một thông báo kiểm tra (trống�) có thể được đẩy hoặc có thể mở bảng điều khiển và trình gỡ lỗi của nhân viên dịch vụ

3. 3. 2. Google Chrome

Mở công cụ dành cho nhà phát triển khi trang đăng ký thông báo đang mở. Service-worker đã đăng ký được hiển thị dưới mục menu 'Ứng dụng'. Tại đây bạn có thể bắt đầu, dừng, cập nhật hoặc hủy đăng ký service-worker. Một tin nhắn kiểm tra cũng có thể được gửi và bạn có thể chuyển sang mã nguồn / trình gỡ lỗi

3. 3. 3. Microsoft Cạnh

Tương tự như Chrome, MS Edge có một mục trong menu chính của các công cụ dành cho nhà phát triển có tên 'Serviceworker'

4. Phần kết luận

Thông báo đẩy trên web là một phương tiện tuyệt vời để giữ người dùng truy cập trang web xuất bản nội dung mà họ thích

Triển khai thông báo đẩy Web bằng PHP và JavaScript không khó. Nó yêu cầu một số công việc nhưng gói PHP Web Push Notifications Server đã được tạo để đơn giản hóa công việc này

Bạn có thể tải xuống hoặc cài đặt gói này bằng công cụ Trình soạn thảo PHP bằng cách truy cập vào đây để lấy mã gói

Làm cách nào để gửi thông báo đẩy bằng PHP?

Tạo hệ thống thông báo theo thời gian thực bằng PHP và AJAX .
Step 1. Import Tables in Database
Bước 2. Create Navigation and Form to Display Push Notifications
Bước 3. Chèn bản ghi mới vào cơ sở dữ liệu
Bước 4. Fetch Records and Send to AJAX Call
Bước 5. Gửi biểu mẫu và cập nhật HTML với AJAX

Chúng tôi có thể tự động hóa thông báo đẩy không?

eCommerce stores can set up automated push notifications to re-engage users and to incentivize the purchase through the medium of promos, discounts, free shipping, etc. Nếu bạn đã có các chiến dịch tiếp thị qua email, bạn có thể tăng cường chúng bằng các thông báo đẩy web tự động để khuếch đại hiệu quả của chúng.

Làm cách nào để tạo thông báo bật lên trong PHP?

PHP là ngôn ngữ phía máy chủ và không hỗ trợ thông báo cảnh báo bật lên. Trình duyệt của khách hàng đưa ra cảnh báo. Để bật một thông báo cảnh báo qua PHP, chúng ta cần kết xuất mã JavaScript bằng PHP và gửi mã đó tới trình duyệt . JavaScript is a client-side language.

Cách tốt nhất để gửi thông báo đẩy là gì?

Thông báo đẩy là vô song về mức độ tương tác, với tỷ lệ mở lên tới 90%. Bạn muốn gửi thông báo đẩy nhưng chưa có ứng dụng dành cho thiết bị di động? .
một tín hiệu
Căn cứ hỏa lực của Google
Mận nạc
xe đẩy
ĐẩyPhi hành đoàn
khí cầu
CataPush
Thông báo đẩy cho WordPress