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.

Posts under General subtopic

Post

Replies

Boosts

Views

Activity

How to Share and Access Dynamically Updating Data Across Different Targets?
I have a app with two targets: a main DeviceActivityApp target and a DeviceReport target. In the DeviceReport target, I have a TotalActivityReport struct conforming to DeviceActivityReportScene. Inside its makeConfiguration method, I update a dynamically generated list of AppReport items. The list updates correctly in the DeviceReport target. // Define which context your scene will represent. let context: DeviceActivityReport.Context = .totalActivity // Define the custom configuration and the resulting view for this report. let content: (MonitorDeviceReport) -> TotalActivityViewFirst @ObservedObject var activityData:ActivityData func makeConfiguration(representing data: DeviceActivityResults<DeviceActivityData>) async -> MonitorDeviceReport { // Reformat the data into a configuration that can be used to create // the report's view. var appList:[AppsReport]=[] let totalActivityDuration = await data.flatMap { $0.activitySegments }.reduce(0, { $0 + $1.totalActivityDuration }) for await _data in data{ for await activity in _data.activitySegments{ for await category in activity.categories{ for await app in category.applications{ let name=app.application.localizedDisplayName ?? "No Name" let bundleId=app.application.bundleIdentifier ?? "nil" let duration=app.totalActivityDuration let appIcon=app.application.token let app=AppsReport(id:bundleId,duration:duration, name:name, icon:appIcon) appList.append(app) } } } } DispatchQueue.main.async { activityData.list=appList } return MonitorDeviceReport(duration:totalActivityDuration, apps:appList) } } public class ActivityData:ObservableObject{ @Published var list:[AppsReport]=[] public static let shared = ActivityData() }. // This is in MonitorReport target However, I need to access this dynamic list in my MyApp target, specifically in ContentView.swift. I tried using an ObservableObject (ActivityData) to share the data between targets, but the list always appears empty in the MyApp target. Here’s what I’ve tried so far: Created a shared ActivityData instance using @Published Passed the ActivityData instance to TotalActivityReport Used dependency injection and a singleton pattern for ActivityData Verified that makeConfiguration updates the list correctly in DeviceReport What could I be missing? How can I correctly share and access this data across targets?
0
0
395
Nov ’24
Can the Bundle ID Impact the Loading Time of a Pod/Framework?
Recent Incident with SDKAnalytics Version 11.11.4 We recently released version 11.11.4 of SDKAnalytics for use in the SuperApp. This update introduced several significant changes since the last generated version, 11.11.0. The previous version's primary change was the migration of the integration pipeline and its identifier from OQ6 to FW6. Additionally, we performed refactoring and adjustments to the project's configurations. In SDKAnalytics, we use XcodeGen to simplify project setup and minimize conflicts. We also rely on CocoaPods to create and manage our Pods/Frameworks. The SuperApp, where SDKAnalytics is implemented, operates as a centralized ecosystem. Its products and user journeys are segregated into Pods/Frameworks, distributed across multiple repositories, following a multi-repo structure. Currently, the app includes over 300 Pods. Starting from version 11.11.1 of our SDK, we implemented some important project changes. However, when we released version 11.11.4, which included a new feature for the SuperApp, we encountered a critical issue. Incident Overview All SDKs implemented in the SuperApp have their loading times monitored. After updating SDKAnalytics from version 11.11.0 to 11.11.4, the loading time spiked from 200 ms to 3000 ms. Faced with this significant impact, we launched a task force to investigate and resolve the issue. Investigation and Diagnosis After several days of investigation, we carefully reviewed the numerous pull requests merged between versions 11.11.0 and 11.11.4. As a strategy, we reverted the project.yml configurations from version 11.11.4 to match those of version 11.11.0. This rollback resolved the loading time issue, indicating that the problem stemmed from the project's configuration. Upon deeper analysis, we identified the culprit: a single line of configuration. The Bundle ID for the SuperApp follows the pattern com.companyname.enterprise. However, in version 11.11.4, SDKAnalytics adopted a new Bundle ID format: com.companyname.SDKAnalytics. This change directly impacted the SDKAnalytics loading time when implemented in the SuperApp. Solution To resolve the issue, we reverted this configuration. We modified the Bundle ID for SDKAnalytics to br.com.SDKAnalytics, removing the com.companyname prefix. After this change, the loading time returned to normal. Reflection The lingering question remains: What is the logical explanation for this discrepancy in loading time caused by the Bundle ID configuration? This behavior is unexpected, and we plan to investigate further to understand the underlying technical reasons.
0
1
451
Nov ’24
Updating Widget from App Intent called by Live Activity is inconsistent
(Also have a case ID, 9879068) We have an app that user use to check in/out from work for example. We have a button in-app do do this. Now I'm trying to add buttons to our widgets and our new live activity so that users don't have to open the app. It's crucial that the live activity and widgets always show the exact same state. Otherwise it'll look pretty bad if a user has both a live activity and a widget showin at the same time. However, we have noticed that sometimes, pressing the button in the live activity, running the app intent, will not always make the widget update (we call reloadAllTimelines()). The other way around, i.e. press the button on widget to update live activity always works. (they both call the same app intent) When running it in debug mode on a phone from Xcode, it always works, but when running it just on the phone it's unreliable. My first thought was, of course, that's related to the widget "budget", but according to the docs HERE, it should not be applied when interacting with a widget, calling an app intent. My question: HOW can I make my widget reliably refresh using an app intent invoked from a live activity?? I have a ready small project with simple buttons and trace labels that display this issue that I'm happy to supply to someone.
6
1
848
Nov ’24
Worst update to photos app ever
iOS 18 is the worst update to the Apple photos app ever. There was nothing wrong with iOS 17 photos app. You guys took a perfectly usa and funtio app and thought of myriad different ways to make it less intuitive and usable. Why even mess with the favorites pictures album. You have to scroll down/up scroll through your favorites when for your regular pictures you have to swipe up/down to scroll. Completely nonsensical. ios 18 is a downgrade to the photos app in e way
2
1
848
Nov ’24
ios18 Beta Skipping Podcast Episodes
Been enjoying the ios18 Beta. Wanted to provide something I noticed since upgrading to the Beta. When I stop an episode midway through and add the episode back to my queue, my phone now skips the episode as already played. So i either miss the rest of the episode, if I don’t catch it, or have to go back and reset it, to hear the partially finished episode. Hopefully this can be addressed in future updates! :)
2
0
528
Nov ’24
Evidently I'm not generating API tokens right.
I'm trying (in Swift) to use CryptoKit to generate the required JWT for the Apple Music Web API, as documented (sort of) here. But I'm getting 401s no matter what I try. I found some examples of generating JWTs online, but something isn't working here. I've set up my identifiers and gotten an API secret through my account in the dev portal. It's associated with an identifier requesting Music API access (I requested all three available Music-related capabilities). For the secret, I'm using the long key string from the .p8 file I generated and downloaded from the dev portal. Here's what I've tried: struct APIToken { struct Header: Encodable { let alg = "HS256" let kid: String } struct Payload: Encodable { let iss: String let iat: String let exp: String } static func tokenize(keyID: String, issuerID: String, secret: String) -> String { let privateKey = SymmetricKey(data: Data(secret.utf8)) let headerJSONData = try! JSONEncoder().encode(Header(kid: keyID)) let headerBase64String = headerJSONData.base64EncodedString() let currUnixTime = Int(Date().timeIntervalSince1970) let expUnixTime = currUnixTime + 5 * 2628288 // five months of seconds let payloadJSONData = try! JSONEncoder().encode(Payload(iss: issuerID, iat: "\(currUnixTime)", exp: "\(expUnixTime)")) let payloadBase64String = payloadJSONData.base64EncodedString() let toSign = Data((headerBase64String + "." + payloadBase64String).utf8) let signature = HMAC<SHA256>.authenticationCode(for: toSign, using: privateKey) let signatureBase64String = Data(signature).base64EncodedString() let token = [headerBase64String, payloadBase64String, signatureBase64String].joined(separator: ".") print(token) return token } } I also tried making sure the base64 strings are URL-safe with this extension: extension Data { func URLSafeBase64EncodedString() -> String { return base64EncodedString() .replacingOccurrences(of: "+", with: "-") .replacingOccurrences(of: "/", with: "_") .replacingOccurrences(of: "=", with: "") } } but that made no difference. All the documentation says is A decoded developer token has the following format. { "alg": "ES256", "kid": "ABC123DEFG" } { "iss": "DEF123GHIJ", "iat": 1437179036, "exp": 1493298100 } After you create the token, sign it with your MusicKit private key using the ES256 algorithm. Am I not doing that? Any insight appreciated.
0
0
486
Nov ’24
iOS 18.0 and above systems, Control Center Video Effects bug
我的app不是VOIP应用,使用iPad10或者iPad13.18等支持人物居中的设备,系统是iOS18.0,18.1或者18.1.1,进入直播课中,控制中心不显示"人物居中"按钮,必现的,如下图。但是项目中Background Modes勾选Voice over IP,再次运行app,就不会再复现,即便是卸载重装也不会再复现。麻烦帮忙看看什么原因?谢谢
0
0
365
Nov ’24
How to expand Call Directory Extension capacity for adding more than 2_000_000 entries?
I've found an app that has a call blocking feature an is able to add more than 10_000_000 entries. As I understand it doesn't use more than one extension for it because I see only one in the Call Blocking & Identifying settings menu. How to implement that? My limit now is around 1_800_000 entries.
0
0
437
Nov ’24
Disable Scribble in UITextView
There are use cases where someone who's using an Apple Pencil may not want to enter text via Scribble. A simple example is writing "UIViewController" in a text view is unlikely to be successful. I'd like to disable Scribble in this case and let the keyboard become the input mechanism. (Disabling Scribble system-wide in Settings is both cumbersome and overkill.) The closest I can come to making this happen is by adding a UIScribbleInteraction on a UITextView and returning false when scribbleInteraction(shouldBeginAt:) is called. This disables Scribble on the text view, and prevents writing from being converted into text, but the input widget still appears on screen and isn't very useful. Here is a sample project that demonstrates the problem: http://files.iconfactory.net/craig/bugs/Scribbler.zip Hopefully, I'm doing something wrong here. If not, I'm happy to submit this as a FB. -ch
3
0
3.2k
Nov ’24
CA certificate is not trusted on iOS 18 and iPadOS 18
Hi everyone, I have an iPad with iOS 18 and used my old device to sync data. There is a trusted CA certificate on my old device. After device data synchronization, the certificate was not synchronized on the iPad. When I tried to manually install the CA certificate on my iPad, it was not in the device's certificate trust settings. Environment • iOS Version: iOS 18 • Device: iPad mini 5 Thank you
1
3
737
Nov ’24
IOS 18.1.1 CarPlay
After upgrading to IOS 18.1.1 CarPlay became terrible. During music playback via USB cable the subwoofer stopped working. Bass is not heard. Sound became very poor. It is impossible to exit CarPlay by pressing the button on the multimedia. if I Disconnect the cable from the phone - the multimedia (radio) works fine again and the subwoofer works normally. CarPlay blocks pressing the keys on the multimedia system. Also it is not possible to update the multimedia, because multimedia menu is inaccessible. When I connect the phone via Bluetooth the timer on the multimedia screen immediately starts, as if I am talking on the phone to somebody. Sound quality via Bluetooth is even worse than via USB. Listening to music (the main function) has become impossible. Please fix this problem. Thank you very much!
3
2
1.1k
Nov ’24
Contact Provider Extension via Managed App (MDM) = managed contacts?
When using Mobile Device Management (MDM), it is possible to restrict access to contacts on managed devices. Please see https://support.apple.com/en-us/101932 According to this article, contacts are considered "managed" if they come from either a managed app or a managed account. Does this principle also apply when an MDM-managed app provides contacts via the Contact Provider Extension (CPE)? Specifically, would such "managed" contacts remain inaccessible to unmanaged apps? Our goal is to ensure that unmanaged apps cannot access these contacts. Thanks!
0
1
244
Nov ’24
siri crash
Question: A very small number of users experience this crash: NSInternalInconsistencyException:Use of the class INVocabulary requires the entitlement com.apple.developer.siri. Make sure you have enabled the Siri capability in your Xcode project. But our project definitely has siri configured to be available. During app startup, calling the following code causes a crash: INVocabulary *vocabulary = [INVocabulary sharedVocabulary]; Now that we can't figure it out, is it a bug in the system?
0
0
284
Nov ’24
Live Activity Widget -
Hi, I'm developing a Live Activity Widget that shows a count down timer. In the current solution I have a stop watch that is responsible for handling the start, stop, resume, reset function. When the stop watch starts I have timer that calls on an updateTime function every 0.2 seconds. This works well. The problems comes when I try to use my stop watch in the Live Activity Widget. I have a timer that updates the live activity attributes with content every 0.5 second. // Start the activity let activity = try? Activity.request(... DispatchQueue.main.async { self.logger.log("Start internal timer") self.timer = Timer.scheduledTimer(withTimeInterval:0.5, repeats: true) { _ in self.logger.log("Update activity widget.") self.updateActivity() } } Is this a correct approach? If not what should I use to implement a stop watch with a count down timer and a corresponding progress bar/view?
2
0
873
Nov ’24
Widget not showing in "Widget Gallery"
Our app's widget often doesn't show up in the "Widget Gallery". Lots of our users complain about this issue. They can't see the widget in widget gallery after opening the app. In some cases, the widget does not appear in the widget gallery even after turning the phone off and on. I saw in another question that this is a bug. This bug will be fixed someday, but is there anything we can do before that?
3
0
2.1k
Nov ’24
Live Caller ID Extension -
I am currently working on implementing the Live Caller ID Extension for my iOS app, and I understand that a backend server is required for this functionality. While I’ve gone through Apple’s documentation, the details on the backend setup are limited and not very clear for my backend team to implement it effectively. Could someone provide a more detailed explanation or sample implementation of the backend server required for this extension? Specifically, we are looking for: A clear understanding of the APIs and endpoints the backend needs to expose. Any authentication mechanisms required for communication with the extension. Data format (e.g., JSON structure) for requests and responses. Example code or additional resources, if available. Any help or guidance in understanding the exact backend requirements would be greatly appreciated.
1
0
463
Nov ’24