Post

Replies

Boosts

Views

Activity

StoreKit testing not working on iOS26.5 simulator
Hi, I'm trying to run our StoreKit unit tests with Xcode26.5 on an iOS26.5 simulator. Host computer has macOS26.5. All tests are failing and in the console I see logs such as [SKTestSession] Error saving configuration file: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error deleting all transactions: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error clearing overrides: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error setting value to 1 for identifier 2 for jp.unext.mediaplayer: Error Domain=SKInternalErrorDomain Code=3 "(null)" And the simulator asks me to provide my AppleID. Tests have been broken since at least 26.4 The release notes claims that it has been fixed but not for me. https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-26_5-release-notes#StoreKit-Testing-in-Xcode Does anyone else have the same issue? Reported FB22774836 just in case.
9
11
1.7k
Sep ’26
New download progress "banner" on iOS27
We are using AVAssetDownloadURLSession to download videos. On iOS27, when building with the iOS27 SDK, there is a new progress banner showing the file name and download progress. The user can also cancel the download from there. I have not seen this mentioned anywhere and I am wondering if there are any APIs related to this new feature? Reason: For example, we show a user notification when a download has finished but if there already was a banner displaying the status that notification is unnecessary.
2
0
467
Sep ’26
iOS Safari 26 select dismiss issue
We are seeing an issue in Safari on iOS 26 where the a automatic unfocus of on select box dismisses the second one. <select name="choice1" onblur="console.log('onblur1');" onfocus="console.log('onfocus1');"> <option value="first">First Value</option> <option value="second" selected>Second Value</option> <option value="third">Third Value</option> </select> <select name="choice2" onblur="console.log('onblur2');" onfocus="console.log('onfocus2')"> <option value="first">First Value</option> <option value="second" selected>Second Value</option> <option value="third">Third Value</option> </select> select something in choice1. quickly tap choice2 before onblur1 is logged. At the timing of onblur1 the selection menu for choice2 is dismissed. Anyone know how to fix this behavior?
Topic: Safari & Web SubTopic: General Tags:
2
0
427
Sep ’25
UICollectionView with orthogonal (horizontal) section not calling touchesShouldCancel(in:)
I have a UICollectionView with horizontally scrolling sections. In the cell I have a UIButton. I need to cancel the touches when the user swipes horizontally but it does not work. touchesShouldCancel(in:) is only called when swiping vertically over the UIButton, not horizontally. Is there a way to make it work? Sample code below import UIKit class ConferenceVideoSessionsViewController: UIViewController { let videosController = ConferenceVideoController() var collectionView: UICollectionView! = nil var dataSource: UICollectionViewDiffableDataSource <ConferenceVideoController.VideoCollection, ConferenceVideoController.Video>! = nil var currentSnapshot: NSDiffableDataSourceSnapshot <ConferenceVideoController.VideoCollection, ConferenceVideoController.Video>! = nil static let titleElementKind = "title-element-kind" override func viewDidLoad() { super.viewDidLoad() navigationItem.title = "Conference Videos" configureHierarchy() configureDataSource() } } extension ConferenceVideoSessionsViewController { func createLayout() -> UICollectionViewLayout { let sectionProvider = { (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(1.0)) let item = NSCollectionLayoutItem(layoutSize: itemSize) // if we have the space, adapt and go 2-up + peeking 3rd item let groupFractionalWidth = CGFloat(layoutEnvironment.container.effectiveContentSize.width > 500 ? 0.425 : 0.85) let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(groupFractionalWidth), heightDimension: .absolute(200)) let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) let section = NSCollectionLayoutSection(group: group) section.orthogonalScrollingBehavior = .continuous section.interGroupSpacing = 20 section.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20) return section } let config = UICollectionViewCompositionalLayoutConfiguration() config.interSectionSpacing = 20 let layout = UICollectionViewCompositionalLayout( sectionProvider: sectionProvider, configuration: config) return layout } } extension ConferenceVideoSessionsViewController { func configureHierarchy() { collectionView = MyUICollectionView(frame: .zero, collectionViewLayout: createLayout()) collectionView.translatesAutoresizingMaskIntoConstraints = false collectionView.backgroundColor = .systemBackground view.addSubview(collectionView) NSLayoutConstraint.activate([ collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor), collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor), collectionView.topAnchor.constraint(equalTo: view.topAnchor), collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) collectionView.canCancelContentTouches = true } func configureDataSource() { let cellRegistration = UICollectionView.CellRegistration <ConferenceVideoCell, ConferenceVideoController.Video> { (cell, indexPath, video) in // Populate the cell with our item description. cell.buttonView.setTitle("Push, hold and swipe", for: .normal) cell.titleLabel.text = video.title } dataSource = UICollectionViewDiffableDataSource <ConferenceVideoController.VideoCollection, ConferenceVideoController.Video>(collectionView: collectionView) { (collectionView: UICollectionView, indexPath: IndexPath, video: ConferenceVideoController.Video) -> UICollectionViewCell? in // Return the cell. return collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: video) } currentSnapshot = NSDiffableDataSourceSnapshot <ConferenceVideoController.VideoCollection, ConferenceVideoController.Video>() videosController.collections.forEach { let collection = $0 currentSnapshot.appendSections([collection]) currentSnapshot.appendItems(collection.videos) } dataSource.apply(currentSnapshot, animatingDifferences: false) } } class MyUICollectionView: UICollectionView { override func touchesShouldCancel(in view: UIView) -> Bool { print("AH: touchesShouldCancel view \(view.description)") if view is MyUIButton { return true } return false } } final class MyUIButton: UIButton { } class ConferenceVideoCell: UICollectionViewCell { static let reuseIdentifier = "video-cell-reuse-identifier" let buttonView = MyUIButton() let titleLabel = UILabel() override init(frame: CGRect) { super.init(frame: frame) configure() } required init?(coder: NSCoder) { fatalError() } } extension ConferenceVideoCell { func configure() { buttonView.translatesAutoresizingMaskIntoConstraints = false titleLabel.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(buttonView) contentView.addSubview(titleLabel) titleLabel.font = UIFont.preferredFont(forTextStyle: .caption1) titleLabel.adjustsFontForContentSizeCategory = true buttonView.layer.borderColor = UIColor.black.cgColor buttonView.layer.borderWidth = 1 buttonView.layer.cornerRadius = 4 buttonView.backgroundColor = UIColor.systemPink let spacing = CGFloat(10) NSLayoutConstraint.activate([ buttonView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), buttonView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), buttonView.topAnchor.constraint(equalTo: contentView.topAnchor), titleLabel.topAnchor.constraint(equalTo: buttonView.bottomAnchor, constant: spacing), titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), titleLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor) ]) } }
Topic: UI Frameworks SubTopic: UIKit Tags:
1
0
140
Jun ’25
CoreMediaErrorDomain error -42709
We are getting reports from customers that they are not able to play videos in our app after updating their phones to iOS18.3.1. (Further checking indicates that it happens on all iOS18 versions. It suddenly started occurring from February 18th, 2025) When checking logs we see that playback is failing due to CoreMediaErrorDomain error -42709. This is an undocumented error code and hence we do not know the cause of the playback issue. Does anyone know what this error code means and how the app should handle it? Reported as FB16638501.
10
3
2.3k
Mar ’25
Test In-App purchase on AdHoc build
Hi,In the documentation it says you must use a sandbox account when testing In-App purchase using the Sandbox.But I just noticed that (currently on 10.3 release) the StoreKit popup is saying "Sandbox" even when using a normal account but the app is an AdHoc build.Is this expected that a normal account also uses the "Sandbox" when running a AdHoc distribution build?Thanks in advance,Anders
3
0
5k
Sep ’23
AVPlayer and Cookie Expiration
Hi,I have some questions about how AVPlayer handles updates of a cookie's expiration time.We do something like this:1) Send a GET request to server which sets authentication cookie. This cookie has a short expiration time, CookieExpiryTime.2) Start AVPlayer. The authentication cookie is included in the AES key request.3) Every n minutes (where n is CookieExpiryTime/2), send new GET request to authentication server to get updated cookie expiration time. By logging all cookies in NSHTTPCookieStorage.sharedHTTPCookieStorage() we can see that the expiration time of the cookie is updated.The problem:When a key is requested after the expiration time of the first cookie from 1), the cookie is no longer included in the AES key request.But shouldn't the updated cookie (with extended expiration time) be considered?Question 1) Does AVPlayer filter out expired cookies when doing the AES key requests?Question 2) Does AVPlayer check NSHTTPCookieStorage.sharedHTTPCookieStorage() for updated cookies after init?Thanks,Anders
1
0
1.7k
Apr ’22
StoreKit testing not working on iOS26.5 simulator
Hi, I'm trying to run our StoreKit unit tests with Xcode26.5 on an iOS26.5 simulator. Host computer has macOS26.5. All tests are failing and in the console I see logs such as [SKTestSession] Error saving configuration file: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error deleting all transactions: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error clearing overrides: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error setting value to 1 for identifier 2 for jp.unext.mediaplayer: Error Domain=SKInternalErrorDomain Code=3 "(null)" And the simulator asks me to provide my AppleID. Tests have been broken since at least 26.4 The release notes claims that it has been fixed but not for me. https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-26_5-release-notes#StoreKit-Testing-in-Xcode Does anyone else have the same issue? Reported FB22774836 just in case.
Replies
9
Boosts
11
Views
1.7k
Activity
Sep ’26
New download progress "banner" on iOS27
We are using AVAssetDownloadURLSession to download videos. On iOS27, when building with the iOS27 SDK, there is a new progress banner showing the file name and download progress. The user can also cancel the download from there. I have not seen this mentioned anywhere and I am wondering if there are any APIs related to this new feature? Reason: For example, we show a user notification when a download has finished but if there already was a banner displaying the status that notification is unnecessary.
Replies
2
Boosts
0
Views
467
Activity
Sep ’26
iOS Safari 26 select dismiss issue
We are seeing an issue in Safari on iOS 26 where the a automatic unfocus of on select box dismisses the second one. <select name="choice1" onblur="console.log('onblur1');" onfocus="console.log('onfocus1');"> <option value="first">First Value</option> <option value="second" selected>Second Value</option> <option value="third">Third Value</option> </select> <select name="choice2" onblur="console.log('onblur2');" onfocus="console.log('onfocus2')"> <option value="first">First Value</option> <option value="second" selected>Second Value</option> <option value="third">Third Value</option> </select> select something in choice1. quickly tap choice2 before onblur1 is logged. At the timing of onblur1 the selection menu for choice2 is dismissed. Anyone know how to fix this behavior?
Topic: Safari & Web SubTopic: General Tags:
Replies
2
Boosts
0
Views
427
Activity
Sep ’25
UICollectionView with orthogonal (horizontal) section not calling touchesShouldCancel(in:)
I have a UICollectionView with horizontally scrolling sections. In the cell I have a UIButton. I need to cancel the touches when the user swipes horizontally but it does not work. touchesShouldCancel(in:) is only called when swiping vertically over the UIButton, not horizontally. Is there a way to make it work? Sample code below import UIKit class ConferenceVideoSessionsViewController: UIViewController { let videosController = ConferenceVideoController() var collectionView: UICollectionView! = nil var dataSource: UICollectionViewDiffableDataSource <ConferenceVideoController.VideoCollection, ConferenceVideoController.Video>! = nil var currentSnapshot: NSDiffableDataSourceSnapshot <ConferenceVideoController.VideoCollection, ConferenceVideoController.Video>! = nil static let titleElementKind = "title-element-kind" override func viewDidLoad() { super.viewDidLoad() navigationItem.title = "Conference Videos" configureHierarchy() configureDataSource() } } extension ConferenceVideoSessionsViewController { func createLayout() -> UICollectionViewLayout { let sectionProvider = { (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(1.0)) let item = NSCollectionLayoutItem(layoutSize: itemSize) // if we have the space, adapt and go 2-up + peeking 3rd item let groupFractionalWidth = CGFloat(layoutEnvironment.container.effectiveContentSize.width > 500 ? 0.425 : 0.85) let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(groupFractionalWidth), heightDimension: .absolute(200)) let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) let section = NSCollectionLayoutSection(group: group) section.orthogonalScrollingBehavior = .continuous section.interGroupSpacing = 20 section.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20) return section } let config = UICollectionViewCompositionalLayoutConfiguration() config.interSectionSpacing = 20 let layout = UICollectionViewCompositionalLayout( sectionProvider: sectionProvider, configuration: config) return layout } } extension ConferenceVideoSessionsViewController { func configureHierarchy() { collectionView = MyUICollectionView(frame: .zero, collectionViewLayout: createLayout()) collectionView.translatesAutoresizingMaskIntoConstraints = false collectionView.backgroundColor = .systemBackground view.addSubview(collectionView) NSLayoutConstraint.activate([ collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor), collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor), collectionView.topAnchor.constraint(equalTo: view.topAnchor), collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) collectionView.canCancelContentTouches = true } func configureDataSource() { let cellRegistration = UICollectionView.CellRegistration <ConferenceVideoCell, ConferenceVideoController.Video> { (cell, indexPath, video) in // Populate the cell with our item description. cell.buttonView.setTitle("Push, hold and swipe", for: .normal) cell.titleLabel.text = video.title } dataSource = UICollectionViewDiffableDataSource <ConferenceVideoController.VideoCollection, ConferenceVideoController.Video>(collectionView: collectionView) { (collectionView: UICollectionView, indexPath: IndexPath, video: ConferenceVideoController.Video) -> UICollectionViewCell? in // Return the cell. return collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: video) } currentSnapshot = NSDiffableDataSourceSnapshot <ConferenceVideoController.VideoCollection, ConferenceVideoController.Video>() videosController.collections.forEach { let collection = $0 currentSnapshot.appendSections([collection]) currentSnapshot.appendItems(collection.videos) } dataSource.apply(currentSnapshot, animatingDifferences: false) } } class MyUICollectionView: UICollectionView { override func touchesShouldCancel(in view: UIView) -> Bool { print("AH: touchesShouldCancel view \(view.description)") if view is MyUIButton { return true } return false } } final class MyUIButton: UIButton { } class ConferenceVideoCell: UICollectionViewCell { static let reuseIdentifier = "video-cell-reuse-identifier" let buttonView = MyUIButton() let titleLabel = UILabel() override init(frame: CGRect) { super.init(frame: frame) configure() } required init?(coder: NSCoder) { fatalError() } } extension ConferenceVideoCell { func configure() { buttonView.translatesAutoresizingMaskIntoConstraints = false titleLabel.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(buttonView) contentView.addSubview(titleLabel) titleLabel.font = UIFont.preferredFont(forTextStyle: .caption1) titleLabel.adjustsFontForContentSizeCategory = true buttonView.layer.borderColor = UIColor.black.cgColor buttonView.layer.borderWidth = 1 buttonView.layer.cornerRadius = 4 buttonView.backgroundColor = UIColor.systemPink let spacing = CGFloat(10) NSLayoutConstraint.activate([ buttonView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), buttonView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), buttonView.topAnchor.constraint(equalTo: contentView.topAnchor), titleLabel.topAnchor.constraint(equalTo: buttonView.bottomAnchor, constant: spacing), titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), titleLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor) ]) } }
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
1
Boosts
0
Views
140
Activity
Jun ’25
CoreMediaErrorDomain error -42709
We are getting reports from customers that they are not able to play videos in our app after updating their phones to iOS18.3.1. (Further checking indicates that it happens on all iOS18 versions. It suddenly started occurring from February 18th, 2025) When checking logs we see that playback is failing due to CoreMediaErrorDomain error -42709. This is an undocumented error code and hence we do not know the cause of the playback issue. Does anyone know what this error code means and how the app should handle it? Reported as FB16638501.
Replies
10
Boosts
3
Views
2.3k
Activity
Mar ’25
UIWindow:s windowLevel in relation to _MRUIPlatterOrnamentBackingWindow
While debugging a UIKit based app for visionOS we discovered this "magical" _MRUIPlatterOrnamentBackingWindow window that: Sets itself as the UIWindowScene.keyWindow Is not included in UIWindowScene.windows Has a windowLevel of 0 (normal) but is still in front of any other UIWindow in the scene. Is there any way to make other UIWindows appear in front?
Replies
4
Boosts
0
Views
672
Activity
Jun ’24
Test In-App purchase on AdHoc build
Hi,In the documentation it says you must use a sandbox account when testing In-App purchase using the Sandbox.But I just noticed that (currently on 10.3 release) the StoreKit popup is saying "Sandbox" even when using a normal account but the app is an AdHoc build.Is this expected that a normal account also uses the "Sandbox" when running a AdHoc distribution build?Thanks in advance,Anders
Replies
3
Boosts
0
Views
5k
Activity
Sep ’23
AVPlayer and Cookie Expiration
Hi,I have some questions about how AVPlayer handles updates of a cookie's expiration time.We do something like this:1) Send a GET request to server which sets authentication cookie. This cookie has a short expiration time, CookieExpiryTime.2) Start AVPlayer. The authentication cookie is included in the AES key request.3) Every n minutes (where n is CookieExpiryTime/2), send new GET request to authentication server to get updated cookie expiration time. By logging all cookies in NSHTTPCookieStorage.sharedHTTPCookieStorage() we can see that the expiration time of the cookie is updated.The problem:When a key is requested after the expiration time of the first cookie from 1), the cookie is no longer included in the AES key request.But shouldn't the updated cookie (with extended expiration time) be considered?Question 1) Does AVPlayer filter out expired cookies when doing the AES key requests?Question 2) Does AVPlayer check NSHTTPCookieStorage.sharedHTTPCookieStorage() for updated cookies after init?Thanks,Anders
Replies
1
Boosts
0
Views
1.7k
Activity
Apr ’22