Hello there!
So Im trying to upload an app to the App Store for iphone and Ipad, but from the revision team the same message always appears, the app crash.
So I know the "it works on my computer" sounds bad but....works on my computer and my test system.
Dont know what to do since I dont know how to replicate the error.
This is the rely they sent me:
Issue Description
The app exhibited one or more bugs that would negatively impact users.
Bug description: at time of review the app’s interface went blank at launch.
Review device details:
Device type: iPad Air (5th generation)
OS version: iPadOS 18.4.1
Anyone has any idea on how can I replicate the error and maybe check the logs? Im completely blind on this one.
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
My sticker app was rejected when I submitted it to App Store Connect.
Reason:
"We were unable to locate your stickers in message app after installed your app."
When I checked on an iOS18 device, this was correct.
However, my stickers is visible when I dragged the half-modal(like sheetPresentationController) part.
I hope what I need to do to get the stickers to display initially.
My code(Xcode16.2)
class StickerViewController: MSStickerBrowserViewController {
var stickers = [MSSticker]()
override func viewDidLoad() {
super.viewDidLoad()
loadStickers()
}
override var stickerSize: MSStickerSize {
get {
return .small
}
}
func loadStickers() {
var imageSetPath = "en"
for index in 1...20 {
var strIndex = ""
strIndex = "stmp" + String(index) + imageSetPath
createSticker(assetLocation: "\(strIndex)", assetDescription: "\(strIndex)")
}
}
func createSticker(assetLocation: String, assetDescription: String) {
guard let path = Bundle.main.path(forResource: assetLocation, ofType: "png") else {
return
}
let url = URL(fileURLWithPath: path)
do {
let sticker = try MSSticker(contentsOfFileURL: url, localizedDescription: assetDescription)
stickers.append(sticker)
} catch {
print(error)
}
}
}
extension StickerViewController {
override func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int {
return stickers.count
}
override func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker {
return stickers[index]
}
}
We had a question that came up when we comparing data from WeatherKit to other sources - WeatherKit visibility was well beyond the boundaries we had historically, even from Darksky. That raises two questions:
is visibility actually in meters like the docs say?
is this visibility at ground level, 500ft, or some other height?
We were seeing visibility numbers of up to 40 miles (after converting the number the API sent to miles), where all of our other sources are usually within 10 miles
我完全复用了官方wwdc的Alarmkit的demo。测试过程发现12,13pro闹钟完全正常,15pro和16pro闹铃时间不对,经常不响,而且在设置中切换市时区时会立马响。这是api的bug么
Topic:
App & System Services
SubTopic:
General
Hi,
My app is going to consist of 2-3 pages of weather data. Do I have to add the Apple Weather logo to each page, or just the main one?
Thanks,
Dan Uff
Environment: macOS 15.2 (24C101) with Xcode 16.2 (16C5032a)
Goal: I am trying to build a simple IMKInputController-based input method.
Problem: My .app bundle registers successfully and I can select it as an input source. When selected, it blocks keyboard input, but my handle method does not seem to execute or produce output. I have placed NSLog statements in my controller's init and handle methods.
Code for the controller:
import InputMethodKit
// The IMKTextInput protocol is provided by the framework.
// We don't need to define our own bridging protocol for this test.
public class HelloWorldController: IMKInputController {
public override init!(server: IMKServer!, delegate: Any!, client inputClient: Any!) {
super.init(server: server, delegate: delegate, client: inputClient)
NSLog("HelloWorldIME: Controller has been initialized.")
}
public override func handle(_ event: NSEvent!, client sender: Any!) -> Bool {
NSLog("HelloWorldIME: handle() method was called.")
// ================== FINAL FIX APPLIED HERE ==================
// 1. First, we ensure the client is a fundamental Objective-C object.
guard let clientObject = sender as? NSObject else {
NSLog("HelloWorldIME: Error - client object is not an NSObject.")
return false
}
NSLog("HelloWorldIME: Successfully cast client to NSObject.")
// 2. Now that we have an NSObject, we can safely check if it responds to the selector.
let selector = #selector(IMKTextInput.insertText(_:replacementRange:))
if !clientObject.responds(to: selector) {
NSLog("HelloWorldIME: Error - client object does not respond to the insertText selector.")
return false
}
NSLog("HelloWorldIME: Client responds to insertText. Preparing to insert text.")
// 3. Since we've confirmed it responds, we can now safely treat it as an IMKTextInput
// and call the method.
let client = clientObject as! IMKTextInput
let stringToInsert = "A"
let replacementRange = NSRange(location: NSNotFound, length: 0)
client.insertText(stringToInsert, replacementRange: replacementRange)
NSLog("HelloWorldIME: Called insertText with string '\(stringToInsert)'. Action complete.")
// ========================================================
return true
}
}
we’re looking to get some clarification around how the hourly forecasts should be interpreted to ensure we’re using your data in the correct manner. If you could provide the answers to the following questions would be extremely helpful:
1. What do the data points (e.g temperature) in the hourly forecast represent for a future hour? Do they represent the expected average over that future hour or do they represent the forecast for the point in time at the top of the hour?
2. What do those same data points represent in the hourly forecast for an hour which has already begun? e.g. it’s 8:30 and we pull the hourly forecast and the 8:00 hour is still returned. Which of the following would be the correct interpretation for the values returned for the 8:00 hour:
The values represent the forecast for the point in time at the top of the 8:00 hour (if this is the case we would expect it to stop updating)
The values represent the current forecast i.e. what the weather is right now
The values represent the average over the remaining portion of the 8:00 hour
The values represent the average over the full 8:00 hour including both the portion which has already elapsed and the portion which is still to come
3. What does the data represent after the hour (i.e. looking at historical hours)? Is it:
The last forecast made within the hour? If so, is that point-in-time or average for the hour (as explained above)?
The actual weather for that hour (using some non-forecast measure of real weather)? If so, again is that point-in-time at top of hour / point-in-time at end of hour / average over the hour?
Hey there,
I have an app where I create custom Advanced App Clip Experiences for other businesses which seems to be a valid thing.
I do create them via API. Upon creation everything looks fine: when I go to App Store Connect -> App -> Advanced App Clip Experiences, I do see the new App Clip Experience I've just created. Their status is Received (as any other active experiences) and have a custom URL.
The issue is weird timing when the Advanced App Clip Experience actually becomes available on the iPhone (can be triggered via App Clip Code, etc). Some experiences become available literally immediately but others take days (some take 1-2 days, some take ~5 days).
I'm not sure why there's a bid difference for an Advanced App Clip to be actually active. Does anyone have any kind of experience with that? I don't change domain settings, app's settings, etc. I'm just creating a new experience (both via API or manually at App Store Connect) and I do have different "activation" times for different App Clips.
Same when I delete an Advanced App Clip Experience, it will still be available for next couple days.
I get there might be caching stuff, etc. But the difference is quite huge and makes no sense since as I've mentioned some clips become available immediately but some takes days to be available.
Thank you!
Hi everyone,
I'm working on an app for parents and kids where parents can define screen time goals or restrict usage of certain app categories (like social media or games). If the kid follows those rules—for example, by using their device less or avoiding restricted categories—they would earn points or rewards in the app.
I’ve been exploring if the Apple Screen Time API allows developers to access this kind of data (like total screen time, app usage by category, etc.) so that I can track the kid’s behavior and reward them accordingly.
Is it possible to programmatically access this data and implement such a reward system within my app? If so, what’s the best way to get started or which APIs should I look into?
Thanks in advance for your help!
I have been working to implement Apple's Live Caller ID feature, which requires setting up a relay server. Following Apple's guidelines, I submitted a request through the provided link to utilize Apple's relay server. However, it's been three weeks, and I have yet to receive a response. I contacted Apple Support, but they indicated that this is a technical matter beyond their scope.
Has anyone successfully received confirmation from Apple regarding the use of their relay server for Live Caller ID? If so, could you share your experience or any advice on how to proceed?
url: https://developer.apple.com/contact/request/live-caller-id-lookup/
Thank you.
在watchOS11.5下,Apple watch无法加载天气。无论是否连接自己的iPhone均无法加载
Hello,
I’m developing an app to detect movement past a strong magnet, targeting both Android and iOS. On Android, I’m using the Sensor API, which provides calibrated readings with temperature compensation, factory (or online) soft-iron calibration, and online hard-iron calibration. The equivalent on iOS appears to be the CMCalibratedMagneticField data from the CoreMotion framework.
However, I’m encountering an issue with the iOS implementation. The magnetometer data on iOS behaves erratically compared to Android. While Android produces perfectly symmetric peaks, iOS shows visual peaks that report double the magnetic field strength. Additionally, there’s a "pendulum" effect: the field strength rises, drops rapidly, rises again to form a "double peak" structure, and takes a while to return to the local Earth magnetic field average. The peaks on iOS are also asymmetric.
I’m wondering if this could be due to sensor fusion algorithms applied by iOS, which might affect the CMCalibratedMagneticField data. Are there other potential reasons for this behavior? Any insights or suggestions would be greatly appreciated.
Thank you!
Hi, after updating to iOS 26 I'm encountering an issue where the FamilyActivityPicker no longer opens. No errors are shown in the console, it just never shows up. It works fine pre iOS 26. I've never had any issues with the picker showing up until iOS 26. My latest update was rejected because of this issue, but I've changed nothing in the code. Is anyone else experiencing this?
Topic:
App & System Services
SubTopic:
General
Tags:
Family Controls
Device Activity
Managed Settings
Hello
Having trouble getting associated domain to work in our project. It was working when we used Branch, but our company wants to host the domain ourselves.
This is a multi-scheme project, using .xcconfig files to define the correct entitlement per Build.
The relevant entitlement file has:
com.apple.developer.associated-domains
applinks:bm.ddcas.ai in the
....{other irrelevant test associated domains....}
The project Team and App ID are taken from the Identifiers screen where the Identifier capabilities has 'associated domains' ticked on. I've also checked elsewhere on AppleDeveloper/Connect to be sure.
When we used Branch with domain key app links: bmstores.app.link this worked fine.
With https://bm.ddcas.ai (our own host) which is publicly available and has an aasa file in both the main directory and /.well-known, typing this in safari or anything just doesn't attempt to link to the App.
The iPhone is in developer mode, and using the developer menu associated domains diagnostic tool, typing https://bm.ddcas.ai results in the diagnostic saying 'The url is a Universal Link for the app with identifier **********.***etc (the app is installed on real iPhone 12, iOS 18.6.2 and my Xcode is 16.4)
However, it just doesn't work if we type in https://bm.ddcas.ai and results in a Safari message of '400 not found' and the 'nginx' shows.
We have read innumerable Apple Dev posts and StackOverflow posts, as well as several step by step 'how to's' online but this just isn't working.
The aasa file is at https://bm.ddcas.ai/apple-app-site-association and is setup as follows:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "{my Team ID}.{my App ID}",
"paths": [
"*"
],
"components": [
{
"/": "/verification",
"?": {
"verification_code": "[A-Za-z0-9]{6}"
},
"comment": "Matches verification code path"
}
]
}
]
}
}
Our Server guys say the website (bm.ddcas.ai) is public and hosted, it just doesn't have a /verification path as they say it should redirect before reaching that.
Also, our Android redirect works using this site, so this appears to be something specific Apple code is looking for.
What, please, are we likely to be missing as it does not seem obvious from the Apple documentation or any of the resources I have checked online. Normally we can figure anything out, but getting nowhere here so the help is appreciated.
At WWDC25 we launched a new type of Lab event for the developer community - Group Labs. A Group Lab is a panel Q&A designed for a large audience of developers. Group Labs are a unique opportunity for the community to submit questions directly to a panel of Apple engineers and designers. Here are the highlights from the WWDC25 Group Lab for watchOS (part 2).
7. For widget (complication) update budgets, is there an overall budget or are scheduled update separate from APNS updates? For context I have a complication that is updated on a fixed schedule (every 20 min), but there can be times of the day that are more "interesting" where pushes make sense.
Like timeline updates, the system budgets WidgetKit push notifications and delivers them opportunistically. You can use WidgetKit push notification updates as an addition to timeline updates. For more information, see Updating widgets with WidgetKit push notifications.
8. It seems like the new Control Center widgets can be sourced from either the iPhone or directly on the Watch. Can we control whether a control appears in the watch list, or will it always be a combination of all controls from both sources?
iPhone controls will be automatically available on the companion Apple Watch, even if they don’t have an associated watchOS app. When an iPhone control is tapped on the Apple Watch, the action is performed on the iPhone. Controls whose actions foreground the iOS app will not appear on Apple Watch.
If a watchOS app has controls, no controls will appear on Apple Watch from the companion iOS app.
9. From UI/UX perspective, what are the current practices for Designing watchOS apps that feels native.
The WWDC23 session Design and build apps for WatchOS 10 covers the details of watchOS design principles and how to apply them in your app using SwiftUI. A lot of SwiftUI APIs, such as NavigationSplitView, vertical tab view, list view, and etc, already implement the look and feel native to watchOS.
10. When adopting the new design system on watchOS, it seems like the main place we will use the glass effect is for our buttons in toolbar? Standard buttons in system apps seem to continue to use a flat appearance and full width.
We leave the choice to you – You can use the new GlassButtonStyle API or .buttonStyle(.glass) to apply the liquid glass material to buttons.
Learn when to use the Liquid Glass styles in Get to know the new design system.
11. Is there any way to gracefully migrate extensions when their bundleIDs have to change? e.g., converting a multi-target watch app to single-target, which drops the .watchkitextension from both the app and WidgetKit ext bundleIDs
Updating a watchOS app to single-target is covered in TechNote TN3157: Updating your watchOS project for SwiftUI and WidgetKit. Xcode provides a tool that can do the update automatically, and the technote describes the details about how to use it and how to clean up the project after the automatic update. If there's something that technote doesn't address, please reach out to us on the Developer Forums.
12. What is the status of WatchConnectivity? Is that still the preferred way for iOS + watchOS communications?
The Watch Connectivity framework is still supported, and is appropriate for the communication between an watchOS app and its companion iOS app.
The systems also provide other APIs for the apps to exchange data. For example, watchOS supports Apple Push Notification service (APNs). If data for your widget changes on your server, your widget can receive a WidgetKit push notification, and update accordingly. That’s the preferred mechanism for widget updates.
My use case is a Repeat Timer app.
The user can configure a repeating timer, say:
8 minutes with 3 sets
So I would like to configure either 3 alarms (8mins, 16mins, 24mins) or a repeating alarm (8mins every 3 mins)
BUT...
I would like the first and second alarms to break through but only for 5 seconds for example, and then stop (so the user doesn't need to tap the screen to silence the alarm).
I don't think this is possible after reading the API docs, but am asking the question anyway.
Thanks for any advice or guidance here, and happy WWDC!
Topic:
App & System Services
SubTopic:
General
I am working on a Flutter application which is use solely to collect data from a bluetooth low energy (BLE) peripheral and then upload the data to our cloud.
The application runs in the background 99% of the time after the initial login and BLE pairing which is causing us some issues.
After the Application is backgrounded it would work for a day to 2 days and then stop working. (What I mean with working is to download data from the BLE peripheral and then upload the data to our cloud). Once the data syncing has stopped it would take up to 12 hours until data starts flowing again.
I have read in a couple of places that iOS implements some sort of "budget/heuristics" when the application is running in the background to keep track of the application and when this "budget" is used up iOS will stop servicing the application until iOS decides that the application can run in the background again.
My question, is it possible via a enablement or some other mechanism to prevent iOS from blocking our application from running in the background to enable 24/7 periodic data uploads every 30 minutes.
We have implemented the following so far;
The data sync process is triggered from the BLE peripheral using a notification. This notification is sent every 30 minutes.
Each sync duration is currently 24 seconds on average, we are working on reducing this to below 10 seconds.
We implemented State Restoration to assist iOS in starting the application more efficiently.
We are considering using Silent Push Notifications from the Cloud to wake up the application when data hasn't synced in 6 hours.
Any assistance would be high appreciated.
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!
Hi Apple engineering team,
I’m trying to integrate the new Live Caller ID Lookup (PIR) on iOS using your pir-service-example code as well as a custom mock server in Vapor, but the extension never advances past the /issue/token-key-for-user-token step. I’ve tried both:
1. Official Example
Cloned https://github.com/apple/pir-service-example
Ran PIRService locally
Confirmed that
GET /.well-known/private-token-issuer-directory → 200
GET /issue/token-key-for-user-token → 200 (DER bytes, correct SPKI)
No POST /issue ever fires
2. Mock Server (Vapor)
Implemented all five endpoints (/config, /.well-known/private-token-issuer-directory, /issue/token-key-for-user-token, /issue, /queries)
Verified with curl and openssl asn1parse that:
GET /.well-known/private-token-issuer-directory
Content-Type: application/private-token-issuer-directory
{ "issuer-request-uri":"https://…/issue", "token-keys":[…] }
GET /issue/token-key-for-user-token
Content-Type: application/octet-stream
<DER bytes>
Added Cache-Control: public, max-age=3600 on directory and SPKI
Stubbed POST /issue to always return { "token": "" }
Still no POST /issue request from the extension
Reproduction Steps
Install and enable a Live Lookup extension pointing to my server.
Trigger an incoming call on device.
Watch server logs—only see the two GETs, never /issue or /queries.
Expected Behavior
After fetching the SPKI DER, the framework should issue a POST /issue call (Privacy Pass flow) and then POST /queries.
Observed Behavior
Stuck in an infinite loop of:
GET /.well-known/private-token-issuer-directory
GET /issue/token-key-for-user-token
(repeat…)
No progression to the /issue or /queries endpoints.
What I’ve Tried
Verified JSON kebab-case and headers exactly match examples
Confirmed SPKI DER is valid via openssl asn1parse
Added Cache-Control headers
Tested on real device, localhost url, and ngrok public URL
Mocked a valid-looking token response
Could you advise what additional requirement or format detail I’m missing that prevents from advancing past /issue/token-key-for-user-token?
These are the main files:
LiveLookupExtension.swift
routes.swift
service-config.json
Thanks in advance!
Hi everyone,
i'm trying to request in a AppIntent an array of strings. But I want to give the user the chance to add more than one String.
Yet, I do it so:
import AppIntent
struct AddHomework: AppIntent {
// some Parameters
@Parameter(title: "Tasks")
var tasks: [String]?
@Parameter(title: "New Task") //Only for the special request
var input: String?
private func collectTasks() async throws -> [String] {
var collectedTasks: [String] = tasks ?? []
while true {
if !collectedTasks.isEmpty {
let addMore = try await $input.requestConfirmation(for: "Möchtest du noch eine Aufgabe hinzufügen?")
if !addMore {
break
}
}
let newTask = try await $input.requestValue("Please enter your task:")
collectedTasks.append(newTask)
}
return collectedTasks
}
@MainActor
func perform() async throws -> some IntentResult {
let finalTasks = try await collectTasks()
// some more code
return .result()
}
}
But this is not working. The Shortcut is ending without requesting anything. But it is not crashing.
I would thankfully for some help.