Hello,
I'm working on implementing Live Caller ID Lookup, but I noticed that https://github.com/apple/live-caller-id-lookup-example redirects to https://github.com/apple/pir-service-example.
Could you please clarify why this redirection occurs?
General
RSS for tagDelve into the world of built-in app and system services available to developers. Discuss leveraging these services to enhance your app's functionality and user experience.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
When fetching Apple Savings transactions via FinanceKit, the data is missing key context about where the deposit originated from.
Here’s an example transaction I retrieved:
Transaction(
id: 77371A0C-7122-42C7-BEBC-85BDF654AD2B,
accountID: 68D9FE9D-6DA6-4A27-BB9D-19209CD29A56,
transactionAmount: 1.46 USD,
creditDebitIndicator: .credit,
transactionDescription: "Deposit",
originalTransactionDescription: "",
merchantCategoryCode: nil,
merchantName: nil,
transactionType: .deposit,
status: .booked,
transactionDate: 2025-08-20 13:44:26 +0000,
postedDate: 2025-08-20 13:44:26 +0000
)
As shown:
transactionDescription is just "Deposit"
merchantName is nil
No indication of the source account
In contrast, the Wallet app clearly shows context for Apple Savings account deposits, such as:
"Apple Card" (daily cash)
"Bank of America" (external transfer)
"Interest Paid" (we do see "Interest" come through correctly)
Without this metadata, third-party apps cannot replicate Wallet’s clarity about where a deposit came from. Every deposit simply appears as "Deposit", which is ambiguous.
Request:
Please expose additional metadata for Apple Savings account transactions, for example:
sourceAccountName (e.g. “Apple Card” or “Bank of America”)
transactionOriginType (cashback, external bank transfer, interest)
institutionIdentifier or similar for external banks
This would allow developers to show clear, Wallet-quality transaction details and avoid confusing users.
Impact:
The lack of source info makes Savings deposits nearly indistinguishable from one another, even though Wallet provides this context. For apps leveraging FinanceKit, this results in a poorer experience compared to Apple’s own Wallet.
Thanks!
Topic:
App & System Services
SubTopic:
General
Hi All,
I have created a Push Notification certificate from my Apple Developer account. After downloading the aps.cer file and adding it to my Keychain, the certificate was added successfully, but the private key is missing.
Has anyone encountered a similar issue in the past? What could be causing this problem?
is there documentation where we can find details for historical parameters / limitations - so far i've found that the days limit on single API calls days limit is 7. Any other similar specs would be good to have
The example database/server provided by Apple for Live Caller ID contains a hardcoded database with a tiny number of pre-defined numbers.
However, its not expected to be representational of an live real world usage server.
But the question is how can that be accomplished if its a requirement that the data be KPIR encrypted?
In real world scenarios, the factors that effect whether a number should be blocked or not are continually changing and evolving on a minute-by-minute basis and new information becomes available or existing information changes.
If the database supports tens of millions or hundreds of millions of constantly changing phone numbers, in order to meet the requirements of the Live Caller ID being KPIR encrypted, that would imply the database has to re-encrypt its database of millions endlessly for all time.
That seems unfeasable and impractical to implement.
Therefore how do the Apple designers of this feature envisage/suggest a real-world server supporting millions of changing data should meet the requirement to be KPIR encrypted?
Is there any way to use the screen time API on Mac?
We developing an app, It's a Parental control app required to block large number of apps. In child mobile installed more than 200 apps parent has to block and disable these apps but parent cant able to block more than 50 apps. Is there any option is there to block all the 200 apps from child mobile.
Hi,
I'm using ScreenCaptureKit on macOS 14+ to record a single window. I've noticed that the Presenter Overlay only appears when capturing the entire screen, but it does not appear when recording a specific window or a region.
Is there a way to enable the Presenter Overlay while recording a single window or a defined region, similar to how it works with full-screen capture?
Any guidance or clarification would be greatly appreciated.
Thanks in advance!
I am working on a SwiftUI app using the Screen Time API and the DeviceActivityReport view to display app usage data. My current implementation successfully shows daily app usage using a DeviceActivityFilter with the .daily(during:) segment. However, I need to filter this data to show app usage only for a specific time period during the day, e.g., 4:00 PM to 5:00 PM.
I created a DeviceActivityFilter with a .daily(during:) segment and passed a DateInterval for the desired time range:
let now = Date()
let startTime = calendar.date(bySettingHour: 16, minute: 0, second: 0, of: now)!
let endTime = calendar.date(bySettingHour: 17, minute: 0, second: 0, of: now)!
let timeInterval = DateInterval(start: startTime, end: endTime)
let filter = DeviceActivityFilter(
segment: .daily(during: timeInterval),
users: .all,
devices: .init([.iPhone])
)
I applied this filter to the DeviceActivityReport view:
DeviceActivityReport(context, filter: filter)
Even with the DateInterval set for the specific time range, the report still shows the total daily usage for each app, instead of restricting the results to the specified 1:00 PM to 5:00 PM range.
After a user has launched an App Clip Experience from Safari and is done with the activity that the App Clip provides – is there a way for the App Clip to programatically close itself so the user returns to Safari?
Subject/Title:
Critical SKAdNetwork Attribution Failures (Bug Type: 237, Failure Type: 1201 in ASDErrorDomain)
Issue Summary
We are encountering repeated SKAdNetwork attribution failures (failureType: 1201 in ASDErrorDomain) for ad impression events processed through the ad network mj797d8u6f.skadnetwork. These failures are causing significant revenue losses, as ad impressions are not being properly attributed to installs.
The issue occurs across multiple campaigns and involves both SKAdNetwork API 3.0 and 4.0, suggesting a systemic problem with attribution validation or network communication.
This problem is critical as it disrupts advertisers’ ability to track conversions, optimize campaigns, and allocate budgets effectively.
Technical Details
Key Logs:
Below are anonymized samples of the failed SKAdNetwork events:
Log Sample 1 (Failure):
{
"bug_type": "237",
"timestamp": "2025-01-07 22:49:15.00 -0500",
"os_version": "iPhone OS 18.2.1 (22C161)",
"roots_installed": 0,
"incident_id": "78523BD9-1F58-4738-B526-8A8A63203214"
}
{
"advertisementStoryId": "3D2E7EBB-1A57-4DF8-9375-2C465F423038",
"apiVersion": "3.0",
"eventType": "adImpression",
"resultType": "finalized",
"anonymous": true,
"failureType": 1201,
"failureDomain": "ASDErrorDomain",
"clientEventId": "0F456623-584F-4913-BBD3-C3FD1219D104",
"os": "iOS",
"topic": "xp_amp_skad_perf",
"adType": "app",
"adNetworkId": "mj797d8u6f.skadnetwork",
"eventTime": 1736305200000,
"osBuildNumber": "22C161",
"hardwareFamily": "iPhone",
"api": "SKAdNetwork"
}
Log Sample 2 (Failure):
{
"bug_type": "237",
"timestamp": "2025-01-07 22:49:15.00 -0500",
"os_version": "iPhone OS 18.2.1 (22C161)",
"roots_installed": 0,
"incident_id": "0CBF612D-F0D9-449E-A34E-DE2DB92BEC0D"
}
{
"advertisementStoryId": "946E568C-D2C1-478F-BFF3-4996C48F9B39",
"apiVersion": "3.0",
"eventType": "adImpression",
"resultType": "finalized",
"anonymous": true,
"failureType": 1201,
"failureDomain": "ASDErrorDomain",
"clientEventId": "1A3D48FB-4452-4FD8-BB25-1195470A53DC",
"os": "iOS",
"topic": "xp_amp_skad_perf",
"adType": "app",
"adNetworkId": "mj797d8u6f.skadnetwork",
"eventTime": 1736298000000,
"osBuildNumber": "22C161",
"hardwareFamily": "iPhone",
"api": "SKAdNetwork"
}
Log Sample 3 (Success Example for Comparison):
{
"bug_type": "237",
"timestamp": "2025-01-07 22:49:15.00 -0500",
"os_version": "iPhone OS 18.2.1 (22C161)",
"roots_installed": 0,
"incident_id": "BFEAC86B-8195-4DB0-96FF-2028107256AD"
}
{
"advertisementStoryId": "946E568C-D2C1-478F-BFF3-4996C48F9B39",
"apiVersion": "3.0",
"eventType": "adImpression",
"resultType": "finalized",
"anonymous": true,
"clientEventId": "F6265488-E0FB-448A-A406-3F7254BCA9D7",
"os": "iOS",
"topic": "xp_amp_skad_perf",
"adType": "app",
"adNetworkId": "mj797d8u6f.skadnetwork",
"eventTime": 1736294400000,
"osBuildNumber": "22C161",
"hardwareFamily": "iPhone",
"api": "SKAdNetwork"
}
Failure Details:
Failure Type: 1201
Failure Domain: ASDErrorDomain
Ad Network ID: mj797d8u6f.skadnetwork
API Versions Affected: 3.0, 4.0
Timeframe of Failures: All logs occur within 2025-01-07 22:00:00 UTC to 23:00:00 UTC.
Environment:
OS Version: iOS 18.2.1 (Build 22C161).
Device Type: iPhone (hardwareFamily: iPhone).
App Configuration: Includes the ad network ID in the Info.plist under SKAdNetworkItems.
Impact Details
Financial Loss:
Based on failure rates, we estimate $20–$65/day per advertiser for small campaigns and $75–$375/day per advertiser for larger campaigns.
If 100 advertisers are affected, daily losses range from $2,000–$37,500.
Over a week, losses could exceed $70,000 to $262,500 or more.
Operational Impact:
Advertisers cannot track installs or optimize campaigns, leading to inefficient ad spending and potential budget reallocation to other networks.
Damaged trust between advertisers and the ad network.
Reputation Risk:
Continued failures harm the credibility of the SKAdNetwork framework, critical in a post-ATT (App Tracking Transparency) ecosystem.
Steps to Reproduce
Serve an ad impression through the ad network mj797d8u6f.skadnetwork.
Monitor SKAdNetwork attribution for that impression.
Observe repeated failures (failureType: 1201) despite the resultType: finalized status.
Recommendations for Investigation
Attribution Timeout:
Verify if these failures stem from delayed responses or missed attribution windows.
Ad Network Configuration:
Confirm the ad network’s integration complies with SKAdNetwork API 3.0 and 4.0 requirements.
Infrastructure Review:
Investigate potential bottlenecks or failures in Apple’s attribution servers (ASDErrorDomain) or communication delays.
Contact Details
Name: [Your Full Name]
Role: [Your Role] (e.g., Ad Network Analyst/Developer)
Organization: [Your Company Name]
Email: [Your Email Address]
Phone: [Your Phone Number]
Submission Instructions
You can submit this report via the following channels:
Apple Feedback Assistant: https://feedbackassistant.apple.com/
Bug Reporting Tool: https://developer.apple.com/bug-reporting/
Apple DTS: https://developer.apple.com/support/technical/
Topic:
App & System Services
SubTopic:
General
Hi All, I would like to develop a small macOS app using swift. I want to use ImageCaptureCore to access and control connected scanners ( via usb). I followed the official docs and wrote this ScannerManager. The code seems to be working without issues or warnings.
I added the Hardened Runtime capability and both com.apple.security.personal-information.photos-library and com.apple.security.device.usb to the .entitlements file.
As well added NSCameraUsageDescription to the Info.plist.
Problem:
None of my scanners do get detected (tested 2 different models). Of course, they are connected and do get recognized by the Image Capture App (and work as expected) and are listed in the systems app, too.
When I connect my phone it does get detected by the
func deviceBrowser(_ browser: ICDeviceBrowser, didAdd...
delegate function. Thats why I believe my code is working but the app is lacking permissions to detect scanners somehow. Does anyone know something about this?
I am using macOS 15.1.1 (24B91) on a M1 Pro.
Many thanks in advance!
class ScannerManager: NSObject, ICDeviceBrowserDelegate, ICDeviceDelegate {
let deviceBrowser: ICDeviceBrowser
private var currentDevice: ICDevice?
private var scannerDeviceDelegate: ScannerDeviceDelegate?
var isScanning = false
var scanners: [ICDevice] = []
// MARK: - Initialization
override init() {
print("🚀 Initializing ScannerManager...")
self.deviceBrowser = ICDeviceBrowser()
super.init()
self.deviceBrowser.delegate = self
// Log the initial browsed device type mask
self.deviceBrowser.browsedDeviceTypeMask = .scanner
print("🔍 Starting device browser...")
self.deviceBrowser.start()
// Enhanced device logging
if let devices = deviceBrowser.devices {
print("\n📱 Connected devices overview:")
print("Total devices found: \(devices.count)")
if devices.isEmpty {
print("⚠️ No devices currently connected")
} else {
devices.forEach { device in
print("\n📌 Device Details:")
print(" - Name: \(device.name ?? "unnamed")")
print(" - Type: \(String(describing: device.type))")
print(" - Transport Type: \(String(describing: device.transportType))")
print(" - Status: \(device.hasOpenSession ? "In Use" : "Available")")
print(" - Persistent ID: \(String(describing: device.persistentIDString))")
print(" - Location: \(device.locationDescription ?? "Unknown")")
print(" - Capabilities: \(String(describing: device.capabilities))")
}
}
} else {
print("⚠️ Unable to access device list")
}
}
...
Topic:
App & System Services
SubTopic:
General
We developed a "Default Translation App" following the guide: https://developer.apple.com/documentation/translationuiprovider/preparing-your-app-to-be-the-default-translation-app.
I have already configured everything that needs to be configured according to the document, but there is still this problem
Topic:
App & System Services
SubTopic:
General
I'm sitting at my house and trying to sign my test device out of my apple ID so I can sign into a Sandbox user, but now I have an hour to kill because of this terribly broken "security" feature that thinks it's in an unfamiliar location, despite being at the only location it's ever known. Looks like I'll just be disabling this feature all together.
Especially as a device with Developer Mode enabled, which gets reset regularly, there should be additional options here. Come on!
Hi everyone,
I’m developing a screen-time and focus app that uses Apple’s Family Controls framework to block distracting apps and reward users through a gamified experience.
Apple approved Family Controls (Distribution) for the main app identifier,
but they did not approve the required extension target (which implements DeviceActivityMonitor, required for the framework to function).
Because of this, I can’t archive or upload the app to TestFlight — and I’ve been stuck in limbo for over 2 months.
This is severely delaying my launch. The app works perfectly, but I can’t release it because the extension wasn’t included in the entitlement approval.
Has anyone else run into this with Family Controls?
Is there any known way to escalate or fast-track approval for additional app IDs or targets?
Would really appreciate any help, advice, or hacks. 🙏
Thanks,
Enzer
What I want to achieve now is that when the app is not running, upon receiving a notification, it displays an interface similar to CallKit with accept and decline buttons.
Here is part of my code:
@available(iOS 17.4, *)
class LiveCommunicationManager: NSObject, ConversationManagerDelegate {
static let shared = LiveCommunicationManager()
var isInvalidate:Bool = false
var configuration: ConversationManager!
override init() {
let config = ConversationManager.Configuration(
ringtoneName: "notes_of_the_optimistic",
iconTemplateImageData: UIImage(named: "AppIcon")?.pngData(), // 图标的 PNG 数据
maximumConversationGroups: 1, // 最大对话组数
maximumConversationsPerConversationGroup: 1, // 每个对话组内最大对话数
includesConversationInRecents: false, // 是否在通话记录中显示
supportsVideo: false, // 是否支持视频
supportedHandleTypes: [.generic,.phoneNumber,.emailAddress] // 支持的通话类型
)
configuration = ConversationManager.init(configuration: config)
}
func reportIncomingCall(uuid: UUID, callerName: String) {
configuration.delegate = self
let local = Handle(type: .generic, value: callerName, displayName: callerName)
let update = Conversation.Update(localMember: local,members: [local],activeRemoteMembers: [local])
Task{
do {
try await configuration.reportNewIncomingConversation(uuid: uuid, update: update)
print("成功报告新来电")
} catch {
print("报告新来电失败: \(error.localizedDescription)")
}
}
}
func conversationManager(_ manager: ConversationManager, conversationChanged conversation: Conversation) {
print("会话状态改变了")
}
func conversationManagerDidBegin(_ manager: ConversationManager) {
print("会话已经开始了")
manager.delegate = self
}
func conversationManagerDidReset(_ manager: ConversationManager) {
print("会话将要清除了")
}
func conversationManager(_ manager: ConversationManager, perform action: ConversationAction) {
print("会话接听了")
configuration.invalidate()
}
func conversationManager(_ manager: ConversationManager, timedOutPerforming action: ConversationAction) {
print("会话超时了")
}
func conversationManager(_ manager: ConversationManager, didActivate audioSession: AVAudioSession) {
print("会话激活了")
}
func conversationManager(_ manager: ConversationManager, didDeactivate audioSession: AVAudioSession) {
print("会话死亡了")
}
}
在Appdelegate里设置了这些:
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// 在这里处理离线推送通知
completionHandler(.noData) // 返回后台任务完成
if let aps = userInfo["aps"] as? [String: Any],
let alert = aps["alert"] as? [String : Any]{
// 静默推送的处理逻辑
if #available(iOS 17.4, *) {
let manager = LiveCommunicationManager.shared
if manager.isInvalidate { return }
if let msgType = userInfo["msgType"] as? Int{
if msgType == 5{
manager.configuration.invalidate()
}else{
let callerName = alert["title"] as? String ?? "Fanvil"
manager.reportIncomingCall(uuid: UUID(), callerName: callerName)
}
}
}
}
}
Xcode has been configured with the necessary capabilities, such as Background Fetch, Voice over IP, Background Processing, and Push Notification.
The issue now is that sometimes the code works as expected, allowing the app to wake up when not running and displaying the system interface with accept and decline buttons. However, after a few successful attempts, the app stops waking up, and no notification appears. But when I manually open the app, the didReceiveRemoteNotification method gets triggered.
I’d like to know why this stops working after a few times.
Hey everyone,
I have an app using the screen time api, I've had quite a few reports from users saying that our monitoring features stop working until they open our app. What happens is that activities and schedules set with the device activity monitor seem to disappear. This is something we check on app re-opens and so we schedule them again and that is why the monitoring starts working again.
Of course our current solution is not optimal since our app is mainly passive. Has anyone experienced these kinds of issue ?
Hi everyone,
I have a simple question regarding App Intents. I have an intent that defines a few parameters, one of which is a Date. When the user is prompted for input, I’d like the date picker to start at a specific value (e.g., tomorrow) instead of the default current date.
Is there a way to set an initial/default value for the date parameter in an App Intent?
Thanks in advance for any guidance!
Hi,
I'm working on a game for the past few years using first Unreal Engine 4, and now Unreal Engine 5.4.4.
I'm experiencingan unusual crash on startup on some devices
. The crash is so fast that I'm barely able to see the launching screen sometimes because the app closes itself before that.
I got a EXC_CRASH (SIGABRT) so I know that it's a null pointer reference, but I can't quite wrap my head about the cause, I think that's something messed up in the packaging of the app, but here is where I'm blocked, I'm not that accustomed with apple devices.
If someone has some advise to give, please, any help will be very valuable. Many thanks.
Log :
Crash Log on Ipad
I’m trying to fully understand the purpose of the ageGates parameter in the AgeRangeService.requestAgeRange API.
The official documentation includes the following statement:
“The system may return geo-specific age ranges that override your provided age gates based on the person’s location and applicable regulations.
When geo-specific ranges are required, the returned age range reflects regulatory requirements rather than the bounds of your age gates.”
Based on this, it seems that even if my app provides specific age thresholds through the ageGates parameter,
the system may override those boundaries depending on regional laws or regulations, and return a completely different lowerBound / upperBound than what my age gates would suggest.
My current understanding is:
ageGates indicates the thresholds my app uses to define its internal feature tiers,
but the actual age range returned by the OS is determined by legal or regional requirements (e.g., COPPA, GDPR-K, AADC, SB2420),
meaning the returned age range may not align with the age ranges implied by my ageGates values.
I’d like to confirm whether this interpretation is correct.
Additionally, if different regions may produce different lowerBound / upperBound values due to regulatory requirements,
then it seems that:
developers shouldn’t rely on fixed age buckets, and
instead must implement feature gating logic dynamically based on whatever age range the OS returns.
So my questions are:
Is my understanding correct that ageGates is simply a hint that describes my app’s tier thresholds, and the OS may override those boundaries to comply with local regulations?
If lowerBound / upperBound can vary across regions, what is the recommended way for developers to design their feature-gating logic?
Should we avoid hardcoded age buckets and instead build flexible logic that adapts to whatever range the OS returns?
I’d appreciate clarification so I can design our age-based policies appropriately and in a regulation-compliant way.