Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在接收设备上将一个推送通知替换为另一个推送通知?_Ios_Push Notification - Fatal编程技术网

Ios 如何在接收设备上将一个推送通知替换为另一个推送通知?

Ios 如何在接收设备上将一个推送通知替换为另一个推送通知?,ios,push-notification,Ios,Push Notification,我试图复制当呼叫者开始呼叫关闭此WhatsApp的用户时,WhatsApp如何向被呼叫者的设备发出呼入呼叫的信号。根据锁定屏幕,呼叫接收器的设备似乎以大约1秒的间隔重复接收推送通知,称为“来自用户名的呼叫”。但最值得注意的是,通知并没有堆积起来。似乎每一个关于来电的通知都会被下一个这样的通知所取代。当呼叫者挂断呼叫时,被叫端的最后一个来电通知将被替换为“未接来电”通知 如何以这种方式实现推送通知的替换/删除?WhatsApp使用静默通知触发本地通知的显示。本地通知可以由应用程序替换。这是我最后一

我试图复制当呼叫者开始呼叫关闭此WhatsApp的用户时,WhatsApp如何向被呼叫者的设备发出呼入呼叫的信号。根据锁定屏幕,呼叫接收器的设备似乎以大约1秒的间隔重复接收推送通知,称为“来自用户名的呼叫”。但最值得注意的是,通知并没有堆积起来。似乎每一个关于来电的通知都会被下一个这样的通知所取代。当呼叫者挂断呼叫时,被叫端的最后一个来电通知将被替换为“未接来电”通知


如何以这种方式实现推送通知的替换/删除?

WhatsApp使用静默通知触发本地通知的显示。本地通知可以由应用程序替换。这是我最后一次反向设计他们的流程。他们现在可能使用推送套件消息,因为他们是一个VoIP应用程序。

Whatsapp、skype或任何其他与VoIP相关的应用程序都使用推送套件

在有效负载中使用content available=1使其成为静默推送通知

静默推送通知将在后台调用您的应用程序,即使您的应用程序处于终止状态(终止状态),因此它将允许您安排本地通知

  • 一旦您拥有传入呼叫计划本地通知的有效负载

  • 一旦您获得未接来电的有效负载,请取消来电本地通知并安排未接来电本地通知

  • 注意-来电或未接来电本地通知对象始终保持NSUserDefault,以确保即使重新启动设备,其可用性也可以取消

  • 可保存在localnotification.userInfo中的有效负载相关详细信息

Pushkit代码

import UIKit
import PushKit


class AppDelegate: UIResponder, UIApplicationDelegate,PKPushRegistryDelegate{



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


    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

    // As per payload schedule local notification / cancel local notification


}

}
您可以使用“apns折叠id”。它将用相同的id替换通知内容


感谢信的可能副本。如果应用程序被强制关闭,我如何运行任何代码来安排本地通知?如果使用APNS,则无法保证。iOS可能不会运行应用程序来处理它们。WhatsApp也有同样的问题(如果他们没有转移到PK)。如果你使用PK,iOS将在后台启动你的应用程序来处理它们,因为PK消息总是无声的。这并不确保你会收到呼叫通知。在VoIP中使用PushKit曾经是一种选择,但现在它迫使您使用CallKit。顺便说一句,Whatsapp有一项特殊权利。
{
    "aps": {
        "content-available": 1,
        "screen": "IncomingCall",
        "alertTitle": "Mr ...",
        "alertBody": "Call from ...",
        "category": "INCOMINGCALL_CATEGORY",
        "data": "Any specific data you want to pass"
    }
}