如何发送推送通知以在线测试 iOS PushKit 集成?

Posted

技术标签:

【中文标题】如何发送推送通知以在线测试 iOS PushKit 集成?【英文标题】:How to send Push Notifications to test iOS PushKit integration online? 【发布时间】:2016-11-21 12:44:40 【问题描述】:

我已经实现了 PushKit。现在我想获得推送通知。由于我们有许多接受设备令牌和 .pem 文件以发送远程通知的在线 APNS 服务,因此有没有办法在线获取推送通知?

【问题讨论】:

【参考方案1】:

您可以创建自己的 php 文件。

来源 https://github.com/hasyapanchasara/PushKit_SilentPushNotification

使用下面的结构来完成你的任务。

使用这个 simplepush.php 文件

<?php

// Put your device token here (without spaces):

    
      $deviceToken = '1234567890123456789';
//

    
// Put your private key's passphrase here:
$passphrase = 'ProjectName';

// Put your alert message here:
$message = 'My first push notification!';



$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'PemFileName.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
//  'ssl://gateway.push.apple.com:2195', $err,
    'ssl://gateway.sandbox.push.apple.com:2195', $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body

$body['aps'] = array(
                     'content-available'=> 1,
                     'alert' => $message,
                     'sound' => 'default',
                     'badge' => 0,
                     );

    

// Encode the payload as JSON
    
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

使用以下命令创建 pem 文件并在上面的代码中使用它

$ openssl x509 -in aps_development.cer -inform der -out PushCert.pem

# Convert .p12 to .pem. Enter your pass pharse which is the same pwd that you have given while creating the .p12 certificate. PEM pass phrase also same as .p12 cert.  
$ openssl pkcs12 -nocerts -out PushKey1.pem -in pushkey.p12

Enter Import Password:

MAC verified OK

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

# To remove passpharse for the key to access globally. This only solved my stream_socket_client() & certificate capath warnings.
$ openssl rsa -in PushKey1.pem -out PushKey1_Rmv.pem

Enter pass phrase for PushChatKey1.pem:

writing RSA key

# To join the two .pem file into one file:
$ cat PushCert.pem PushKey1_Rmv.pem > ApnsDev.pem

之后转到 simplepush.php 位置并触发命令 -> php simplepush.php

这样您可以测试您的推送工具包通知设置架构。

https://zeropush.com/guide/guide-to-pushkit-and-voip

https://www.raywenderlich.com/123862/push-notifications-tutorial

Download

使用 Swift 4 代码更新

import UIKit
import PushKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,PKPushRegistryDelegate 

var window: UIWindow?

var isUserHasLoggedInWithApp: Bool = true
var checkForIncomingCall: Bool = true
var userIsHolding: Bool = true

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 


    if #available(ios 8.0, *)


        let viewAccept = UIMutableUserNotificationAction()
        viewAccept.identifier = "VIEW_ACCEPT"
        viewAccept.title = "Accept"
        viewAccept.activationMode = .Foreground
        viewAccept.destructive = false
        viewAccept.authenticationRequired =  false

        let viewDecline = UIMutableUserNotificationAction()
        viewDecline.identifier = "VIEW_DECLINE"
        viewDecline.title = "Decline"
        viewDecline.activationMode = .Background
        viewDecline.destructive = true
        viewDecline.authenticationRequired = false

        let INCOMINGCALL_CATEGORY = UIMutableUserNotificationCategory()
        INCOMINGCALL_CATEGORY.identifier = "INCOMINGCALL_CATEGORY"
        INCOMINGCALL_CATEGORY.setActions([viewAccept,viewDecline], forContext: .Default)

        if application.respondsToSelector("isRegisteredForRemoteNotifications")
        
            let categories = NSSet(array: [INCOMINGCALL_CATEGORY])
            let types:UIUserNotificationType = ([.Alert, .Sound, .Badge])

            let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: categories as? Set<UIUserNotificationCategory>)

            application.registerUserNotificationSettings(settings)
            application.registerForRemoteNotifications()
        

    
    else
        let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound]
        application.registerForRemoteNotificationTypes(types)
    


    self.PushKitRegistration()

return true

//MARK: - PushKitRegistration

