Prior to .p8 tokens, we were using .p12 cert for communication with APNS. We have since migrated to use .p8 token within our 3rd party push notification provider however, we still have the .p12 cert associated with our AppStore provisioning profile.
Do we still need to maintain the .p12 cert to ensure the validity of the AppStore provisioning profile?
Will revoking the .p12 cert result in inability for Apple to recognize that the app has push notifications enabled?
Notifications
RSS for tagLearn about the technical aspects of notification delivery on device, including notification types, priorities, and notification center management.
Post
Replies
Boosts
Views
Activity
Hi,
I just downloaded Xcode 15.3 beta 3 and went to create a new project, however I cannot find the widget extension. Do I have to enable this extension or download it?
Hi, I need a feature in the iOS app that requires updating the user screen via FCM.
In other words, I have to update it with no sound and screen display, but this doesn't work.
When I remove the notification field, the notification will not be displayed to the user, but the sound will be played.
If I remove the sound field, I can make no sound, but the user will be notified.
If I remove both, I'm not getting this from the iOS app.
How can I solve this??
Which option should I send Push from the server??
I'm also using Notification Service Extension.
I have a shopping list app that shares a list of Product records between users. The app on my phone shared its private database with another user account (running on a simulator) which accepted it. Both devices can see changes from the other if the device does a full refresh from iCloud. Now I want to have the app on the devices be notified when the other changes/adds/deletes a Product record. I did the following to get push notifications to work (but haven't been successful yet)
I have enabled background fetch and remote notifications in my app capabilities.
The app registers for remote notifications with UIApplication.shared.registerForRemoteNotifications() and receives the didRegisterForRemoteNotificationsWithDeviceToken callback.
The app sets a subscription with CKModifySubscriptionsOperation for the "Product" recordType. I set the QoS to .utility on the appropriate private or shared database.
However, when I add a Product record on my record, the didReceiveRemoteNotification callback doesn't execute.
What am I missing?
Hi! I have recently added the functionality of notifications in my app. I can send notifications and I see them in my phone well.
The problem is that even if I have no notifications, the badge shows I have 3 and I can not remove this notification when I read the notifications. What it is strange is that even if I send new notifications, the number 3 is still there...
For a period of time, we have frequently received reports of users receiving duplicate message notifications.
We can ensure that the message is only sent once and there is only one ApnsId, but when it reaches the device, there are multiple duplicate notifications (2-3)
I suspect this may be related to iOS 17, as there seems to be some overlap in time. Have others encountered similar problems? We sincerely hope to receive help from society. Thank you for your help~
I am checking the Push Notification Console of Cloudkit to understand my apps push delivery metrics. There are nice metrics in there to see push sends and discards. But I couldn't see any metric to understand "How many of the users opened the notiifications I send". Is there any way me to understand this statistic?
Also can we export this metrics without logging in to CloudKit like an API request?
In an iOS UNNotificationContentExtension with a media player, I have an AVPlayer which can either play a WAV or an MP4 remotely depending on the push payload userInfo dictionary.
I have implemented mediaPlayPauseButtonFrame, mediaPlayPauseButtonTintColor, and mediaPlayPauseButtonType, have overridden canBecomeFirstResponder to force true, and set the view to becomeFirstResponder when the AVPlayer is added.
I have implemented the UNNotificationContentExtension protocol's mediaPlay and mediaPause methods. I also have subscribed to the .AVPlayerItemDidPlayToEndTime (NS)Notification and I call a method on the VC when it returns, which calls mediaPause.
When the AVPlayer reaches the end, the .AVPlayerItemDidPlayToEndTime Notification is properly emitted, my method is called, and mediaPause is called. However, the media play/pause button provided by UNNotificationContentExtension remains visibly in the "playing" state instead of changing to the "pause" state. The button correctly changes its display state when the user presses the play/pause button manually, so it works.
And so, collective Obis Wan Kenobi, what am I doing wrong? I have tried resigning first responder, have no access to the button itself -- as far as I know -- and am wondering where to go next.
(This is the only thing not working by the way.)
Sanitized example:
import UIKit
import UserNotifications
import UserNotificationsUI
class NotificationViewController: UIViewController, UNNotificationContentExtension {
// Constants
private let viewModel = ...
private var mediaPlayer: AVPlayer?
private var mediaPlayerLayer: AVPlayerLayer?
private var mediaPlayerItem: AVPlayerItem? {
mediaPlayer?.currentItem
}
override var canBecomeFirstResponder: Bool {
true
}
// MARK: - UNNotificationContentExtension var overrides
var mediaPlayPauseButtonType: UNNotificationContentExtensionMediaPlayPauseButtonType {
return .default
}
var mediaPlayPauseButtonFrame: CGRect {
return CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50.0)
}
var mediaPlayPauseButtonTintColor: UIColor {
return .blue
}
...
func didReceive(_ notification: UNNotification) {
...
// Process userInfo for url
}
...
@MainActor
func playAudio(from: URL) async {
let mediaPlayer = AVPlayer(url: url)
let mediaPlayerLayer = AVPlayerLayer(player: audioPlayer)
...
// view setup
mediaPlayerLayer.frame = ...
self.mediaPlayer = mediaPlayer
self.mediaPlayerLayer = mediaPlayerLayer
self.view.layer.addSublayer(mediaPlayerLayer)
becomeFirstResponder()
}
// MARK: - UNNotificationContentExtension
func mediaPlay() {
mediaPlayer?.play()
}
func mediaPause() {
mediaPlayer?.pause()
}
// MARK: - Utilities
private func subscribe(to item: AVPlayerItem) {
NotificationCenter.default.addObserver(self, selector: #selector(playedToEnd),
name: .AVPlayerItemDidPlayToEndTime, object: item)
}
@objc
func playedToEnd(notification: NSNotification) {
mediaPause()
}
}
Hi,
I am still waiting to be enrolled to no avail, please assist.
It has been 3 days now.
Hi. I would like my App to be notified when the phone rings. No, not CallKit-CallKit is for VoIP and does not cover Cellular connections (as of 2/26/24) but, thanks. To continue..
I understand ages-ago there was a Telephony Kit or Framework but, has been discontinued. Has it been replaced with something else?
I would like something that seems very simple:a) when the phone rings my App is notified, b) when it stops ringing (combine all possibilities; sent to voicemail, user cancels, user answers) my App is notified.
Yes, I understand UserNotifications can make things run but, as I understand it this feature is for the App to schedule notifications, not receive them? If you know of something in UserNotifications that I can leverage I would appreciate your input.
Lacking other possibilities I find myself wondering about Siri integration. Siri is notified about system events and generates notifications based upon these events. Is there some way to place my App downstream from Siri and receive system notifications? Thanks everyone.
I have been having a problem in our application while handling the VoIP notifications.
sometimes the didReceiveIncomingPushWith delegate function is invoked when a VoIP Notif is sent but when the call is accepted nothing happened from the caller's side, like the callback to the caller to notify him that the call is accepted doesn't happe.
And sometimes the didReceiveIncomingPushWith is not even invoked when a VoIP notif is sent.
here is a potion of the code.
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
NSLog("pushRegistry didReceiveIncomingPushWith() type:(type)")
// Handle the push payload
if let pushHashtable = payload.dictionaryPayload["aps"] as? [AnyHashable: Any] {
if let pushMessage = pushHashtable["alert"] as? String {
NSLog("push message=\(pushMessage)")
}
}
if type == PKPushType.voIP {
// Process the received push: if it is a VoIP push, this must be an incoming call because we deactivated push for REGISTER refresh from Kamailio server
if SipService.instance?.currentCall != nil {
// A call is already going on, ignore this VoIP push
NSLog("pushRegistry - voip push, and we already have a currentCall: we already received the INVITE, or it is a voip push for another call -> let's ignore it")
completion()
return
}
// We want to send a REGISTER anyway to get the pending INVITE message.
// Then, the incoming call will be notified in the SIP stack onCallNew(_ call: Call!) callback
// Since iOS 13, it is mandatory to report an incoming call immediately after a Voip push
// instead of waiting for the SIP INVITE (in EngineDelegate.onCallNew())
// See details here: https://forums.developer.apple.com/message/376630#376630
NSLog("pushRegistry - >= iOS 13 -> showing callkit before SIP INVITE")
if let callerSipUri = payload.dictionaryPayload["caller-sip-uri"] as? String {
NSLog("push caller-sip-uri=\(String(describing: callerSipUri))")
SipUtils.findCallerName(fromSip: callerSipUri) { callerName in
let customCallerName = (callerName ?? "Inconnu") + (CallKitService.instance?.CALLKIT_DEBUG_MODE == true ? " [PUSH]" : "")
DispatchQueue.main.async {
CallKitService.instance?.reportNewIncomingCallToCallKit(callerName: customCallerName) {
completion()
}
}
}
} else {
// That should not happen: Kamailio server is supposed to add the caller SIP URI in the VoIP push
DispatchQueue.main.async {
CallKitService.instance?.reportNewIncomingCallToCallKit(callerName: nil) {
completion()
}
}
}
// No call is going on, so we want to take this call, so we want to send a REGISTER if needed
SipNetworkMonitoring.instance.start()
} else {
NSLog("pushRegistry - not a VoIP push")
completion()
}
}
here is the reportNewIncomingCallToCallKit function implementation
func reportNewIncomingCallToCallKit(callerName: String?, completion: @escaping () -> Void) {
NSLog("Callkit - reportNewIncomingCallToCallKit from %@", callerName ?? "Inconnu")
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: callerName ?? "Inconnu")
update.hasVideo = true
// we may already have reported a new call to CallKit
// (since iOS13, we must do it in the didReceiveIncomingPushWith() callback)
// In this case, the CallKit UI is already showing with caller="Inconnu": we will update it with the caller name.
if let currentUuid = currentUuid {
NSLog("Callkit - already a CallKit call showing -> updating the existing call ...")
self.cxProvider?.reportCall(with: currentUuid, updated: update)
} else {
NSLog("Callkit - now CallKit call showing -> new call ...")
let newUuid = UUID()
self.currentUuid = newUuid
self.cxProvider?.reportNewIncomingCall(with: newUuid, update: update) { error in
completion()
}
}
// dont configure audioSession here, wait for the Callkit "didActivate audioSession" callback
}
just to clarify : findCallerName is a function to get the called name from a list from the Backend with an escaping closure, (I tried to overpass that function and just give a default name to the caller but still same problem) .
ANY HELP PLEASE?
Hi All
I have some customer sound file named as .x-wav / .x-m4a, when specify sound file with extension .x-wav, like
content.sound = [UNNotificationSound criticalSoundNamed:@"mysound.x-wav" withAudioVolume: 1.0];
it will play defaultcrititicalsound.
if I tried
content.sound = [UNNotificationSound criticalSoundNamed:@"mysound.wav" withAudioVolume: 1.0];
then it worked
Hello,
I am developing a service using Voip Push.
Recently, it seems that Voip Push notifications are occasionally arriving late.
Does anyone have information regarding this issue?
Sometimes, when the delay is prolonged, notifications from a few days ago also seem to be received.
Thank you.
I'm tring to Send Notification using cURL Command for that i used curl commad
curl -v \
--cert "${CERTIFICATE_FILE_NAME}" \
--cert-type DER \
--key "${CERTIFICATE_KEY_FILE_NAME}" \
--key-type PEM \
--header "apns-topic: xobuya" \
--header "apns-push-type: alert" \
--header "apns-priority: 5" \
--header "apns-expiration: 0" \
--data '{"aps":{"alert":{"title":"title","subtitle":"subtitle","body":"body"}}}' \
--http2 https://api.push.apple.com:443/3/device/my-id
I have a also run this in order to get .pem
openssl x509 -inform DER -in aps.cer -out aps.pem
but i got error like this
` * Connected to api.push.apple.com (17.188.180.206) port 443
schannel: disabled automatic use of client certificate
schannel: certificate format compatibility error for aps.cer
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
Closing connection
curl: (58) schannel: certificate format compatibility error for aps.cer`
We have observed that the following command causes NotNow:
InstallProfileCommand(https://developer.apple.com/documentation/devicemanagement/installprofilecommand)
InstallProvisioningProfileCommand(https://developer.apple.com/documentation/devicemanagement/installprovisioningprofilecommand)
SecurityInfoCommand(https://developer.apple.com/documentation/devicemanagement/securityinfocommand)
CertificateListCommand(https://developer.apple.com/documentation/devicemanagement/certificatelistcommand)
InstallApplicationCommand(https://developer.apple.com/documentation/devicemanagement/installapplicationcommand)
ManagedMediaListCommand(https://developer.apple.com/documentation/devicemanagement/managedmedialistcommand)
1,2,3 becomes NotNow while the iOS device is locked.
I don't know under what circumstances 4, 5, 6 become NotNow.
Please tell me.
I have a question about APNs specifications.
We are aware that if we delete the app, we will disable the device token managed by APNs. we intend to send a push notification from AWS SNS to APNs and if the device token is disabled, AWS SNS will identify that the app has been deleted from our phone.
I believe the specification is that iOS uninstall data is only available after the 8th day.
However, it has been a month since the uninstallation and still the APNs are not returning the device token as invalid.
Why is the uninstall data not available?
If there is a way to do this waiting up, please let me know.
Issue of not being able to check Metrics indicators for some domains after applying Push through FCM
The push is received normally, but the metrics are displayed as 0, making it impossible to check any indicators. Someone knows any solution?
The metrics implemented in Braze using the same method are displayed normally, but the implementation through FCM is only shown as 0.
我正在开发一个即时通讯的App,遇到个问题,就是如何做到跟微信一样,iPhone上收到语音通话邀请通知时,配对的watch上持续响铃?
Hello,
I am approaching the recent PTT Framework as my desire is to create a Walkie Talkie app. I watched the video and followed the documentation. I haven't managed to get it working yet, as there are some steps that aren't 100% clear to me.
But the biggest doubt right now is: if I manage to create a walkie talkie App that works with PTT Framework on SwiftUI, will I be able to integrate this functionality in some way with the Android version of the same App? I don't know if it's worth mentioning but my backend right now is Firebase.
We are interested to know what is the rate limit on the push notifications for live activities. We understand there is a "budget" on the amount of push notifications on a users device. But is there some rate limitation we should be aware of on APNs?