We have encountered an issue with the app where it fails to progress beyond the splash screen. Interestingly, the problem seems to resolve itself after either reinstalling the app or restarting the phone. This behavior is observed specifically in version 18.3.1.
Could this issue be related to a network connection or initialization problem in this version? Any insights or recommendations would be appreciated.
Thank you for your assistance!
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
Hi,
I'm implementing a Message Filter Extension and need clarification about the ILMessageFilterExtensionNetworkURL Info.plist key.
Is it valid to include query parameters in the URL like:
https://example.com/test?id=123
I want to make sure this approach will pass App Review before implementing it. The query parameter would be used to identify the client making the filtering request.
Has anyone successfully used URLs with query parameters in their approved Message Filter Extensions? Any insights would be appreciated.
Thanks!
Hello! What is the TTL for evaluation key(s) used in Live Caller ID feature on iOS client side? We would like to align our server-side key storage TTL with the iOS client implementation to optimize memory usage.
Would really appreciate your help on this.
Hi everyone,
I’ve been stuck on an issue with iOS Universal Links for about a week and could really use some help.
The problem
When tapping a Universal Link on iOS, my Flutter app opens correctly (desired behavior) — but immediately afterward, Safari opens the same link in the browser. So both the app and the browser open.
This only happens on iOS. On Android everything works as expected.
What works
If the link is simply the domain, like:
https://mydomain.com
…then the app opens without triggering the browser afterward. This is the correct behavior.
What doesn’t work
If the link includes a path or parameters, like:
https://mydomain.com/path
https://mydomain.com/path?param=value
…then the app opens, and then the browser opens immediately after.
What I’ve tried
Verified my AASA file using Branch’s validator:
https://branch.io/resources/aasa-validator/
→ The AASA file is valid.
Universal Links do open the correct screen inside the app — the issue is the unwanted second step (Safari opening).
Behavior is consistent across different iOS devices.
Extra details
Using Flutter.
Universal Links set up with the standard configuration (associatedDomains, AASA hosted at /.well-known/apple-app-site-association, etc.).
Question
Has anyone encountered this issue where Universal Links with paths/params open the app and then open Safari?
What could cause iOS to trigger the browser fallback even when the AASA file is valid and the app handles the link correctly?
Any insights, debugging tips, or known edge cases would be incredibly appreciated!
A message filter extension is only forwarded SMSs by the OS for filtering, iMessages aren't.
But what is the situation with RCS messages? Will they be filterable by a message filtering extension?
In Core Spotlight, one can only index content by using title or displayName, and it requires four consecutive characters for indexing. These situations occurred in iOS 17 and 18. In iOS 16, I could not only index content by title or displayName, but also by keyword. Moreover, there was no restriction of requiring four consecutive characters. I could index my app content by simply inputting one character.
Here is my code.https://github.com/kritto1/corespotlight-bug-test/tree/main
@available(iOS 14, *)
func addItemToIndex(_ item: QSpotlightItem) {
let attributeSet = CSSearchableItemAttributeSet(contentType: .item)
attributeSet.title = item.title
attributeSet.displayName = item.title
attributeSet.contentDescription = item.contentDescription
attributeSet.keywords = item.keywords
attributeSet.thumbnailData = item.thumbnailImage
attributeSet.contactKeywords = item.keywords
attributeSet.supportsNavigation = true
let searchableItem = CSSearchableItem(uniqueIdentifier: item.id, domainIdentifier: "com.qunar.iphone.spotlight", attributeSet: attributeSet)
searchableItem.expirationDate = .distantFuture
CSSearchableIndex.default().indexSearchableItems([searchableItem]) { error in
if let error = error {
} else {
}
}
}
@available(iOS 14, *)
func addToSpotlightIndex() {
let spotlightHotel = QSpotlightItem(
id: "corespotlight_1",
title: "查询酒店住宿",
contentDescription: "",
thumbnailImage: UIImage(named: "img2")?.pngData(),
keywords: ["酒店", "住宿"]
)
addItemToIndex(spotlightHotel)
let spotlightFlight = QSpotlightItem(
id: "corespotlight_2",
title: "查询和预订机票",
contentDescription: "",
thumbnailImage: UIImage(named: "img2")?.pngData(),
keywords: ["查询", "预订", "机票"]
)
addItemToIndex(spotlightFlight)
let spotlightSight = QSpotlightItem(
id: "corespotlight_3",
title: "查询预订门票",
contentDescription: "",
thumbnailImage: UIImage(named: "img2")?.pngData(),
keywords: ["查询", "预订", "门票"]
)
addItemToIndex(spotlightSight)
}
IMPORTANT Rather than use the code below, I recommend that you adopt Swift’s shiny-new Subprocess package. That’s what I’m doing! (-:
Running a child process using Process (or NSTask in Objective-C) is easy, but piping data to and from the child’s stdin and stdout is surprisingly tricky. I regularly see folks confused by this. Moreover, it’s easy to come up with a solution that works most of the time, but suffers from weird problems that only show up in the field [1].
I recently had a couple of DTS incidents from folks struggling with this, so I sat down and worked through the details. Pasted below is the results of that effort, namely, a single function that will start a child process, pass it some data on stdin, read the data from the child’s stdout, and call a completion handler when everything is done.
There are some things to note here, some obvious, some not so much:
I’ve included Swift and Objective-C versions of the code. Both versions work the same way. The Swift version has all the comments. If you decide to base your code on the Objective-C version, copy the comments from there.
I didn’t bother collecting stderr. That’s not necessary in many cases and, if you need it, it’s not hard to extend the code to handle that case.
I use Dispatch I/O rather than FileHandle to manage the I/O channels. Dispatch I/O is well suited to this task. In contrast, FileHandle has numerous problems working with pipes. For the details, see Whither FileHandle?.
This single function is way longer than I’d normally tolerate. This is partly due to the extensive comments and party due to my desire to maintain focus. When wrapping Process it’s very easy to run afoul of architecture astronaut-ism. Indeed, I have a much more full-featured Process wrapper sitting on my hard disk, but that’s going to stay there in favour of this approach (-:
Handling a child process correctly involves some gnarly race conditions. The code has extensive comments explaining how I deal with those.
If you have any questions or comments about this, put them in a new thread. Make sure to tag that thread with Foundation and Inter-process communication so that I see it.
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"
[1] Indeed, this post shows that I’ve made this sort of mistake myself )-:
I use WeatherKit with Swift to get multiple cities weather by longitude and latitude.
But I use this API in WeatherService for daily forecast:
final public func weather<T>(for location: CLLocation, including dataSet: WeatherQuery<T>) async throws -> T
And I found there is something wired: The date of WeatherKit::DayWeather is based on my device's timezone settings.
Tokyo's Day Weather is start at UTC+8, New York' Day Weather is start UTC+8.
Is there any way to set timezone correctly?
I created a new project, packaged it with my own enterprise certificate, installed and used it. There were no problems on most devices. However, on some devices with system versions of 18.3 and 18.4, the app crashes when opened after trusting the certificate. It seems that there is something wrong with the certificate, but I have confirmed that the certificate is fine. May I ask what the cause of this issue is?
Topic:
App & System Services
SubTopic:
General
I have an iOS app with ExtensionFoundation. It runs well on my local device, but when I upload on the AppStore it gets rejected with:
Validation failed
Invalid Info.plist value. The value of the EXExtensionPointIdentifier key, AsheKube.app.a-Shell.localWebServer, in the Info.plist of “a-Shell.app/Extensions/localWebServer.appex” is invalid. Please refer to the App Extension Programming Guide at https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Action.html#/apple_ref/doc/uid/TP40014214-CH13-SW1. (ID: ae8dd1dd-8caf-4a48-9651-7a225faed4eb)
The Info.plist in my Extension is:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EXAppExtensionAttributes</key>
<dict>
<key>EXExtensionPointIdentifier</key>
<string>com.example.example-extension</string>
</dict>
</dict>
</plist>
so the Info.plist that causes the issue has been automatically generated by Xcode. I can access it as well, and it says:
{
"BuildMachineOSBuild" => "25A354"
"CFBundleDevelopmentRegion" => "en"
"CFBundleDisplayName" => "localWebServerExtension"
"CFBundleExecutable" => "localWebServer"
"CFBundleIdentifier" => "AsheKube.app.a-Shell.localWebServerExtension"
"CFBundleInfoDictionaryVersion" => "6.0"
"CFBundleName" => "localWebServer"
"CFBundlePackageType" => "XPC!"
"CFBundleShortVersionString" => "1.0"
"CFBundleSupportedPlatforms" => [
0 => "iPhoneOS"
]
"CFBundleVersion" => "1"
"DTCompiler" => "com.apple.compilers.llvm.clang.1_0"
"DTPlatformBuild" => "23A339"
"DTPlatformName" => "iphoneos"
"DTPlatformVersion" => "26.0"
"DTSDKBuild" => "23A339"
"DTSDKName" => "iphoneos26.0"
"DTXcode" => "2601"
"DTXcodeBuild" => "17A400"
"EXAppExtensionAttributes" => {
"EXExtensionPointIdentifier" => "AsheKube.app.a-Shell.localWebServer"
}
"MinimumOSVersion" => "26.0"
"NSHumanReadableCopyright" => "Copyright © 2025 AsheKube. All rights reserved."
"UIDeviceFamily" => [
0 => 1
1 => 2
]
"UIRequiredDeviceCapabilities" => [
0 => "arm64"
]
}
What should I do to be able to upload on the AppStore?
I have made a screensaver for mac in swift, but couldn't find how to add an icon the logo image that shows up on saver file) and thumbnail (the cover image that shows up in the screensaver catalogue).
Currently, it just shows a default blue spiral galaxy thumbnail and no icon image
In the summary documentation about the declared Age Range API:https://developer.apple.com/news/?id=2ezb6jhj
It states: "The API will also return a signal from the user’s device about the method of age assurance, such as credit card or government ID"
But if the api itself, and its documentation is examined, there is no such mechanism nor mention of it: https://developer.apple.com/documentation/declaredagerange/agerangeservice
So my question is, is the first documentation incorrect, if not, then where and how to access the method of age assurance?
Certainly! Here's a concise version of your forum post:
Title: Issues Handling Multiple Incoming Calls in CallKit
Body:
Hello,
I'm using CallKit and I am encountering challenges with handling multiple incoming calls.
Current Configuration:
configuration.maximumCallsPerCallGroup = 5
configuration.maximumCallGroups = 3
This setup aims to allow up to 5 calls per group.
Observed Behavior:
Despite the configuration, the system UI seems to limit the number of calls per group, often defaulting to "End & Accept" instead of "Hold & Accept" when a third call comes in.
Questions:
Is there a documented system-imposed limit on the number of calls per group or total calls, even if maximumCallGroups and maximumCallsPerCallGroup are set higher?
How does the system UI behave when these limits are exceeded? Are there known UI constraints or fallback behaviors?
Are there best practices for handling scenarios where the system UI cannot display all calls, such as gracefully managing incoming calls or providing alternative UI solutions?
Any insights or experiences with similar configurations would be greatly appreciated.
Thank you.
Feel free to copy and paste this directly into the Apple Developer Forums. If you need further assistance or adjustments, let me know!
Since iOS 18.4 and macOS 15.4 updating the calendar of an (ek)event (to another accounts calendar) or detaching an repeating event throws an error while saving: "Access denied"
EKEventStore.save(event, span: .thisEvent, commit: true)
catch { "Access denied" }
Bellow I created Manager to be easier for me to handle app limits, but for some reason It never reached callbacks function, I have permission for screen time, I added the capabilities for it also, I'm sure, I send correctly the appTokens, categoriesTokens ... and the time limit and it also reach ✅ Monitoring started for..., I don't know what to do anymore:
import SwiftUI
import DeviceActivity
import FamilyControls
import ManagedSettings
@MainActor
class AppUsageManager: DeviceActivityMonitor, ObservableObject {
static let shared = AppUsageManager()
private let deviceActivityCenter = DeviceActivityCenter()
private var monitoringSelections: [DeviceActivityName: (selection: FamilyActivitySelection, timeLimit: DateComponents)] = [:]
private var resetTimer: Timer?
private override init() {
super.init()
print("🟢 AppUsageManager initialized.")
}
// MARK: - Public Methods
/// Configures monitoring for a selection with a specific event name and time limit.
func configureMonitoring(
for selection: FamilyActivitySelection,
timeLimitInMinutes: Int,
activityName: String,
eventName: String
) {
let activityName = DeviceActivityName(activityName)
let eventName = DeviceActivityEvent.Name(eventName)
monitoringSelections[activityName] = (selection, DateComponents(minute: timeLimitInMinutes))
setupMonitoring(for: activityName, with: eventName)
}
/// Stops monitoring for a specific event.
func stopMonitoring(for activityName: String) {
let activityName = DeviceActivityName(activityName)
Task {
print("🛑 Stopping monitoring for \(activityName.rawValue).")
deviceActivityCenter.stopMonitoring([activityName])
monitoringSelections.removeValue(forKey: activityName)
}
}
/// Stops all monitoring.
func stopAllMonitoring() {
print("🛑 Stopping monitoring")
deviceActivityCenter.stopMonitoring()
}
// MARK: - Private Methods
/// Sets up monitoring for a specific event.
private func setupMonitoring(
for activityName: DeviceActivityName,
with eventName: DeviceActivityEvent.Name
) {
stopAllMonitoring()
guard let (selection, timeLimit) = monitoringSelections[activityName] else {
print("⚠️ No selection configured for \(activityName.rawValue).")
return
}
print("🛠 Setting up monitoring for \(activityName.rawValue).")
print("📋 Monitoring Details:")
print("- Time Limit: \(timeLimit.minute ?? 0) minutes.")
let warningThreshold = DateComponents(minute: 3)
let timeZone = TimeZone.current
let schedule = DeviceActivitySchedule(
intervalStart: DateComponents(timeZone: timeZone, hour: 0, minute: 0, second: 0),
intervalEnd: DateComponents(timeZone: timeZone, hour: 23, minute: 59, second: 59),
repeats: true,
warningTime: warningThreshold
)
let events: [DeviceActivityEvent.Name: DeviceActivityEvent] = [
eventName: DeviceActivityEvent(
applications: selection.applicationTokens,
categories: selection.categoryTokens,
webDomains: selection.webDomainTokens,
threshold: timeLimit
)
]
do {
try deviceActivityCenter.startMonitoring(
activityName,
during: schedule,
events: events
)
print("✅ Monitoring started for \(activityName.rawValue) with time limit \(timeLimit.minute ?? 0) minutes.")
} catch {
print("❌ Failed to start monitoring \(activityName.rawValue): \(error.localizedDescription)")
}
}
// MARK: - DeviceActivityMonitor Overrides
override func intervalDidStart(for activity: DeviceActivityName) {
print("🟢 Interval for \(activity.rawValue) started.")
}
override func intervalWillStartWarning(for activity: DeviceActivityName) {
print("⚠️ Warning: \(activity.rawValue) is about to start.")
}
/// Handles warnings for approaching the time limit.
override func eventWillReachThresholdWarning(
_ event: DeviceActivityEvent.Name,
activity: DeviceActivityName
) {
super.eventWillReachThresholdWarning(event, activity: activity)
print("⚠️ Warning: \(activity.rawValue) is about to reach its time limit.")
print("⚠️ Event: \(event.rawValue)")
}
/// Handles when the time limit is reached.
override func eventDidReachThreshold(
_ event: DeviceActivityEvent.Name,
activity: DeviceActivityName
) {
super.eventDidReachThreshold(event, activity: activity)
print("🟢 Limit reached.")
Task { @MainActor in
print("🕒 \(activity.rawValue) has reached its time limit.")
print("🕒 Event: \(event.rawValue)")
guard let (selection, _) = monitoringSelections[activity] else {
print("⚠️ No selection configured for \(activity.rawValue).")
return
}
blockApps(for: selection)
}
}
// MARK: - Blocking Logic
/// Blocks the selected apps/categories.
private func blockApps(for selection: FamilyActivitySelection) {
print("🔒 Blocking apps/categories for selection.")
print("- Applications: \(selection.applicationTokens)")
print("- Categories: \(selection.categoryTokens)")
let store = ManagedSettingsStore()
store.shield.applications = selection.applicationTokens
store.shield.applicationCategories = .specific(selection.categoryTokens)
print("🔒 Apps/categories blocked successfully.")
}
}
The problem is that when I read out the text in a PDF with page.string or page.attributedString, the context of the lines is lost. Instead of
TermA....23,45
TermB....2,13
in an index document
TermA
TermB
23,45
2,13
is issued. The context of the lines (and the sequence of the letters) is lost. Is there a way to read the text from a PDF line by line?
I've a strange problem which is only occurring on 2 client devices. We have enabled Universal links, and have it fully tested and working.
On one client device, the link never opens our app; but here's the strange thing: If I long-press on our link (in Messages), it gives a preview (as expected), and the context menu offers "Open in ", as well as "Open in Safari".
Tapping on "Open in " does nothing.
I've tried the following:
Checked I could access the site-association file over https with no redirects
Enabled developer mode and used universal link debug feature: pasted the same link - Developer mode says it will open the app.
I've carried out the sysdiagnose; And there are entries in there for our app in swcutil_show.txt. Snipped below:
Service: applinks
App ID: <my fully qualified app bundle id>
App Version: 760.0
App PI: <LSPersistentIdentifier 0x6b8008930> { v = 0, t = 0x8, u = 0x45c, db = DC8D18A2-430D-4AD4-A5BE-B7A003CF9A6F, {length = 8, bytes = 0x5c04000000000000} }
Domain: www.<mydomain>.com
Patterns: {"/":"/cc/*"}, {"?":{"t":"*"},"/":"/md/"}
User Approval: unspecified
Site/Fmwk Approval: approved
Flags:
Last Checked: 2025-04-29 09:10:21 +0000
Next Check: 2025-05-04 08:42:50 +0000
--------------------------------------------------------------------------------
Service: applinks
App ID: <my fully qualified app bundle id>
App Version: 760.0
App PI: <LSPersistentIdentifier 0x6b8008930> { v = 0, t = 0x8, u = 0x45c, db = DC8D18A2-430D-4AD4-A5BE-B7A003CF9A6F, {length = 8, bytes = 0x5c04000000000000} }
Domain: <mydomain>.com
Patterns: {"/":"/cc/*"}, {"?":{"t":"*"},"/":"/md/"}
User Approval: unspecified
Site/Fmwk Approval: approved
Flags:
Last Checked: 2025-04-29 09:10:21 +0000
Next Check: 2025-05-04 08:42:50 +0000
--------------------------------------------------------------------------------
Service: applinks
App ID: <my fully qualified app bundle id>
App Version: 760.0
App PI: <LSPersistentIdentifier 0x6b8008930> { v = 0, t = 0x8, u = 0x45c, db = DC8D18A2-430D-4AD4-A5BE-B7A003CF9A6F, {length = 8, bytes = 0x5c04000000000000} }
Domain: *.<mydomain>.com
Patterns: {"/":"/cc/*"}, {"?":{"t":"*"},"/":"/md/"}
User Approval: unspecified
Site/Fmwk Approval: approved
Flags:
Last Checked: 2025-04-29 09:10:21 +0000
Next Check: 2025-05-04 08:42:50 +0000
--------------------------------------------------------------------------------
The version numbers match the installed version of my app
I've tried running logging and just capturing logs before and after I press the "open in ", but there's nothing suspicious in there.
And the kicker - it's only happening on a single device. No other devices are experiencing this.
When I call https://developer.apple.com/documentation/contactprovider/contactprovidermanager/enable() to request to use Contact Provider, I received a dialog with message like this
"App Name would like to add its contacts as its own list. Contacts added this way can be removed from settings".
I would like to support this message in Japanese or other languages. Is it possible?
Is there any resource which describes this type of errors?
I was integrating SKADNetwork view through Ad attribution and everything from the source app side is done and this error
appears after the target app is installed and opened.
Here is the full error
Error setting install attribution pingback registered for app: <APP ID>, error: Error Domain=ASDErrorDomain Code=1209 "SKAdNetwork: Could not set registered for pingback that does not exist." UserInfo={NSLocalizedDescription=SKAdNetwork: Could not set registered for pingback that does not exist.}, result: 0
I cannot find any resource on the internet which gives any info about this ASDErrors.
If anyone can help, you would be doing me a solid, Thanks in advance.
Hi everyone,
We’re experiencing a persistent issue with an App Clip Experience that continues to load on iOS devices even after being deactivated in App Store Connect more than 48 hours ago.
Issue Summary
An App Clip Experience tied to the URL pattern
https://srgplus.com/u/...
keeps appearing when scanning NFC tags or QR codes, despite being removed from App Store Connect.
Key Details
The App Clip Experience was deactivated over 48 hours ago.
iOS still launches the App Clip when scanning NFC tags or QR codes that match the URL structure.
The specific token-based App Clip Experience (for example: https://srgplus.com/u/iohgqa) was removed, but iOS still loads an App Clip as if the Experience exists.
It seems like iOS is falling back to a previously registered base URL Pattern such as:
https://srgplus.com/u
or possibly even https://srgplus.com
The problem:
This fallback App Clip is not visible anywhere in App Store Connect → Advanced App Clip Experiences.
So we cannot delete or modify it.
The behavior persists across:
Multiple devices
Different networks
After clearing device caches
After reinstalling our app
Even after scanning using devices that never used this App Clip before
This makes us believe that the App Clip Experience may be:
Cached on Apple’s servers
Or orphaned/hidden in App Store Connect
Or not properly removed from the URL pattern registry
Steps to Reproduce
Deactivate an App Clip Experience in App Store Connect.
Wait 48 hours or more.
Scan an NFC tag or QR code pointing to a previously used URL pattern.
App Clip still appears, even though no active Experience exists.
Expected Behavior
App Clip should stop appearing once the Experience is deactivated and removed.
Actual Behavior
App Clip continues to load indefinitely, suggesting a cached or orphaned configuration.
Question
Has anyone encountered similar behavior?
Is there a way to request a manual purge of App Clip URL patterns or cached Experiences from Apple’s side?
Any guidance or insights would be greatly appreciated.
Thank you!