Git Hub
коротко

Push Notifications

4 марта 2017, 14:03

Оглавление

  1. получаем токен устройства
  2. генерация фалов из сертификатов
  3. настраиваем серверную часть (PHP)
  4. меняем звук уведомления по умолчанию
  5. удаляем бейджи

APNS — Apple Push Notification Service

1. получить токен устройства

для этого в файл AppDelegate.swift добавляем два метода

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        let notifyCenter = UNUserNotificationCenter.current()
        notifyCenter.delegate = self
        notifyCenter.requestAuthorization(options: [.sound, .alert, .badge]){ (granted, error) in
            print("ok: \(granted)")
            print("err: \(error)")
        }
        application.registerForRemoteNotifications()
        return true
    }

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        
        let token = PushNotifyHelper.getTokenFromDeviceToken(deviceToken)
        print("Registration device token: \(token)")
    }
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print("Handle push from foreground")
        // custom code to handle push while app is in the foreground
        print("\(notification.request.content.userInfo)")
    }
    
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        print("Handle push from background or closed")
        // if you set a member variable in didReceiveRemoteNotification, you  will know if this is from closed or background
        print("\(response.notification.request.content.userInfo)")
    }

PushNotifyHelper

import UserNotifications

class PushNotifyHelper {
    
    class func getTokenFromDeviceToken(_ deviceToken: Data) -> String{
        var token = ""
        for i in 0..<deviceToken.count {
            token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]])
        }
        return token
    }
}

3. Настраиваем серверную часть (PHP)

$deviceToken = "0000000000000000000000000000000000000000000000000";

class PushSender{
    static public function run($deviceToken){
        $certificateFile = "push.pem";
        $certificateString = file_get_contents('push.pem');
        $port = 2195;
        $host = "gateway.sandbox.push.apple.com";
        $address = "ssl://{$host}:{$port}";


        $title = "title";
        $message = "Privet";
        $arMessage = array(
            'aps' => array(
                'alert' => array(
                    'title' => $title,
                    'body' => $message,
                ),
                'url-args' => array(
                    '',
                ),
                'sound'=>'default'
            ),
        );

        $error = 0;
        $errorString = "";
        $context =   $streamContext = stream_context_create();
        $path = tempnam(sys_get_temp_dir(), 'cert_');
        file_put_contents($path, $certificateString);
        stream_context_set_option($streamContext, 'ssl', 'local_cert',  $path);

        $client = @stream_socket_client(
            $address,
            $error,
            $errorString,
            2,
            STREAM_CLIENT_CONNECT,
            $context
        );

        $encodedPayload = json_encode($arMessage);
        $binaryData = chr(0).
            chr(0).
            chr(32).
            pack('H*', $deviceToken).
            chr(0).chr(strlen($encodedPayload)).
            $encodedPayload;

        fwrite($client, $binaryData);
        fclose($client);



    }
}

PushSender::run($deviceToken);

для примера я сделал анти-рефакторинг и объединил несколько разных классов в один метод нарушив сразу несколько парадигм ООП. но сделал это чтобы не размазывать код, а попытаться наглядно показать объём который нужен для отправки уведомлений с сервера на iOS устройства.

5. удаляем бейджи )

UIApplication.shared.applicationIconBadgeNumber = 0;

Ссылки:

Поделиться
Запинить
Популярное