Hello,
in the sample code found in the Apple CardSession documentation, there are commented line in the APDU respond method:
case .received(let cardAPDU):
do {
/// Call handler to process received input and produce a response.
let responseAPDU = ProcessAPDU(cardAPDU.payload)
try await cardAPDU.respond(response: responseAPDU)
} catch {
/// Handle the error from respond(response:). If the error is
/// CardSession.Error.transmissionError, then retry by calling
/// CardSession.APDU.respond(response:) again.
}
in the catch part, it says that we should handle the error from respond and retry in case of transmission error, how can we achieve that ? How can we check the error ? Could you give a sample code for that ?
best regards
Delve 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
While playing around with AppShortcuts I've been encountering some problems around getting the invocation phrase detected and/or the parameter get recognized after invocation phrase via Siri. I've found some solutions or explanations here in other posts (Siri not recognizing the parameter in the phrase & Inform iOS about AppShortcutsProvider), but I still have one issue and it's about consistency.
For context, I've defined the parameter to be an AppEntity with it's respective query conforming to the EntityStringQuery Protocol in order to be able to fetch entities with the string given by Siri
struct AnIntent: AppIntent {
// other parts hidden for clarity
@Parameter
var entity: ModelEntity
}
For an invocation phrase akin to "Do something with in ", if the user uses the phrase with a entity previously donated via suggestedEntities() the AppShortcut get executed without problems. If the user uses a phrase with no parameter, like "do something with ", if the user gets asked to input the missing parameter and inputs one, it may or may not get recognized and be asked to input a parameter again, like in a loop. This happens even if the parameter given is one that was donated.
I've found that when this happens the entities(matching string: String) function in the EntityQuery doesn't get called. The input can be of one word or sometimes two and it will not be called. So in other words entities(matching string: String) does not get called on every user parameter input
Is this behavior correct?
Do parameters have some restrictions on length or anything?
Does Siri shows the user suggested entities when asked for entity input? It doesn't on my end.
Additional question related to AppShortcuts:
On AppShortcut definition, where the summary inside the parameter presentation is used? I see that it was defined in the AppIntentsSampleApp for the GetTrailInfo Intent but didn't find where it was used
Topic:
App & System Services
SubTopic:
Automation & Scripting
Tags:
Siri and Voice
Shortcuts
App Intents
So I'm wondering if Apple makes commission on those payments since they're made in the app. For example a user may pay another user to clean their car. This will be handled with Stripe Connect and their balance, payment history, etc will be displayed in the app.
Does Apple charge commission on that?
The section the app review guidelines that I'm refrencing is below, but I'm still a little confused.
3.1.3(e) Goods and Services Outside of the App: If your app enables people to purchase physical goods or services that will be consumed outside of the app, you must use purchase methods other than in-app purchase to collect those payments, such as Apple Pay or traditional credit card entry.
Topic:
App & System Services
SubTopic:
Apple Pay
We've been using the WeatherKit API for a few years now. Everything has been pretty stable. We'll periodically get 404 errors, but they usually disappear within a couple days.
Starting March 5th we've again been getting 404 errors that slowly ramped up to March 20th and continued. We have had no code changes on our end, so something seems to have changed / broken on the server side of things.
Here are some example API calls that are giving us a 404 error now
https://weatherkit.apple.com/api/v1/weather/en/35.9981205/-78.8920444?dataSets=forecastDaily&dailyStart=2025-03-21T05:00:00Z&timezone=America/New_York&countryCode=US
https://weatherkit.apple.com/api/v1/weather/en/41.4789363/-81.7404134?dataSets=forecastDaily&dailyStart=2025-03-21T04:56:00Z&timezone=America/New_York&countryCode=US
Does anyone have any insights or information on this?
Also if Apple is listening, an error more meaningful than 404 would be much much appreciated.
My CoreSpotlight extension seems to exceed the 6 MB memory limit. What’s the best way to debug this?
I've tried to attach the debugger on the Simulator but the extension seems to be never launched when I trigger the reindex from Developer settings. Is this supposed to work?
On device, I am able to attach the debugger. However, I can neither transfer the debug session to Instruments, nor display the memory graph. So I've no idea how the memory is used.
Any recommendations how to move forward? Is there a way to temporarily disable the memory limit since even with LLDB attached, the extension is killed.
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 get crash reports which I can't reproduce when trying to present an SKStoreProductViewController :
Fatal Exception: UIApplicationInvalidInterfaceOrientation
Supported orientations has no common orientation with the application, and [SKStoreProductViewController shouldAutorotate] is returning YES
No matter what app Deployment info orientation I try I can't get my SKStoreProductViewController shouldAutorotate property to return YES. It is always false.
Does anyone knows why or how to get an SKStoreProductViewController to return shouldAutorotate YES?
Topic:
App & System Services
SubTopic:
StoreKit
I'm working on an app that uses MapKit and CoreLocation. Is there a way to specify what location is simulated for a Preview, or create a preview that behaves as if the user denied location permissions, so that I can easily test my app's behavior in different scenarios? I know that you can simulate different locations in the Simulator, but haven't been able to get the previews within Xcode to have a location other than the center of Apple Park.
I want to create a brush similar to a fountain pen, with a three-dimensional feel to the strokes and a distinct tip. Alternatively, is it possible to achieve this by modifying the configuration parameters of a fountain pen brush?
My server's access to Apple's payment interface (buy. itunes. apple. com/verifiyReceipt) has been unresponsive since the end of March, and I have been searching for a long time without finding any issues. Normally, even if the data is incorrect, there is still a {"status": 21000} response. We are using Alibaba Cloud's virtual servers here. I don't know if Apple has made any adjustments to the interface. If anyone has encountered this problem, please kindly help to answer it. Thank you all.
Topic:
App & System Services
SubTopic:
StoreKit
In my case, when two functions that start each Live Activity(not connected each other) are performed in LiveActivityIntent's perform(), it seems that only one will start.
(It's the same to start independently with two Task{})
And, set one to 'opensIntent' and separate it by opening another LiveActivityIntent, the result is same.
Also, every time I tap the Intent directly in the shortcut app, one activity will end within a matter of seconds, even if there are two for a while.
But, If openAppWhenRun to true, it seem to works without any problems.
I would appreciate it if you could give me a tip to fix this problem.
A team observed lots of timeouts from the Apple Pay session endpoint: https://apple-pay-gateway-cert.apple.com/paymentservices/paymentSession
Is it expected or some kind of an implementation issue from the caller side?
Thanks!
Topic:
App & System Services
SubTopic:
Apple Pay
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.
Hello,
I am writing this because the behavior of the App Store Server Notification that our server receives is problematic in the Sandbox environment.
I have two questions in total.
When purchasing a Free Trial subscription, after receiving the SUBSCRIBED / INITAL_BUY Notification, DID_RENEW should be sent when it expires, but DID_FAIL_TO_RENEW/GRACE_PERIOD is sent.
The EXPIRE Notification is sent after the subscription expires or DID_CHANGE_RENEWAL_STATUS/AUTO_RENEW_DISABLED is sent, but it does not arrive.
The first problem is that I recently heard that automatic payments after a free trial require the user's consent via email. Is this the reason?
If so, I am curious about how I can test it in the Sandbox environment.
Is the second problem a bug?
Topic:
App & System Services
SubTopic:
Notifications
Tags:
Subscriptions
In-App Purchase
App Store Server Notifications
Hello, experts!
I'm working on a VOIP application that handles audio calls and integrates with CallKit. The problem occurs when attempting to redial a previously made audio call from the system's call history. When I try to handle the NSUserActivity in the application(_:continue:restorationHandler:) method, it intercepts the INStartAudioCallIntent instead of the expected INStartCallIntent.
Background
Deprecation Warnings: I'm encountering deprecation warnings when using INStartAudioCallIntent and INStartVideoCallIntent:
'INStartAudioCallIntent' was deprecated in iOS 13.0: INStartAudioCallIntent is deprecated. Please adopt INStartCallIntent instead.
'INStartVideoCallIntent' was deprecated in iOS 13.0: INStartVideoCallIntent is deprecated. Please adopt INStartCallIntent instead.
As a result, I need to migrate to INStartCallIntent instead, but the issue is that when trying to redial a call from the system’s call history, INStartAudioCallIntent is still being triggered.
Working with Deprecated Intents: If I use INStartAudioCallIntent or INStartVideoCallIntent, everything works as expected, but I want to adopt INStartCallIntent to align with the current iOS recommendations.
Configuration:
CXProvider Configuration: The CXProvider is configured as follows:
let configuration = CXProviderConfiguration()
configuration.supportsVideo = true
configuration.maximumCallsPerCallGroup = 1
configuration.maximumCallGroups = 1
configuration.supportedHandleTypes = [.generic]
configuration.iconTemplateImageData = UIImage(asset: .callKitLogo)?.pngData()
let provider = CXProvider(configuration: configuration)
Outgoing Call Handle: When making an outgoing call, the CXHandle is created like this:
let handle = CXHandle(type: .generic, value: callId)
Info.plist Configuration: In the info.plist, the following key is defined:
<key>NSUserActivityTypes</key>
<array>
<string>INStartCallIntent</string>
</array>
Problem:
When trying to redial the audio call from the system's call history, the NSUserActivity received in the application(_:continue:restorationHandler:) method is an instance of INStartAudioCallIntent instead of INStartCallIntent. This happens even though INStartCallIntent is listed in NSUserActivityTypes in the info.plist and I want to migrate to the newer intent as recommended in iOS 13+.
Device:
iPhone 13 mini
iOS version 17.6.1
Topic:
App & System Services
SubTopic:
Automation & Scripting
Tags:
Foundation
CallKit
Intents
App Intents
I'm developing an iPad app and encountered a strange issue with external Bluetooth keyboards.
Issue:
I have a Bluetooth keyboard set to JIS layout in Settings > General > Keyboard > Hardware Keyboard > Keyboard Type.
If I connect the keyboard before launching the app, everything works fine, and the input follows the JIS layout.
However, if I launch the app first and then turn on the Bluetooth keyboard, the input behaves as if the keyboard is in ANSI layout, even though the settings still show JIS.
It seems like iPadOS defaults to ANSI if no external keyboard is connected when the app starts, and later connections do not update the layout properly.
Has anyone encountered a similar issue, and is there a programmatic way to ensure that the correct keyboard layout is applied after the keyboard is connected?
Any help or insights would be greatly appreciated!
Topic:
App & System Services
SubTopic:
Hardware
Is CallKit still not available in certain countries? like China? If it is, is there a way to get a list of countries?
I have an app that works by being able to map IAP transactions to a predefined user ID. This means when I consume events from Apple's App Store Server Notifications endpoints I have to do a reverse lookup in order to assign permissions within my app.
Workflow:
User purchases subscription within the app via IAP. The app persists the subscriptionID from the Apple IAP library in my cloud database (Firestore).
Cloud function receives the event from App Store Server Notifications endpoint and looks up the user ID containing the persisted transactionID (with retries to avoid race condition).
Question:
This workflow works but it seems an improvement would be to allow dev's to append metadata, like the user ID, to the transaction submitted to IAP that we can access within the signedTransactionInfo of the event from the App Store Server Notifications endpoint in order to facilitate a direct lookup of the user document needing it's permissions updated. This would greatly simplify workflows that use non-Apple systems as a source of truth for app permissions. Does this actually exist already? If not, is there a feature request platform?
Topic:
App & System Services
SubTopic:
StoreKit
I've noticed that the when starting live activities via a remote push-to-start notification, the live activity widget consistently succeeds in displaying on the lock screen. However push-to-update token is not always received by the task observing the pushTokenUpdates async-sequence.
Task {
print("listening for pushTokenUpdates")
for await pushToken in activity.pushTokenUpdates {
let token = pushToken.map {String(format: "%02x", $0)}.joined()
print("Push token: \(token)")
}
}
The log will print "listening for pushTokenUpdates" however occasionally the "Push token: ___" line will not be present even when the widget has displayed on screen. This happens even if the "allow" button has been selected on live activities for that app. The inconsistent behavior leads me to believe there is an issue at the ActivityKit level. Would appreciate any feedback in debugging this!
please bear with me, i am NOT a developer. we have third party developer creating a banking app that is throwing an error when trying to provision MasterCard for Apple Pay. MasterCard says they do not see the request come in at all. our developer says the issue is between mastercard and apple - and asked us to reach out to Apple.
Information provided from our developer:
“Error code 2 is 'system cancelled' from the PKAddPaymentPassError enum. Basically, there is an issue between Apple and Mastercard (using the encrypted card info from...”
Response from Mastercard Connect:
Upon further research with the examples you shared we are not seeing any attempt that reached to MC
Topic:
App & System Services
SubTopic:
Apple Pay