In my UI test I'm trying to set different languages. I noticed that with right-to-left languages, such as Arabic, the UI is still aligned left-to-right. When I manually run the app with the scheme's language set to Arabic, the UI is correctly aligned right-to-left. Am I missing something?
let app = XCUIApplication()
app.launchArguments += ["-AppleLanguages", "(ar)"]
app.launch()
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I'm using this code to get all apps in App Store Connect:
let jwt = ...
var request = URLRequest(url: URL(string: "https://api.appstoreconnect.apple.com/v1/apps")!)
request.setValue("Bearer \(jwt)", forHTTPHeaderField: "Authorization")
let session = URLSession(configuration: .ephemeral)
let task = session.dataTask(with: request) { data, response, error in
if let error = error {
print(error)
} else if let data = data {
print(String(data: data, encoding: .utf8))
}
}
task.resume()
But the response is an error status: 400, code: ENTITY_INVALID, title: JSON processing failed. What entity is this error referring to? And what JSON is invalid? The JWT token seems to be fine, since when using a random value I get an error 401 NOT_AUTHORIZED.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect API
Tags:
App Store Connect API
I'm using this code to get the path of an executable from the audit token provided in NEFilterDataProvider.handleNewFlow(_:):
private func securePathFromAuditToken(_ auditToken: Data) throws -> String? {
let secFlags = SecCSFlags()
var secCode: SecCode?
var status = SecCodeCopyGuestWithAttributes(nil, [kSecGuestAttributeAudit: auditToken] as CFDictionary, secFlags, &secCode)
guard let secCode = secCode else {
throw SecError(status)
}
var secStaticCode: SecStaticCode?
status = SecCodeCopyStaticCode(secCode, secFlags, &secStaticCode)
guard let secStaticCode = secStaticCode else {
throw SecError(status)
}
var dict: CFDictionary?
status = SecCodeCopySigningInformation(secStaticCode, secFlags, &dict)
guard let dict = dict as NSDictionary? else {
throw SecError(status)
}
if let identifier = dict[kSecCodeInfoIdentifier as String] as? String, let path = NSWorkspace.shared.urlForApplication(withBundleIdentifier: identifier)?.path {
return path
} else if let path = dict[kSecCodeInfoMainExecutable as String] as? String {
return path
}
return nil
}
But it seems that only applications inside the /Applications folder have a non-nil path. For all other executables I have to resort to this code, which I have read is not as secure:
private func insecurePathFromAuditToken(_ auditToken: Data) throws -> String? {
if auditToken.count == MemoryLayout<audit_token_t>.size {
let pid = auditToken.withUnsafeBytes { buffer in
audit_token_to_pid(buffer.baseAddress!.assumingMemoryBound(to: audit_token_t.self).pointee)
}
let pathbuf = UnsafeMutablePointer<Int8>.allocate(capacity: Int(PROC_PIDPATHINFO_SIZE))
defer {
pathbuf.deallocate()
}
let ret = proc_pidpath(pid, pathbuf, UInt32(PROC_PIDPATHINFO_SIZE))
if ret <= 0 {
throw NSError(domain: NSPOSIXErrorDomain, code: Int(errno))
}
return String(cString: pathbuf)
}
return nil
}
This seems to happen with both NEFilterFlow.sourceAppAuditToken and sourceProcessAuditToken. Is this expected? Can it really be that all executables that are not apps shipped with macOS are not signed?
I'm trying to adapt the Filter Network Traffic sample code found at https://developer.apple.com/documentation/networkextension/filtering_network_traffic
In FilterDataProvider.swift I've replaced the argument passed to NEFilterDataProvider.apply(_:completionHandler:) with nil, which according to the documentation should apply the default settings. Instead I'm getting the following error:
Error Domain=NEFilterErrorDomain Code=1 "The settings parameter doesn’t correspond to a NEFilterSettings object" (translated from my local language)
(When logging the error with os_log, the Console app just shows it as <private>. A NSLog call instead displays it correctly.)
After that the internet doesn't seem to work at all anymore and I have to trash the app to make the internet work again. (If the bin is not completely empty before trashing the app from the Applications folder, I'm prompted that there is another operation in progress like moving a file.)
If a nil parameter doesn't work, what is the correct way of not filtering anything, but just observing all the network traffic?
Since NSPathControl.setPathComponentCells(_:) and .clickedPathComponentCell() are deprecated, I'm trying to use pathItems and clickedPathItem instead. Since I'm representing a virtual path, I cannot use the NSPathControl.url setter, but instead set pathItems directly.
The problem is that in the action method it doesn't seem possible to get the index of the clicked path item, nor does it seem possible to associate any kind of data with each path item, since when the action method is called, the actual object instances stored in pathItems and also the one returned by clickedPathItem change every time.
Here is the sample code that reproduces the issue:
class ViewController: NSViewController {
@IBOutlet weak var pathControl: NSPathControl!
override func viewDidLoad() {
super.viewDidLoad()
pathControl.pathItems = ["a", "b", "c"].map({ title in
let item = NSPathControlItem()
item.title = title
return item
})
}
@IBAction func selectPath(_ sender: NSPathControl) {
print(sender.clickedPathItem!.description, sender.clickedPathItem!.title, sender.pathItems.description)
}
}
Here is a sample output (notice how the printed addresses change every time):
<NSPathControlItem: 0x6000012780a0> a [<NSPathControlItem: 0x6000012780a0>, <NSPathControlItem: 0x600001278020>, <NSPathControlItem: 0x600001278090>]
<NSPathControlItem: 0x600001278070> a [<NSPathControlItem: 0x600001278070>, <NSPathControlItem: 0x600001278140>, <NSPathControlItem: 0x6000012780d0>]
<NSPathControlItem: 0x60000124c030> a [<NSPathControlItem: 0x60000124c030>, <NSPathControlItem: 0x60000124c080>, <NSPathControlItem: 0x60000124c070>]
The desired outcome of the code below is that both the red and yellow spheres should be at the same position at the center of the scene, (0, 0, 0), but instead the red sphere remains at its initial position (1, 0, 0). Commenting out any of the lines marked in the code, strangely, solves the issue. The code shows a simplified version of some other code, so it would be desirable to keep the order of the lines as they currently are. Am I doing something wrong?
class GameViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scene = SCNScene(named: "art.scnassets/ship.scn")!
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)
cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light!.type = .omni
lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
scene.rootNode.addChildNode(lightNode)
let scnView = self.view as! SCNView
scnView.scene = scene
let parent0 = SCNNode()
scene.rootNode.addChildNode(parent0)
let parent1 = SCNNode()
scene.rootNode.addChildNode(parent1)
let sphere0 = SCNNode(geometry: SCNSphere(radius: 1))
sphere0.geometry!.firstMaterial!.diffuse.contents = NSColor.red
let sphere1 = SCNNode(geometry: SCNSphere(radius: 1))
sphere1.geometry!.firstMaterial!.diffuse.contents = NSColor.yellow
sphere0.position = SCNVector3(x: -1, y: 0, z: 0) // commenting out this line solves the issue
parent1.addChildNode(sphere0) // or commenting out this line solves the issue
sphere0.position = SCNVector3(x: 0, y: 0, z: 0)
parent0.addChildNode(sphere1) // or commenting out this line solves the issue
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
print(sphere0.worldPosition, sphere1.worldPosition)
}
}
}
I have been trying for several months now to download my Feedback Assistant data on privacy.apple.com. Since the very first time I tried, I keep receiving emails that "because of a technical issue it wasn't possible to download your data and you'll receive a notification as soon as the problem is solved. This procedure can last up to 60 days". And some days later I receive an email "The technical problem is now solved. To get a copy of your data, initiate a new request". I already initiated a new request at least twice, and each time I get the same outcome I just described, i.e. one email tells me the problem is solved, and the next one tells me that there is a problem that will be solved within 60 days. Am I doing something wrong?
SCNBox renders the textures correctly, but SCNCylinder seems to mirror the base and top textures. The following code reproduces the issue (just set the image variable to the name of the image you're using, in this case an image with the number 2 in it):
class GameViewController: NSViewController {
let image = "art.scnassets/image.heic"
override func viewDidLoad() {
super.viewDidLoad()
let scene = SCNScene(named: "art.scnassets/ship.scn")!
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)
cameraNode.position = SCNVector3(x: 0, y: 3, z: 3)
let scnView = self.view as! SCNView
scnView.scene = scene
let node = SCNNode(geometry: SCNCylinder(radius: 0.5, height: 1))
node.geometry!.materials = [SCNMaterial(), SCNMaterial(), SCNMaterial()]
node.geometry!.materials[1].diffuse.contents = image
node.geometry!.materials[2].diffuse.contents = image
node.position.x = -1
node.runAction(.repeatForever(.rotate(by: 1, around: SCNVector3(x: 1, y: 0, z: 0), duration: 1)))
scene.rootNode.addChildNode(node)
let node2 = SCNNode(geometry: SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0))
node2.geometry!.materials = [SCNMaterial(), SCNMaterial(), SCNMaterial(), SCNMaterial(), SCNMaterial(), SCNMaterial()]
node2.geometry!.materials[4].diffuse.contents = image
node2.geometry!.materials[5].diffuse.contents = image
node2.position.x = 1
node2.runAction(.repeatForever(.rotate(by: 1, around: SCNVector3(x: 1, y: 0, z: 0), duration: 1)))
scene.rootNode.addChildNode(node2)
cameraNode.look(at: SCNVector3(x: 0, y: 0, z: 0))
}
}
When Xcode shows a warning to update the project settings, it wants to set the deployment target of every target to RECOMMENDED_MACOSX_DEPLOYMENT_TARGET, which seems to be 10.14.6. Why is this value recommended, when the minimum supported version ist 10.13, which has just been raised from 10.10 with Xcode 14?
Is this a bug, or does it indicate that I'm using this function in the wrong way?
What does this warning mean? In my main app, whenever this warning is logged, the outline view begins to behave weirdly after that, overlapping rows and not responding to clicks anymore. When not using automatic row heights or group rows, the warning doesn't appear anymore.
A sample project can be found here.
An interesting thing is that even if there are no group rows, simply implementing the data source method
func outlineView(_ outlineView: NSOutlineView, isGroupItem item: Any) -> Bool {
return false
}
makes the warning appear.
I tried to update the UISplitViewController in my old iOS project to use the newer column-based API, but noticed that when setting the Style to Double Column in IB from the currently selected Unspecified (Discouraged), the swipe gesture doesn't show and hide the master view controller anymore, even if the option Presents Primary With Gesture is selected. This also happens with a fresh project where I dragged the standard split view controller into the IB canvas as the initial view controller. Is this expected or am I missing something?
Is this possible and how? I've only seen examples about using NSMetadataQuery to search directories for files matching some predicate. I tried using this code
let query = NSMetadataQuery()
query.valueListAttributes = [NSMetadataUbiquitousItemPercentDownloadedKey]
query.predicate = NSPredicate(value: true)
let item = NSMetadataItem(url: url)!
query.searchItems = [item]
NotificationCenter.default.addObserver(forName: .NSMetadataQueryDidUpdate, object: query, queue: nil) { notification in
print(notification)
}
NotificationCenter.default.addObserver(forName: .NSMetadataQueryDidFinishGathering, object: query, queue: nil) { notification in
print(notification)
}
query.start()
but this gives the following exception
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unknown kind of NSPredicate given to NSMetadataQuery (TRUEPREDICATE)'
Without any predicate the query doesn't seem to start at all, like mentioned in the official documentation.
I'm trying to implement a regular expression search in a UITextView with the UITextView.findInteraction introduced in iOS 16. The documentation shows a UIFindInteraction.optionsMenuProvider property and reads
You use this closure to modify, augement or omit options from the default set available in UITextSearchOptions.
But it's not clear how to actually modify the UITextSearchOptions, and where these options are even stored. And how would I omit options? How can the UIActions passed as the only argument to UIFindInteraction.optionsMenuProvider be distinguished from one another?
My app update won’t be accepted because apparently it contains a bug that causes a crash that I cannot reproduce. The review team uploaded a crash report on App Store Connect on September 27th, 2022, but ever since downloading it was not possible because of an App Store Connect bug. The corresponding Feedback Assistant report is also still open. So my update has now been held in queue for almost 4 months. Can anybody please speed this up? This is unacceptable.