Posts

Post not yet marked as solved
1 Replies
88 Views
Trying to get the relevant app (it exists and published) by this endpoint: https://api.appstoreconnect.apple.com/v1/bundleIds/{id}/app Receiving error 404: "errors" : [ { "id" : "ec7b1469-fe54-4ad5-9f2b-f665c31a6358", "status" : "404", "code" : "PATH_ERROR_REALTIONSHIP", "title" : "The URL path is not valid", "detail" : "The relationship 'app' does not exist on resource 'bundleIds'" } ] Doing everything according to documentation. Tried to pass both Bundle ID id and Bundle ID itself. What could be the problem?
Posted
by kelin.
Last updated
.
Post not yet marked as solved
8 Replies
863 Views
Hello! I'm working on the watchOS app that provides user with multiple fancy complication sets. There are about 50 widgets in our WidgetBundle now. With this amount we reached memory limit and the app crashes: Thread 1: EXC_RESOURCE (RESOURCE_TYPE_MEMORY: high watermark memory limit exceeded) (limit=15 MB) I inspected complicationExtension.appex content and find out that most volume is occupied by the executable: Localized strings (12 langs) altogether - 165 KB Assets.car - 1.1 MB Imported fonts TTF files altogether - 866 KB complicationsExtension executable file - 8.2 MB Why it takes so much space and how can it be made smaller?
Posted
by kelin.
Last updated
.
Post not yet marked as solved
1 Replies
311 Views
Recently, our team bumped into a crash that we cannot resolve. We looked for help everywhere. I asked people here on forums, team asked about 10 fellow developers and the question on SO was created. Nobody knows the reason for the crash, nobody can find a workaround. So, as the last resort, I called for Apple Technical Support (aka code-level support). I assumed that people there understand how things work under the hood. Considering that this service is limited (2 TSI per year, otherwise paid), I expected the quality to be high. In fact, it didn't help us to resolve the problem, and I was disappointed how irrelevant the provided support could be. TLDR: The dev didn't even open the test project! I described the memory crash with WidgetKit-based complication. I spend my time capturing video, finding watch logs on my iPhone and creating a sample project. I attached console output, stack traces and a couple of screenshots. I even provided a .watchface file, so they can reproduce the configuration. This together took about 6-8 hours of work. I explained what happens in detail: steps to reproduce, what I've tried. I asked the support to recommend me way to present only the specified complications. Then I submitted the issue and started to wait. It took them 1 week to responsd. I pointed my sight on the email with excitement, expecting to finally get the resolution. But what I found there was disappointing. The software engineer, Rico, quoted only a couple of sentences from my list. His letter contained only 4 lines of text (not including greetings and cheers). In the first line he recommended to use preprocessor macro to enable only necessary complications, which is nonsense. Of course we need to change complications dynamically, when the user selects them. I two next lines he recommends to use if statement in WidgetBundle to dynamically unlock the complications. I already knew that it isn't possible. Because, quote: "if statements in a WidgetBundleBuilder can only be used with #available clauses" @available(*, unavailable, message: "if statements in a WidgetBundleBuilder can only be used with #available clauses") public static func buildOptional<W>(_ widget: W?) where W : Widget The last line cancelled everything before, Rico said that this can't be done at runtime. Probably, he added that after reading the documentation, but forgot to edit his previous statements. I didn't give up completely. I decided to skip the design discussions and get the info that Rico could probably have, due to his access to the software. Why the extension using so much memory? I also asked him, if he was able to build the project and reproduce the bug. Another week passed. I'm sending a follow-up message. That worked, after another 3 days I got the response: Finally some useful information! Timeline and views are being archived to disk (all simultaneously), that's why the memory usage is so high. Basically, a widget design issue. But anyway, we have what we have. Then next line, he has written this: "Complications are deprecated". What? But wait, he thinks that we use ClockKit, and recommends migrating to WidgetKit. So Rico completely forgot that we discussed WidgetBundle and SwiftUI before 🤡 He honestly tells me that he didn't open the project. Why? Because "Complications are unlikely to be supported", he says. So he "forgot" WidgetKit on intention, this gave him an excuse to ignore the sample project. My time was invested for nothing! I believe there's no need in further conversation with Rico. I will provide the detailed feedback to the Apple. And I'm posting it publicly to make sure that Rico gets the attention he deserves. If you want to know more technical details about the issue, you can check the following links: https://stackoverflow.com/q/77855303/1746142 https://developer.apple.com/forums/thread/744726
Posted
by kelin.
Last updated
.
Post not yet marked as solved
3 Replies
281 Views
I need to track user actions, for example video view count. Then the data is used to get most popular videos for last 7 days, 30 days and for a year. For this purpose I have created a Downloads table with timestamp and video fields. Each time user opens the catalog, I'm running queries to get Downloads and sort the videos based on them. This is a working, but not the efficient solution. A good option is to add aggregated data table storing summary counts for the popular queries - countFor7Days, etc. This will improve query performance. But it requires a job that would update the aggregate table every day. The question is how to implement this job in CloudKit? Is there are such built-in feature, or I need a custom service running somewhere?
Posted
by kelin.
Last updated
.
Post not yet marked as solved
0 Replies
247 Views
Hi! I wanted to test my app with Xcode and see how it handles network errors. So, in Devices and Simulators I activated Network Link Condition - 100% packet loss. Then I run the app and see the popup saying that it's unable to verify app for obvious reasons: Unable to Verify App An Internet connection is required to verify trust of the developer "Apple Development: Vladimir Kelin (<#teamid#>)". This app will not be available until verified. How do I run the app with network condition, then?
Posted
by kelin.
Last updated
.
Post not yet marked as solved
2 Replies
331 Views
I'm trying to delete many records with one CKModifyRecordsOperation and getting this error: <CKError 0x600000dbe4f0: "Limit Exceeded" (27/1020); "Your request contains 552 items which is more than the maximum number of items in a single request (400)"> This obviously means, that Modify Operation has record limit of 400 which is equal to CKQueryOperation.maximumResults. The good solution here would be to chunk the array of records into subarrays with length less than 400 and add multiple delete operations to the database. The only problem is that the limit for CKModifyRecordsOperation is neither documented nor provided with a constant, so it's basically a magic number. In hope that my prayers would be heard I want to ask to add maximumResults constant to CKModifyRecordsOperation.
Posted
by kelin.
Last updated
.
Post not yet marked as solved
0 Replies
611 Views
Hi! I'm making a workout app for swimmers. Our QA is confused with the swimmingStrokeCount output. He's a sportsmen and when crawl he used to count 2 strokes per cycle, one for each arm. The output is incorrect and looking at numbers we suspect that HKWorkout counts only one arm. Documentation doesn't say anything about it.
Posted
by kelin.
Last updated
.
Post not yet marked as solved
2 Replies
1.1k Views
There is a such method in Bundle: func classNamed(_ className: String) -&gt; AnyClass? The description says it loads the Class object for className. It's, obviously, an Objective-C stuff. I started from Objective-C but didn't used it, preferring NSClassFromString. Now I suddenly tested it in various applications. I was surprised that it doesn't work in iOS apps neither in Playground: import Foundation class TalkingFruit {   func greet() {     print("Hello, playground")   } } @objc class LagacyFruit: NSObject { } print(Bundle.main.classNamed("TalkingFruit") ?? "no class") // no class print(Bundle.main.classNamed("LegacyFruit") ?? "no class") // no class print(Bundle.main.classNamed("NSObject") ?? "no class either") // no class either And now I have a question: Does it even work? And how it's supposed to be used? Working use case example would be great.
Posted
by kelin.
Last updated
.
Post not yet marked as solved
3 Replies
1.3k Views
Hello! I want to clarify the usage scope of auto-renewable subscriptions. The guideline telling us:"If you offer an auto-renewing subscription, you must provide ongoing value to the customer. While the following list is not exhaustive, examples of appropriate subscriptions include: new game levels; episodic content; multi-player support; apps that offer consistent, substantive updates; access to large collections of, or continually updated, media content; software as a service (“SAAS”); and cloud support."So, it's emphasises, that there could be other cases. I want to be sure will my app be approved by the review, or not.My application is an offline business utility. It doesn't provide any cloud services or updating media content. The only reason to use subscriptions is that the app will be consistently updated according to: iOS updates, user suggestions, new features and bug fixes. So it's probably one of "apps that offer consistent, substantive updates", isn't it?What should I write to users and to Apple so that the app will be able to pass review?There are many reasons why I like auto-renewable subscription model, besides 85% revenue. It sufficiently lowers barriers for a user, thanks to the free trial and ability to cancel if the first experience was not satisfying. Moreover, it provides great feedback: looking at subscribed users count I'm able to decide, should I spend more time supporting this application, or should I pay attention to another, more successful aps. I also can release the app earlier, and gradually improve it constantly listening to user feedback. It's better than make a technically ideal paid app that nobody will buy. And I think it just more fair, because todays app are not "fire and forget" products and require continuous maintenance and updates.
Posted
by kelin.
Last updated
.
Post not yet marked as solved
0 Replies
831 Views
What is the process named TestFlightServiceExtension on my iPhone 6S, iOS 14.4? It also can be found in one (1) crash report over the internet. Is this process safe?
Posted
by kelin.
Last updated
.