func PushKitRegistration()


    let mainQueue = dispatch_get_main_queue()
    // Create a push registry object
    if #available(iOS 8.0, *) 

    let voipRegistry: PKPushRegistry = PKPushRegistry(queue: mainQueue)

    // Set the registry's delegate to self

    voipRegistry.delegate = self

    // Set the push type to VoIP

    voipRegistry.desiredPushTypes = [PKPushTypeVoIP]

     else 
    // Fallback on earlier versions
    





@available(iOS 8.0, *)
func pushRegistry(registry: PKPushRegistry!, didUpdatePushCredentials credentials: PKPushCredentials!, forType type: String!) 
    // Register VoIP push token (a property of PKPushCredentials) with server

    let hexString : String = UnsafeBufferPointer<UInt8>(start: UnsafePointer(credentials.token.bytes),
    count: credentials.token.length).map  String(format: "%02x", $0) .joinWithSeparator("")

    print(hexString)





@available(iOS 8.0, *)
func pushRegistry(registry: PKPushRegistry!, didReceiveIncomingPushWithPayload payload: PKPushPayload!, forType type: String!) 

    // Process the received push

    // Below process is specific to schedule local notification once pushkit payload received

    var arrTemp = [NSObject : AnyObject]()
    arrTemp = payload.dictionaryPayload

    let dict : Dictionary <String, AnyObject> = arrTemp["aps"] as! Dictionary<String, AnyObject>


    if isUserHasLoggedInWithApp // Check this flag then only proceed
    

        if UIApplication.sharedApplication().applicationState == UIApplicationState.Background || UIApplication.sharedApplication().applicationState == UIApplicationState.Inactive
        

            if checkForIncomingCall // Check this flag to know incoming call or something else
            

                var strTitle : String = dict["alertTitle"] as? String ?? ""
                let strBody : String = dict["alertBody"] as? String ?? ""
                strTitle = strTitle + "\n" + strBody

                let notificationIncomingCall = UILocalNotification()

                notificationIncomingCall.fireDate = NSDate(timeIntervalSinceNow: 1)
                notificationIncomingCall.alertBody =  strTitle
                notificationIncomingCall.alertAction = "Open"
                notificationIncomingCall.soundName = "SoundFile.mp3"
                notificationIncomingCall.category = dict["category"] as? String ?? ""

                //"As per payload you receive"
                notificationIncomingCall.userInfo = ["key1": "Value1"  ,"key2": "Value2" ]


                UIApplication.sharedApplication().scheduleLocalNotification(notificationIncomingCall)

            
            else
            
                //  something else
            

        
    




//MARK: - Local Notification Methods

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification)

    // Your interactive local notification events will be called at this place





【讨论】:

我正在使用相同的 .php 文件来发送远程通知。现在,我收到了远程通知,但没有收到 PushKit 通知。 是的,我已经完成了 iOS 代码。我正在使用相同的脚本而不是 PushKit 通知来获取 apns 远程通知。 检查我更新的答案,我希望 PushKit 你已经用这种方式完成了 iOS 端代码。 APNS 相关代码不适用于 PushKit 相关代码。 有效吗?用图片检查更新的答案,如果有任何疑问,请告诉我。 是的,它奏效了。我选择了 Apple 推送通知服务 (SSL) 而不是 VoIP 服务。我重新创建了证书并能够发送 PushKit 通知。非常感谢:)【参考方案2】:

对我来说,最简单的方法是使用我在 GitHub 上找到的名为 Pusher 的专用应用程序。它有 macOS 和 iOS 两个版本,非常好用,而且很简单!

【讨论】:

发送推送通知的非常简单的应用程序。谢谢。 :) 超级好用的应用程序!必须有! Pusher 是一个很棒的工具,现在推送 Voip Push 效果很好。

以上是关于如何发送推送通知以在线测试 iOS PushKit 集成?的主要内容,如果未能解决你的问题,请参考以下文章

iOS VoIP 推送通知 (PushKit)

在 iOS8.0.2 上没有收到 Pushkit voip 推送通知

接收 PushKit VoIP 通知 iOS

迁移到 iOS VoIP 推送通知

如何测试 PushKit Voip?

iOS 13 在后台没有收到 VoIP 推送通知