<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ObjC_Coder</title>
    <description>The latest articles on DEV Community by ObjC_Coder (@objc_coder).</description>
    <link>https://dev.to/objc_coder</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3572348%2F97d63daf-0f57-437a-9833-dcc02bc04271.png</url>
      <title>DEV Community: ObjC_Coder</title>
      <link>https://dev.to/objc_coder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/objc_coder"/>
    <language>en</language>
    <item>
      <title>How to Publish to App Store Without a Mac? Cross-platform Toolchain Solutions and Operation Log</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Fri, 07 Aug 2026 05:12:00 +0000</pubDate>
      <link>https://dev.to/objc_coder/how-to-publish-to-app-store-without-a-mac-cross-platform-toolchain-solutions-and-operation-log-2h4n</link>
      <guid>https://dev.to/objc_coder/how-to-publish-to-app-store-without-a-mac-cross-platform-toolchain-solutions-and-operation-log-2h4n</guid>
      <description>&lt;p&gt;Anyone doing iOS development knows that Xcode is Apple's official IDE and runs only on macOS. If you want to submit a version to the App Store, you previously had almost no choice: either buy a Mac or wrestle with Hackintosh or remote Mac setups.&lt;/p&gt;

&lt;p&gt;But in reality, many teams or individual developers do not have access to a Mac at all times. A team might have only one or two Macs for signing and packaging, while others develop on Windows; or you use cross-platform frameworks like Flutter or uni-app, where the entire build process is already done on CI, and only the IPA upload step is still blocked by the Mac environment.&lt;/p&gt;

&lt;p&gt;Can this step be bypassed? Yes, by combining several tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations of Traditional Solutions
&lt;/h2&gt;

&lt;p&gt;Let's look at several common approaches from the past.&lt;/p&gt;

&lt;p&gt;Hackintosh involves installing macOS on a PC, giving you the full Xcode experience. However, driver compatibility requires time and effort, you dare not upgrade the system version casually, and reinstalling after hardware changes is costly. If you only need occasional version updates, maintaining a dedicated Hackintosh offers poor cost-effectiveness.&lt;/p&gt;

&lt;p&gt;Renting a remote Mac — services like MacInCloud or MacStadium — is paid by the hour and operated via remote desktop. In practice, network latency affects efficiency, and long-term rental costs are not low; monthly fees can quickly equal a used Mac mini.&lt;/p&gt;

&lt;p&gt;The virtual machine approach has a more direct problem: Apple's EULA prohibits macOS from running on non-Apple hardware. Even if you ignore compliance, macOS under VMware performs poorly, and compilation and signing often produce unexplained errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decoupling Build and Upload
&lt;/h2&gt;

&lt;p&gt;Let's sort out the App Store submission process: code development, Archive packaging, signing, uploading IPA, filling in metadata, and submitting for review. The steps that truly depend on macOS are signing and uploading, because codesign and Application Loader are locked into the Apple ecosystem.&lt;/p&gt;

&lt;p&gt;If you decouple signing and uploading from Xcode, the problem becomes simpler. A viable combination is: complete code building on Windows, then use cross-platform tools for certificate application and IPA upload.&lt;/p&gt;

&lt;p&gt;iOS development and distribution certificates can be generated on Windows. The certificate management module in Appuploader provides creation functions; you input a certificate name, email, and password, and it directly generates a .p12 certificate file without requiring Keychain access. Provisioning profiles can also be created in the same interface, automatically generating a .mobileprovision file after associating an App ID and certificate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operation Process
&lt;/h2&gt;

&lt;p&gt;Let's walk through the practical steps using a Windows environment as an example.&lt;/p&gt;

&lt;p&gt;Step 1: Prepare certificates. Open Appuploader and go to Certificate Management. Select iOS Distribution as the type, enter a name and your Apple ID email. The tool will call the Apple Developer backend API to generate the certificate. Download and save the .p12 file.&lt;/p&gt;

&lt;p&gt;Step 2: Create a provisioning profile. In the profile management section, click Create, associate the App ID and the previously generated certificate, and the system will generate a .mobileprovision file.&lt;/p&gt;

&lt;p&gt;Step 3: Sign. A Flutter project on Windows runs &lt;code&gt;flutter build ipa --release&lt;/code&gt; to generate an unsigned IPA. Use a signing tool to import the certificate and provisioning profile to complete the signing.&lt;/p&gt;

&lt;p&gt;Step 4: Upload. In Appuploader's IPA upload module, select the signed file, enter the Apple ID app-specific password (which must be generated at appleid.apple.com), and click Upload. The upload progress is displayed in real time, and after completion, the build version can be seen in App Store Connect.&lt;/p&gt;

&lt;p&gt;Step 5: Batch upload screenshots and metadata. App Store screenshots and localized descriptions are one of the most time-consuming parts of preparing a release. Appuploader supports submitting screenshots and descriptions for multiple languages at once, and in-app purchases can also be managed together.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD Integration
&lt;/h2&gt;

&lt;p&gt;If your project already uses GitHub Actions or Jenkins for automated builds, you can integrate this process as well. Appuploader provides a command-line tool &lt;code&gt;appuploader_cli&lt;/code&gt; that can complete uploads by passing parameters in a CI script to specify account, password, and IPA file path.&lt;/p&gt;

&lt;p&gt;A typical GitHub Actions workflow: execute &lt;code&gt;flutter build ipa&lt;/code&gt; on a Windows runner, then use appuploader_cli to push the IPA. Fastlane's pilot command can be used for TestFlight distribution, and Transporter (Apple's official cross-platform upload tool) can also perform similar uploads. However, Transporter only handles uploads and does not manage certificates or provisioning profiles. Tool selection doesn't have to be either/or: Fastlane handles version number increments and TestFlight distribution, while Appuploader handles certificate management and IPA uploads — each does its own part.&lt;/p&gt;

&lt;p&gt;It should be noted that this solution is not intended to replace the role of a Mac in iOS development. Full Xcode project debugging and Instruments performance analysis are still recommended on macOS. However, if your primary scenario is continuous delivery of version updates, or not everyone on the team has a Mac, then decoupling macOS from the upload step can indeed reduce dependence on Mac hardware.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Complete Guide to Publishing uni-app on iOS (No Mac Required)</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Thu, 30 Jul 2026 03:24:38 +0000</pubDate>
      <link>https://dev.to/objc_coder/complete-guide-to-publishing-uni-app-on-ios-no-mac-required-474a</link>
      <guid>https://dev.to/objc_coder/complete-guide-to-publishing-uni-app-on-ios-no-mac-required-474a</guid>
      <description>&lt;p&gt;In mobile development, &lt;strong&gt;uni-app&lt;/strong&gt; is widely used for its cross-platform capabilities, but publishing on iOS has always been a headache for Windows users. This article takes Windows environment as an example, combined with the &lt;strong&gt;AppUploader&lt;/strong&gt; tool, to detail the complete process from preparing certificates to uploading to the App Store.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Preparation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Apple Developer Account

&lt;ul&gt;
&lt;li&gt;You need to pay $99/year for the Apple Developer Program.&lt;/li&gt;
&lt;li&gt;Free accounts cannot upload to the App Store, only for testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;uni-app Project

&lt;ul&gt;
&lt;li&gt;Ensure the code is ready for packaging, H5 pages or Vue project compiled.&lt;/li&gt;
&lt;li&gt;Configure &lt;code&gt;manifest.json&lt;/code&gt; with the correct &lt;code&gt;Appid&lt;/code&gt; and app name.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AppUploader Tool

&lt;ul&gt;
&lt;li&gt;Used on Windows to manage certificates, provisioning profiles, Bundle IDs, and IPA uploads.&lt;/li&gt;
&lt;li&gt;Can replace Xcode for iOS publishing operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Create Bundle ID
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open AppUploader → "Bundle ID Management"&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;, enter a unique Bundle ID (e.g., &lt;code&gt;com.company.myapp&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Ensure it matches the AppID in &lt;code&gt;manifest.json&lt;/code&gt;, otherwise packaging will fail.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Febc9chhwvazqlhrp17fo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Febc9chhwvazqlhrp17fo.png" alt="bid" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Bundle ID is the unique identifier for your app in the Apple ecosystem, and it is bound to provisioning profiles and certificates.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Create Certificates
&lt;/h2&gt;

&lt;p&gt;In Windows environment, you can directly use AppUploader to quickly generate certificates without Keychain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Certificate Management&lt;/strong&gt; → Click &lt;strong&gt;New Certificate&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose certificate type:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;iOS App Development&lt;/strong&gt; → For test installation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS Distribution&lt;/strong&gt; → For App Store upload&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Set certificate name and password (for P12 file), save the P12 file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvefzn8vixhxnpi7ic9vv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvefzn8vixhxnpi7ic9vv.png" alt="New Certificate" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AppUploader supports synchronizing certificates across different computers, solving cross-machine issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Generate Provisioning Profile
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Provisioning Profile Management&lt;/strong&gt; → Click &lt;strong&gt;Add Provisioning Profile&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose type:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development&lt;/strong&gt;: For development/test IPA&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Store&lt;/strong&gt;: For release&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bind the previously created certificate and Bundle ID&lt;/li&gt;
&lt;li&gt;If Development type, select test device UDIDs&lt;/li&gt;
&lt;li&gt;Download the generated &lt;code&gt;.mobileprovision&lt;/code&gt; file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1o0gvaaypmcj5u1nrp1q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1o0gvaaypmcj5u1nrp1q.png" alt="Provisioning Profile" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Provisioning profiles must match the certificate and Bundle ID, otherwise packaging and installation will fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Package uni-app Project
&lt;/h2&gt;

&lt;p&gt;In HBuilderX:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open project → &lt;strong&gt;Publish&lt;/strong&gt; → &lt;strong&gt;Native App-Cloud Packaging&lt;/strong&gt; → iOS&lt;/li&gt;
&lt;li&gt;Fill in:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AppID&lt;/strong&gt; (must match Bundle ID)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version number and build number&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Upload certificate and provisioning profile (P12 and mobileprovision generated by AppUploader)&lt;/li&gt;
&lt;li&gt;Generate IPA file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwhp0pkopi3e5hxvik0aj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwhp0pkopi3e5hxvik0aj.png" alt="uni-app packaging" width="786" height="761"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The build number must be incremented each time you upload to the App Store, otherwise it will be rejected.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Test Installation (Optional)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Development certificate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install IPA via USB or QR code scanning&lt;/li&gt;
&lt;li&gt;The device must be added to the provisioning profile&lt;/li&gt;
&lt;li&gt;Trust the developer certificate (Settings → General → Device Management)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Distribution certificate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before uploading to App Store, you can use TestFlight for internal testing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test installation can identify signature or provisioning profile issues early.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Upload to App Store
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;AppUploader CLI&lt;/strong&gt; (Windows/Linux/Mac):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;appuploader_cli upload -f myapp.ipa -u user@apple.com -p xxxx-xxxx-xxxx-xxxx --type ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter description:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Specify IPA file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Apple developer account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;App Store specific password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--type ios&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Specify upload type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After upload, Apple will send a review email; you can check the status in App Store Connect.&lt;br&gt;
If you encounter &lt;code&gt;Metadata validation failed: Deprecated Transporter usage&lt;/code&gt; error, use AppUploader's &lt;strong&gt;new channel&lt;/strong&gt; to upload.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Notes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Certificates and Provisioning Profiles

&lt;ul&gt;
&lt;li&gt;Ensure Distribution certificate matches App Store type provisioning profile&lt;/li&gt;
&lt;li&gt;Development certificate is for testing, includes device UDIDs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bundle ID

&lt;ul&gt;
&lt;li&gt;Must be consistent across packaging, provisioning profile, and Apple Developer backend&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Version Numbers

&lt;ul&gt;
&lt;li&gt;App Store upload requires incrementing the version number or build number for each submission&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Network Environment

&lt;ul&gt;
&lt;li&gt;Use a stable network or mobile hotspot when uploading to avoid timeouts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The entire process requires no Xcode or Mac, enabling iOS publishing, especially suitable for small teams or Windows environment developers.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>iOS Dev Efficiency Tools: My Summarized Tools After 17 Code Changes in One Page Debug</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Wed, 08 Jul 2026 09:54:31 +0000</pubDate>
      <link>https://dev.to/objc_coder/ios-dev-efficiency-tools-my-summarized-tools-after-17-code-changes-in-one-page-debug-597p</link>
      <guid>https://dev.to/objc_coder/ios-dev-efficiency-tools-my-summarized-tools-after-17-code-changes-in-one-page-debug-597p</guid>
      <description>&lt;p&gt;The issue on that page was actually not complicated: a list displayed correctly on an iPhone 13, but when switched to another device, the bottom button was pushed up a few pixels by the safe area. The UI itself had no errors, and the constraints worked fine, but there was a slight offset during scrolling.&lt;/p&gt;

&lt;p&gt;This kind of problem is common in iOS development. What really consumes time is not fixing the logic, but repeatedly verifying. After checking the Git commit history, I found that from initial localization to final confirmation, I had changed the code about 17 times. Each modification required recompilation, running, connecting the device, and confirming the page behavior.&lt;/p&gt;

&lt;p&gt;After that day, I started reorganizing the iOS development efficiency tools I was using.&lt;/p&gt;

&lt;h2&gt;
  
  
  Editors Actually Affect Continuity
&lt;/h2&gt;

&lt;p&gt;When many people first start iOS development, they default to Xcode. It is complete, but as project types increase, a real issue emerges: the code you write in a day is not necessarily all Swift. It might also include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flutter pages&lt;/li&gt;
&lt;li&gt;Shell scripts&lt;/li&gt;
&lt;li&gt;JSON configurations&lt;/li&gt;
&lt;li&gt;Backend API code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore, many developers gradually shift to editors like VSCode. The reason is simple: work context does not require frequent switching. Plugins, shortcuts, Git operations, and terminal logic remain consistent. The editor itself does not reduce bugs, but it affects whether the development process is interrupted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-Device Debugging Is the Most Frequent Development Action
&lt;/h2&gt;

&lt;p&gt;What really takes time is the cycle of: modify code → compile → install to device → check results.&lt;/p&gt;

&lt;p&gt;Page layouts, animations, permissions, push notifications, Bluetooth, camera – these features must be verified on real devices. If this process requires frequent switching of tools, the development rhythm becomes fragmented.&lt;/p&gt;

&lt;p&gt;Therefore, many developers start to pay more attention to toolchain integration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can modifications be built quickly?&lt;/li&gt;
&lt;li&gt;Can the device be directly connected?&lt;/li&gt;
&lt;li&gt;Is additional export needed?&lt;/li&gt;
&lt;li&gt;Is the installation process continuous?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These issues never appear in technical interviews, but they affect development experience every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation Tools Address Repetitive Work
&lt;/h2&gt;

&lt;p&gt;In the later stages of a project, another category of tools becomes important, such as Fastlane, Jenkins, and GitHub Actions. What they do is not mysterious; they essentially automate building, packaging, uploading, and publishing. When these actions need to be repeated dozens of times, people start making mistakes. For example, when a test package needs to be regenerated daily, the value of automation scripts becomes very apparent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compilers Are Also Part of Efficiency Tools
&lt;/h2&gt;

&lt;p&gt;Many developers don't discuss "compilers" separately because in traditional development workflows, they are hidden behind the IDE. But actually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project parsing speed&lt;/li&gt;
&lt;li&gt;Build process&lt;/li&gt;
&lt;li&gt;Architecture choice&lt;/li&gt;
&lt;li&gt;SDK calls&lt;/li&gt;
&lt;li&gt;Installation to device&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these are part of the compilation pipeline. The larger the project, the more developers feel the time cost here.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Recently Noticed a Pretty Interesting Tool
&lt;/h2&gt;

&lt;p&gt;While reorganizing my toolchain recently, I came across an iOS development tool called &lt;strong&gt;Kuaixie (kxapp)&lt;/strong&gt; . What attracted me was not that it "supports writing Swift."&lt;/p&gt;

&lt;p&gt;Instead, it attempts to reintegrate several high-frequency actions in the development process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports Swift, Objective-C, and Flutter projects&lt;/li&gt;
&lt;li&gt;Editor based on VSCode architecture&lt;/li&gt;
&lt;li&gt;Built-in compilation tool suite&lt;/li&gt;
&lt;li&gt;Can run directly on real devices&lt;/li&gt;
&lt;li&gt;Provides app package building capability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key point here is that it does not separate "editing" and "compiling" into two independent environments. After modifying code, you can directly proceed to the build and device verification process. For people who need to frequently debug pages or maintain multiple projects, this design makes it easier to maintain development continuity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of a Tool Is Not Necessarily Reflected in the Number of Features
&lt;/h2&gt;

&lt;p&gt;Often, what makes a tool truly useful is not how powerful it is, but whether it reduces repetitive actions. For example, opening one less window, switching one less environment, executing one less repeated command – these details individually seem minor, but they accumulate.&lt;/p&gt;

&lt;p&gt;Especially when a page requires repeated debugging, developers become increasingly aware of the impact of the toolchain itself on development rhythm.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Generate AppStoreInfo.plist on Mac for App Store Submission</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Mon, 06 Jul 2026 08:00:54 +0000</pubDate>
      <link>https://dev.to/objc_coder/generate-appstoreinfoplist-on-mac-for-app-store-submission-1h9m</link>
      <guid>https://dev.to/objc_coder/generate-appstoreinfoplist-on-mac-for-app-store-submission-1h9m</guid>
      <description>&lt;p&gt;When uploading an IPA to App Store Connect on macOS, a common issue is that the IPA is exported successfully with correct signing and no errors from Xcode Archive, but during the upload phase you get &lt;code&gt;Missing AppStoreInfo.plist&lt;/code&gt; or &lt;code&gt;Could not locate AppStoreInfo.plist&lt;/code&gt;.&lt;br&gt;
Many developers instinctively try to manually create the plist file, copy it from an old project, or unzip the IPA and patch the file.&lt;/p&gt;

&lt;p&gt;This not only fails to solve the problem but also introduces new metadata errors.&lt;/p&gt;

&lt;p&gt;This article directly analyzes where AppStoreInfo.plist is generated and how to avoid manually maintaining it on macOS.&lt;/p&gt;
&lt;h2&gt;
  
  
  The file does not actually exist inside the IPA
&lt;/h2&gt;

&lt;p&gt;Some developers &lt;code&gt;unzip app.ipa&lt;/code&gt; and search for &lt;code&gt;AppStoreInfo.plist&lt;/code&gt; in the Payload directory, only to find it does not exist. This is normal because AppStoreInfo.plist is not part of the app bundle itself.&lt;/p&gt;

&lt;p&gt;It belongs to the upload metadata, not the App Bundle.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why it is missing even on Mac
&lt;/h2&gt;

&lt;p&gt;Many assume that using a Mac guarantees the plist file, but that is not the case.&lt;br&gt;
The following scenarios often cause it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Using command-line upload&lt;/td&gt;
&lt;td&gt;Missing metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom upload script&lt;/td&gt;
&lt;td&gt;Plist not generated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI upload&lt;/td&gt;
&lt;td&gt;Only IPA generated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Xcode upload&lt;/td&gt;
&lt;td&gt;No metadata phase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Why Xcode rarely reports this issue
&lt;/h2&gt;

&lt;p&gt;During the Archive → Export process, Xcode automatically generates metadata and assembles the upload structure, so developers are unaware of it.&lt;/p&gt;
&lt;h2&gt;
  
  
  The real issue is during the upload phase
&lt;/h2&gt;

&lt;p&gt;If the IPA is signed, can be installed, has the correct Bundle ID, but reports a plist error during upload, it means the upload tool lacks the ability to generate metadata.&lt;/p&gt;
&lt;h3&gt;
  
  
  Do not manually create the plist
&lt;/h3&gt;

&lt;p&gt;Some online methods suggest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then manually write the fields. The problem is that Apple metadata fields change, upload protocols update, and different Transporter versions have different structures. Incomplete fields will cause upload failure directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  A simpler approach: auto-generate during upload
&lt;/h3&gt;

&lt;p&gt;On macOS, a more stable method is to let the upload tool automatically generate AppStoreInfo.plist.&lt;/p&gt;

&lt;p&gt;This eliminates the need to maintain the plist, study metadata formats, or manually assemble XML.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using AppUploader CLI to upload
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Tool location
&lt;/h4&gt;

&lt;p&gt;mac version: inside AppUploader.app/runtime/, after entering the runtime, you can use &lt;code&gt;appuploader_cli&lt;/code&gt;. Upload command:&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;appuploader_cli &lt;span class="nt"&gt;--upload-app&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; Payload.ipa &lt;span class="nt"&gt;-u&lt;/span&gt; user@example.com &lt;span class="nt"&gt;-p&lt;/span&gt; xxxx-xxxx-xxxx-xxxx &lt;span class="nt"&gt;--type&lt;/span&gt; ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;appuploader_cli upload &lt;span class="nt"&gt;-f&lt;/span&gt; Payload.ipa &lt;span class="nt"&gt;-u&lt;/span&gt; user@example.com &lt;span class="nt"&gt;-p&lt;/span&gt; xxxx-xxxx-xxxx-xxxx &lt;span class="nt"&gt;--type&lt;/span&gt; ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When uploading via CLI, it automatically parses the IPA, reads the Bundle ID, Version, Build Number,&lt;br&gt;
creates metadata including AppStoreInfo.plist, and then invokes the upload interface to upload to App Store Connect.&lt;/p&gt;
&lt;h2&gt;
  
  
  Command-line is more suitable for long-term projects
&lt;/h2&gt;

&lt;p&gt;If the project already uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fastlane&lt;/li&gt;
&lt;li&gt;Jenkins&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;GitLab CI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GUI upload becomes inconvenient.&lt;/p&gt;

&lt;p&gt;CLI is more suitable for:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Advantage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Automated builds&lt;/td&gt;
&lt;td&gt;Scriptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-project upload&lt;/td&gt;
&lt;td&gt;Easy batch processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote servers&lt;/td&gt;
&lt;td&gt;No GUI dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flutter packaging IPA&lt;/li&gt;
&lt;li&gt;Mac mini as CI node&lt;/li&gt;
&lt;li&gt;Jenkins automatic upload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./appuploader_cli upload &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-f&lt;/span&gt; build/ios/app.ipa &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-u&lt;/span&gt; ci@example.com &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-p&lt;/span&gt; xxxx-xxxx-xxxx-xxxx &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--type&lt;/span&gt; ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Metadata is automatically generated during upload, no manual plist intervention required.&lt;/p&gt;

&lt;p&gt;AppStoreInfo.plist belongs to the metadata generation phase, not the app build phase.&lt;/p&gt;

&lt;p&gt;If the upload tool already supports automatic metadata generation, there is no need to manually maintain the plist file.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>iOS Compiler Independent of Xcode: Detailed Explanation of the kxbuild Tool in kxapp</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Thu, 02 Jul 2026 08:36:56 +0000</pubDate>
      <link>https://dev.to/objc_coder/ios-compiler-independent-of-xcode-detailed-explanation-of-the-kxbuild-tool-in-kxapp-3ed0</link>
      <guid>https://dev.to/objc_coder/ios-compiler-independent-of-xcode-detailed-explanation-of-the-kxbuild-tool-in-kxapp-3ed0</guid>
      <description>&lt;p&gt;In iOS development, compilation is rarely discussed.&lt;/p&gt;

&lt;p&gt;Most of the time, after writing code, you click Run, and the IDE handles the rest. But if you break down this process, many steps occur in between: parsing the project, selecting a target, handling architectures, calling SDKs, generating an executable, and packaging it into an IPA.&lt;/p&gt;

&lt;p&gt;These steps are usually hidden inside Xcode, but once you step away from it, you realize that the entire workflow can exist independently.&lt;/p&gt;

&lt;p&gt;Recently, while looking at an iOS development tool called &lt;strong&gt;Kuaixie (kxapp)&lt;/strong&gt;, I noticed it has a built-in independent compilation tool — &lt;strong&gt;kxbuild&lt;/strong&gt;. Its positioning is straightforward: a compiler that can directly process iOS projects.&lt;/p&gt;

&lt;p&gt;This article mainly discusses what such a tool actually does from the perspective of the compilation process itself.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;What Changes When You Extract Compilation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Consider the simplest scenario: you have an Xcode project.&lt;/p&gt;

&lt;p&gt;In the traditional workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Xcode&lt;/li&gt;
&lt;li&gt;Select a target&lt;/li&gt;
&lt;li&gt;Click Build&lt;/li&gt;
&lt;li&gt;Wait for the application to be generated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Behind these actions, there is actually a series of commands.&lt;/p&gt;

&lt;p&gt;kxbuild's approach is to make these steps explicit, allowing developers to complete builds directly through commands.&lt;/p&gt;

&lt;p&gt;For example, in the project directory, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kxbuild build &lt;span class="nt"&gt;--target&lt;/span&gt; MyApp &lt;span class="nt"&gt;--configuration&lt;/span&gt; Release &lt;span class="nt"&gt;--clean&lt;/span&gt; &lt;span class="nt"&gt;--install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command does several things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selects the build target&lt;/li&gt;
&lt;li&gt;Uses the Release configuration&lt;/li&gt;
&lt;li&gt;Cleans the cache&lt;/li&gt;
&lt;li&gt;Compiles the project&lt;/li&gt;
&lt;li&gt;Installs to the device&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, the process hidden in the IDE is expanded into controllable steps.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How It Recognizes Project Structure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A key question is: how does the compiler understand the project?&lt;/p&gt;

&lt;p&gt;kxbuild supports directly parsing iOS projects, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Xcode projects&lt;/li&gt;
&lt;li&gt;Swift project structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before executing a build, you can view project information using the &lt;code&gt;list&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kxbuild list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command lists the schemes and targets in the current directory.&lt;/p&gt;

&lt;p&gt;If you add the &lt;code&gt;--src&lt;/code&gt; parameter, you can also see the source files in the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kxbuild list &lt;span class="nt"&gt;--src&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This process is equivalent to "reading the project structure" and is the first step of compilation.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Build Parameters: More Detailed Than You Think&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Once the project structure is identified, the next step is to configure build parameters.&lt;/p&gt;

&lt;p&gt;kxbuild provides some options that can be directly controlled, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--target&lt;/code&gt;: Specifies the build target&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--arch&lt;/code&gt;: Selects the architecture (arm64 / x86_64)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--configuration&lt;/code&gt;: Debug or Release&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--clean&lt;/code&gt;: Cleans the cache before building&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--install&lt;/code&gt;: Installs to the device after building&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These parameters also exist in the IDE but usually don't require manual setting.&lt;/p&gt;

&lt;p&gt;When used via the command line, you can control the build behavior more explicitly. For example, when debugging architecture-specific issues, directly specifying &lt;code&gt;--arch&lt;/code&gt; is clearer.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Visibility of SDK and Build Environment&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Another easily overlooked point is the SDK.&lt;/p&gt;

&lt;p&gt;In Xcode, the SDK is implicitly present. But in an independent compiler, you can directly view the available SDKs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kxbuild showsdks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command lists all iOS and simulator SDKs on the system.&lt;/p&gt;

&lt;p&gt;For scenarios where you need to troubleshoot build issues, such as SDK mismatch or version conflicts, this information is essential.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Complete Path from Code to IPA&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Stringing these commands together forms a complete workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify project structure (list)&lt;/li&gt;
&lt;li&gt;Confirm SDK (showsdks)&lt;/li&gt;
&lt;li&gt;Set build parameters (target / arch / configuration)&lt;/li&gt;
&lt;li&gt;Execute build (build)&lt;/li&gt;
&lt;li&gt;Output install package and optionally install to device&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This path is a "click-to-complete" process in the IDE but a "command-driven" process in kxbuild.&lt;/p&gt;

&lt;p&gt;The difference between the two methods is not about capability but about control granularity.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Role of kxbuild in kxapp&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Using a command-line compiler alone has one problem: lack of context.&lt;/p&gt;

&lt;p&gt;Where do you write code? Where do you view debugging? How do you manage devices?&lt;/p&gt;

&lt;p&gt;kxapp's approach is to integrate kxbuild into the IDE, making compilation capability part of the development workflow rather than a standalone tool.&lt;/p&gt;

&lt;p&gt;In this environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code writing is done in the editor (based on VSCode architecture)&lt;/li&gt;
&lt;li&gt;Compilation is executed through kxbuild&lt;/li&gt;
&lt;li&gt;Running can directly connect to devices&lt;/li&gt;
&lt;li&gt;Building can generate install packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thus, a closed loop is formed between the command-line tool and the IDE.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;What Scenarios Are Suitable for This Compilation Method&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;From a usage perspective, this type of tool is more suitable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers who want to directly control the build process&lt;/li&gt;
&lt;li&gt;Scenarios that do not rely on a full IDE&lt;/li&gt;
&lt;li&gt;Workflows that require fast building and app installation&lt;/li&gt;
&lt;li&gt;Cases with clear requirements for build parameters&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>ios</category>
      <category>mobile</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Complete Solution and Toolchain for iOS Cross-Platform Development: Coding and App Store Submission</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Tue, 30 Jun 2026 01:04:23 +0000</pubDate>
      <link>https://dev.to/objc_coder/complete-solution-and-toolchain-for-ios-cross-platform-development-coding-and-app-store-submission-21p9</link>
      <guid>https://dev.to/objc_coder/complete-solution-and-toolchain-for-ios-cross-platform-development-coding-and-app-store-submission-21p9</guid>
      <description>&lt;p&gt;When discussing cross-platform development, it's easy to get stuck on framework choices, such as Flutter, React Native, or uni-app. But when the project actually starts, problems usually arise later, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to handle iOS signing&lt;/li&gt;
&lt;li&gt;How to package without a Mac&lt;/li&gt;
&lt;li&gt;How to upload IPA&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Cross-Platform Frameworks Are Just an Entry Point
&lt;/h1&gt;

&lt;p&gt;First, establish a foundation: cross-platform frameworks solve UI and business logic reuse, not iOS publishing&lt;/p&gt;

&lt;p&gt;Common choices:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Runtime Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Dart compilation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;JS Bridge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uni-app&lt;/td&gt;
&lt;td&gt;WebView / Native&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Whichever you choose, eventually an iOS project (or a project that can build for iOS) will be generated&lt;/p&gt;




&lt;h3&gt;
  
  
  Example (Flutter)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter build ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Example (uni-app)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use HBuilderX cloud packaging to generate an iOS package&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Building Cross-Platform ≠ No Need for Xcode
&lt;/h1&gt;

&lt;p&gt;Even when using cross-platform frameworks, building for iOS still requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certificates&lt;/li&gt;
&lt;li&gt;Provisioning profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Flutter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter build ipa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under the hood, Xcode is still invoked.&lt;/p&gt;

&lt;p&gt;If the signing configuration is incorrect, it will fail directly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Signing Preparation: A Key Watershed for Cross-Platform Projects
&lt;/h1&gt;

&lt;p&gt;This is where many projects get stuck.&lt;/p&gt;

&lt;p&gt;On macOS, you can use Xcode's automatic management, but in cross-platform environments (Windows / Linux), you need to prepare manually.&lt;/p&gt;

&lt;p&gt;You can use &lt;strong&gt;AppUploader&lt;/strong&gt; to generate signing files.&lt;/p&gt;




&lt;h3&gt;
  
  
  Operation Steps
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Create a Certificate
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Open AppUploader&lt;/li&gt;
&lt;li&gt;Enter Certificate Management&lt;/li&gt;
&lt;li&gt;Click Add&lt;/li&gt;
&lt;li&gt;Select distribution&lt;/li&gt;
&lt;li&gt;Set name and password&lt;/li&gt;
&lt;li&gt;Download &lt;code&gt;.p12&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm3h01y7yysdvtc2kxlzq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm3h01y7yysdvtc2kxlzq.png" alt="Create Certificate" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  2. Create a Provisioning Profile
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Enter Provisioning Profile Management&lt;/li&gt;
&lt;li&gt;Create a new App Store type&lt;/li&gt;
&lt;li&gt;Select Bundle ID&lt;/li&gt;
&lt;li&gt;Bind certificate&lt;/li&gt;
&lt;li&gt;Download &lt;code&gt;.mobileprovision&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2w9unz1h4945qe22obp6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2w9unz1h4945qe22obp6.png" alt="Provisioning Profile" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  3. Import into Build Environment
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;macOS → Import into Keychain&lt;/li&gt;
&lt;li&gt;CI → Script import&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Multiple Ways to Build IPA
&lt;/h1&gt;

&lt;p&gt;Cross-platform projects can choose different build methods:&lt;/p&gt;




&lt;h3&gt;
  
  
  Method 1: Local Mac Build
&lt;/h3&gt;

&lt;p&gt;Suitable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Having a Mac device&lt;/li&gt;
&lt;li&gt;Debugging phase&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Method 2: Cloud Build
&lt;/h3&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HBuilderX cloud packaging&lt;/li&gt;
&lt;li&gt;CI (Mac Runner)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbbpu03qrmsvqmb14vwom.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbbpu03qrmsvqmb14vwom.png" alt="HB Packaging" width="786" height="761"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Method 3: Automated Build (Fastlane)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build_app(
  export_method: "app-store"
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;The build result is always:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.ipa&lt;/code&gt; file&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Uploading IPA Can Break Free from macOS Dependency
&lt;/h1&gt;

&lt;p&gt;The upload step can be completely independent.&lt;/p&gt;

&lt;p&gt;On Windows or Linux, you can upload directly.&lt;/p&gt;




&lt;h3&gt;
  
  
  Uploading with AppUploader
&lt;/h3&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Submit Upload page&lt;/li&gt;
&lt;li&gt;Enter Apple ID&lt;/li&gt;
&lt;li&gt;Set app-specific password&lt;/li&gt;
&lt;li&gt;Select IPA file&lt;/li&gt;
&lt;li&gt;Choose upload channel (1 or 2)&lt;/li&gt;
&lt;li&gt;Click Upload
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw3silks83x3iv0gscmce.png" alt="Upload" width="800" height="513"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you encounter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload stuck&lt;/li&gt;
&lt;li&gt;Progress not moving&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can switch channels and upload again.&lt;/p&gt;




&lt;h1&gt;
  
  
  Review and Publishing: No Difference for Cross-Platform Projects
&lt;/h1&gt;

&lt;p&gt;After upload:&lt;/p&gt;

&lt;p&gt;Go to App Store Connect:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7hos6ih7eqvwq6xo6736.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7hos6ih7eqvwq6xo6736.png" alt="ASC" width="800" height="340"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;My Apps → Select App → TestFlight → Build → Submit for Review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prepare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App screenshots&lt;/li&gt;
&lt;li&gt;Privacy policy&lt;/li&gt;
&lt;li&gt;Test account&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  A Common Overlooked Issue in Cross-Platform Development
&lt;/h1&gt;

&lt;p&gt;When modifying the Bundle ID:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The provisioning profile does not update automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Symptom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build succeeds&lt;/li&gt;
&lt;li&gt;No build after upload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recreate the provisioning profile&lt;/li&gt;
&lt;li&gt;Ensure Bundle ID consistency&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cross-platform development solves the problem of writing code once, but the publishing process still follows iOS rules. You can separate signing, building, and uploading. Cross-platform projects are no more complex than native ones when it comes to iOS submission.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Writing Swift in VSCode and Running on iPhone? A Practical Experience with KuaiXie IDE Development</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Wed, 10 Jun 2026 09:50:48 +0000</pubDate>
      <link>https://dev.to/objc_coder/writing-swift-in-vscode-and-running-on-iphone-a-practical-experience-with-kuaixie-ide-development-45lg</link>
      <guid>https://dev.to/objc_coder/writing-swift-in-vscode-and-running-on-iphone-a-practical-experience-with-kuaixie-ide-development-45lg</guid>
      <description>&lt;p&gt;In daily development, VSCode has become the default editor for many people. Writing front-end, scripts, or even back-end services can almost all be done in the same environment. However, when it comes to iOS development, things become different—Swift can be written, but project building, running, and debugging still rely on a complete toolchain.&lt;/p&gt;

&lt;p&gt;Recently, while working on a small feature validation, I attempted to complete the entire process of writing Swift in VSCode, not only writing code but also running it on an iPhone. During this process, I used an iOS development IDE called &lt;strong&gt;KuaiXie&lt;/strong&gt;, which offers an editing experience similar to VSCode while having built-in compilation and debugging capabilities.&lt;/p&gt;




&lt;h3&gt;
  
  
  Creating a Swift Project in a VSCode-like Environment
&lt;/h3&gt;

&lt;p&gt;After opening KuaiXie IDE, the interface structure is quite similar to common code editors. The left side shows the project directory, and the middle is the editing area.&lt;/p&gt;

&lt;p&gt;When creating a project, you can choose different types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swift&lt;/li&gt;
&lt;li&gt;Objective-C&lt;/li&gt;
&lt;li&gt;Flutter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After selecting Swift and entering the project name, the IDE automatically generates the project structure. The directory already includes entry files and basic configurations.&lt;/p&gt;

&lt;p&gt;One difference here is that there is no need to manually configure project files. Once the project is created, you can directly open the code files and start writing Swift.&lt;/p&gt;

&lt;p&gt;If you are used to writing code in VSCode, the learning curve for this step is relatively low.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxcw69gy6v4g8ir9kjig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxcw69gy6v4g8ir9kjig.png" alt="New Project" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Writing Swift in a VSCode-like Editor
&lt;/h3&gt;

&lt;p&gt;During the code editing phase, the experience is essentially writing Swift in an enhanced VSCode environment.&lt;/p&gt;

&lt;p&gt;I created a simple page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A button&lt;/li&gt;
&lt;li&gt;A text label&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clicking the button updates the text content.&lt;/p&gt;

&lt;p&gt;While typing code, the editor provides auto-completion suggestions. For example, when entering UIKit-related classes, it automatically lists available methods. After saving the code, the IDE performs syntax checking.&lt;/p&gt;

&lt;p&gt;If you need to use an AI code assistant, you can directly install VSCode plugins, which is consistent with the daily development environment.&lt;/p&gt;

&lt;p&gt;For developers accustomed to keyboard shortcuts and plugin systems, this editing experience feels quite natural.&lt;/p&gt;




&lt;h3&gt;
  
  
  Running Code on an iPhone
&lt;/h3&gt;

&lt;p&gt;After writing the code, the key question becomes: Can it be directly run on a phone?&lt;/p&gt;

&lt;p&gt;After connecting the iPhone to the computer, execute the build process.&lt;/p&gt;

&lt;p&gt;This process completes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compiling Swift code&lt;/li&gt;
&lt;li&gt;Building the application&lt;/li&gt;
&lt;li&gt;Installing it on the device&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Within seconds, the app icon appears on the phone's desktop. Clicking the icon launches the application.&lt;/p&gt;

&lt;p&gt;In the test project, clicking the button successfully updates the text content, indicating that the code has been executed correctly.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybeufinsvbmu7t6885kx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybeufinsvbmu7t6885kx.png" alt="Running on Phone" width="799" height="205"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Modifying Code and Quickly Validating
&lt;/h3&gt;

&lt;p&gt;During development, code needs constant adjustments.&lt;/p&gt;

&lt;p&gt;I added some processing logic to the button click, then saved the file and clicked run again. The IDE recompiles the application and installs the new version.&lt;/p&gt;

&lt;p&gt;Opening the phone app shows the modified effects.&lt;/p&gt;

&lt;p&gt;The rhythm of this process is quite clear:&lt;/p&gt;

&lt;p&gt;Write code → Run → Modify → Run again&lt;/p&gt;

&lt;p&gt;The entire process does not require switching tools or additional export steps.&lt;/p&gt;




&lt;h3&gt;
  
  
  How Compilation and Running Are Completed
&lt;/h3&gt;

&lt;p&gt;In this workflow, no external development environment is used.&lt;/p&gt;

&lt;p&gt;KuaiXie IDE has a built-in compilation tool suite. When clicking run, the IDE calls internal tools to complete Swift code compilation and application building.&lt;/p&gt;

&lt;p&gt;This is why iOS development can be done in a VSCode-like environment.&lt;/p&gt;

&lt;p&gt;When writing Swift, developers do not need to install Xcode separately or manually configure the compilation environment.&lt;/p&gt;




&lt;h3&gt;
  
  
  Handling Different Projects in the Same Environment
&lt;/h3&gt;

&lt;p&gt;To verify the IDE's capabilities, I created a Flutter project.&lt;/p&gt;

&lt;p&gt;After writing the Flutter page, connecting the device and clicking run, the IDE can complete the build and install the application.&lt;/p&gt;

&lt;p&gt;Subsequently, I tested an Objective-C project, which also compiled and ran normally.&lt;/p&gt;

&lt;p&gt;In the same environment, you can handle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swift projects&lt;/li&gt;
&lt;li&gt;Objective-C projects&lt;/li&gt;
&lt;li&gt;Flutter projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For developers who need to switch between different technology stacks, this approach is quite convenient.&lt;/p&gt;




&lt;h3&gt;
  
  
  Building Installation Packages
&lt;/h3&gt;

&lt;p&gt;After the application development is complete, installation packages need to be generated.&lt;/p&gt;

&lt;p&gt;In KuaiXie IDE, you can generate application installation files through the build function. The IDE executes compilation and outputs the installation package.&lt;/p&gt;

&lt;p&gt;Build logs are displayed in the output panel; if issues arise, you can view detailed information here.&lt;/p&gt;

&lt;p&gt;The generated installation files can be used for test distribution or submission to the app store.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1ibabfwnv4j9v08yq09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1ibabfwnv4j9v08yq09.png" alt="Building" width="799" height="403"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The focus of this test was to verify whether it is feasible to complete Swift development in a VSCode-like environment.&lt;/p&gt;

&lt;p&gt;In KuaiXie IDE, the entire workflow is seamless:&lt;/p&gt;

&lt;p&gt;Create project → Write Swift → Connect device and run → Modify code → Recompile → Build installation package&lt;/p&gt;

&lt;p&gt;The code-writing experience is similar to VSCode, while also having iOS application compilation and running capabilities.&lt;/p&gt;

&lt;p&gt;For developers accustomed to VSCode, this development approach offers a different choice.&lt;/p&gt;

&lt;p&gt;Reference link: &lt;a href="https://kxapp.com/blog/14" rel="noopener noreferrer"&gt;https://kxapp.com/blog/14&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>IPA Upload Rejected Without Clear Reason? Troubleshoot via Provisioning Profile, Certificate, and Bundle ID</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Tue, 09 Jun 2026 10:04:16 +0000</pubDate>
      <link>https://dev.to/objc_coder/ipa-upload-rejected-without-clear-reason-troubleshoot-via-provisioning-profile-certificate-and-1k6e</link>
      <guid>https://dev.to/objc_coder/ipa-upload-rejected-without-clear-reason-troubleshoot-via-provisioning-profile-certificate-and-1k6e</guid>
      <description>&lt;p&gt;Some iOS projects encounter tricky situations after uploading an IPA:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;App Store Connect does not show the build&lt;/li&gt;
&lt;li&gt;Or shows "Processing Failed" without specific reasons&lt;/li&gt;
&lt;li&gt;Email notifications are vague, such as "Invalid Binary"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This type of problem is difficult to pinpoint directly because the error messages do not point to code or specific configurations. In such cases, rather than blindly modifying the project, it's better to adjust the upload approach. Below explains how to handle these issues.&lt;/p&gt;




&lt;h1&gt;
  
  
  First, Confirm Where the Problem Occurs
&lt;/h1&gt;

&lt;p&gt;Upload failure is not a single scenario; it involves at least:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Building the IPA locally or via CI&lt;/li&gt;
&lt;li&gt;Uploading to Apple's servers&lt;/li&gt;
&lt;li&gt;Apple's backend processing the build&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Different stages exhibit different symptoms:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Symptoms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build Stage&lt;/td&gt;
&lt;td&gt;Xcode / Fastlane reports errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload Stage&lt;/td&gt;
&lt;td&gt;Tool reports errors or interrupts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process Stage&lt;/td&gt;
&lt;td&gt;App Store Connect shows no build or processing failure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If the IPA uploads successfully but there is no build record in the backend, the issue usually lies in &lt;strong&gt;signing or package content&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Check if the IPA is Actually a Release Build
&lt;/h1&gt;

&lt;p&gt;A common issue: the uploaded file is actually a Development build.&lt;/p&gt;

&lt;p&gt;Verification method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;unzip -p app.ipa Payload/*.app/embedded.mobileprovision | grep -a "ProvisionedDevices"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the output contains device UDIDs, it indicates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Development provisioning profile is used&lt;/li&gt;
&lt;li&gt;This build cannot be used for the App Store&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A correct App Store build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does not contain a device list&lt;/li&gt;
&lt;li&gt;Provisioning profile type is &lt;code&gt;App Store&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Verify if the Provisioning Profile and Certificate Match
&lt;/h1&gt;

&lt;p&gt;If the provisioning profile and certificate do not match, the upload stage may not report errors, but Apple's processing will fail.&lt;/p&gt;

&lt;p&gt;You can use tools to view provisioning profile content.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;AppUploader (Happy Upload)&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the provisioning profile management&lt;/li&gt;
&lt;li&gt;Import or view the current provisioning profile&lt;/li&gt;
&lt;li&gt;Check the following information:

&lt;ul&gt;
&lt;li&gt;Whether the type is App Store&lt;/li&gt;
&lt;li&gt;Whether the bound certificate is Distribution&lt;/li&gt;
&lt;li&gt;Whether the Bundle ID is consistent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If inconsistencies are found here, you need to regenerate the provisioning profile and repackage.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2g9jnipjp4imz2smz1q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2g9jnipjp4imz2smz1q7.png" alt="View Provisioning Profile" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Check if the Bundle ID Matches the App Store
&lt;/h1&gt;

&lt;p&gt;If the Bundle ID is inconsistent, after upload, you may encounter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build successfully uploaded&lt;/li&gt;
&lt;li&gt;But cannot find it in App Store Connect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the IPA&lt;/li&gt;
&lt;li&gt;View &lt;code&gt;CFBundleIdentifier&lt;/code&gt; in Info.plist&lt;/li&gt;
&lt;li&gt;Compare with the Bundle ID in App Store Connect&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both must be exactly the same.&lt;/p&gt;




&lt;h1&gt;
  
  
  Confirm if the Build Number is Incremented
&lt;/h1&gt;

&lt;p&gt;Apple rejects duplicate version numbers during build processing.&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CFBundleShortVersionString&lt;/code&gt; (version number)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CFBundleVersion&lt;/code&gt; (build number)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the build number has not changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload may succeed&lt;/li&gt;
&lt;li&gt;But no new build will be generated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is recommended to increment the Build number for each build.&lt;/p&gt;




&lt;h1&gt;
  
  
  Repackage and Change the Upload Method
&lt;/h1&gt;

&lt;p&gt;Sometimes the issue is not with the IPA itself, but with the upload method.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload interruptions in certain network environments&lt;/li&gt;
&lt;li&gt;Transporter upload anomalies&lt;/li&gt;
&lt;li&gt;Fastlane deliver timeouts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can try switching upload tools.&lt;/p&gt;

&lt;p&gt;For example, using AppUploader to upload:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the submission upload page&lt;/li&gt;
&lt;li&gt;Set the Apple-specific password&lt;/li&gt;
&lt;li&gt;Select the IPA file&lt;/li&gt;
&lt;li&gt;Switch upload channel (1 or 2)&lt;/li&gt;
&lt;li&gt;Execute the upload&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Different channels use different upload paths, helping to rule out network or interface issues.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdfcbmrr4lwmsyld24xq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdfcbmrr4lwmsyld24xq.png" alt="IPA Upload" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Compare Differences Between Two Builds
&lt;/h1&gt;

&lt;p&gt;If the problem persists, you can perform a "difference comparison."&lt;/p&gt;

&lt;p&gt;Operation method:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep an IPA that was successfully uploaded before&lt;/li&gt;
&lt;li&gt;Extract and compare with the current IPA:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;diff -r old_app new_app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;embedded.mobileprovision&lt;/li&gt;
&lt;li&gt;Info.plist&lt;/li&gt;
&lt;li&gt;Frameworks directory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If differences in signing or resources are found, you can quickly locate the issue. You can also use AppUploader to view IPA files.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mnnngbn13x7zzg58rgf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mnnngbn13x7zzg58rgf.png" alt="View IPA" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;IPA upload rejections without reasons are not without cause; the problem occurs in unseen areas.&lt;/p&gt;

&lt;p&gt;Reference link: &lt;a href="https://www.appuploader.net/blog/228" rel="noopener noreferrer"&gt;https://www.appuploader.net/blog/228&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>New iOS Development Tool Experience: Complete App Development and Real Device Debugging in FastScorpion IDE</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Sat, 06 Jun 2026 09:52:15 +0000</pubDate>
      <link>https://dev.to/objc_coder/new-ios-development-tool-experience-complete-app-development-and-real-device-debugging-in-1i04</link>
      <guid>https://dev.to/objc_coder/new-ios-development-tool-experience-complete-app-development-and-real-device-debugging-in-1i04</guid>
      <description>&lt;p&gt;When working on iOS projects, the development tool largely dictates the daily coding workflow. Factors like whether the editor is user-friendly, the project structure is clear, and device debugging is straightforward are details that repeat throughout the development process.&lt;/p&gt;

&lt;p&gt;Recently, while developing a simple utility app, I tried switching to a different iOS development tool. Instead of continuing with the original development environment, I ran the entire project in the &lt;strong&gt;FastScorpion&lt;/strong&gt; IDE. This project isn't complex in functionality, but the development process covers key stages: project creation, code writing, real device debugging, and app building.&lt;/p&gt;

&lt;p&gt;Below, I document the entire process, mainly discussing the tool's practical performance from a development workflow perspective.&lt;/p&gt;




&lt;h3&gt;
  
  
  Creating a New iOS App Project
&lt;/h3&gt;

&lt;p&gt;After installing and launching FastScorpion IDE, the interface displays a project creation entry. Clicking to create a project reveals several project type options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swift&lt;/li&gt;
&lt;li&gt;Objective-C&lt;/li&gt;
&lt;li&gt;Flutter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this test, I used a Swift project. After entering the project name and selecting a save directory, the IDE automatically generates the project structure.&lt;/p&gt;

&lt;p&gt;The project directory already includes basic code files and resource folders. Opening the entry code allows you to start writing app logic directly.&lt;/p&gt;

&lt;p&gt;At this stage, there were no issues with environment configuration, such as missing SDKs or compilation components. The IDE prepared the necessary tools during installation, so after project creation, you can immediately start coding.&lt;/p&gt;

&lt;p&gt;For developers needing to quickly start a test project, this workflow is relatively straightforward.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh14dat4wg756h11kbdjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh14dat4wg756h11kbdjr.png" alt="Creating a Project" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Writing App Code in the Editor
&lt;/h3&gt;

&lt;p&gt;FastScorpion IDE's code editor is built on the VSCode architecture, so the interface structure feels familiar.&lt;/p&gt;

&lt;p&gt;The left side shows the project file list, the middle is the code editing area, and the bottom contains debugging and output panels.&lt;/p&gt;

&lt;p&gt;To test the development workflow, I wrote a simple page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The page includes a button&lt;/li&gt;
&lt;li&gt;A text label for displaying content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the button is clicked, it calls a method that reads data locally and updates the text on the interface.&lt;/p&gt;

&lt;p&gt;While writing code, the editor provides auto-completion. For example, when entering a class name, the IDE suggests methods and properties. After saving the code, the IDE automatically checks the syntax structure, highlighting any issues at the corresponding positions.&lt;/p&gt;

&lt;p&gt;Since the editor is based on VSCode, many plugins can still be used, such as code formatting tools or AI-assisted plugins.&lt;/p&gt;




&lt;h3&gt;
  
  
  Connecting an iPhone and Running the App
&lt;/h3&gt;

&lt;p&gt;After writing the code, it needs to be run on a real device for verification.&lt;/p&gt;

&lt;p&gt;Connect the iPhone to the computer via a data cable and start the build task.&lt;/p&gt;

&lt;p&gt;The build process completes several steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compiling the source code&lt;/li&gt;
&lt;li&gt;Building the application&lt;/li&gt;
&lt;li&gt;Installing the app on the phone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the build completes, an app icon appears on the phone's home screen. Clicking the icon launches the app.&lt;/p&gt;

&lt;p&gt;In the test project, clicking the button successfully displayed the read data in the text label, indicating the code logic runs correctly.&lt;/p&gt;

&lt;p&gt;Subsequently, I modified the interface color in the code and clicked the run button again. The IDE recompiled the app and installed the new version, updating the interface on the phone.&lt;/p&gt;

&lt;p&gt;This debugging method is quite direct, as code changes quickly show their effects in operation.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhuppze8iwg9fyv1vf4u5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhuppze8iwg9fyv1vf4u5.png" alt="Connecting the Phone" width="799" height="205"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  IDE's Built-in Compilation Tools
&lt;/h3&gt;

&lt;p&gt;Throughout the development process, the IDE did not call any external development environment.&lt;/p&gt;

&lt;p&gt;FastScorpion IDE includes a built-in suite of compilation tools. These tools are configured during IDE installation.&lt;/p&gt;

&lt;p&gt;When clicking run or build, the IDE invokes these internal compilation tools to execute code compilation and app building.&lt;/p&gt;

&lt;p&gt;This means developers don't need to install Xcode separately when writing iOS apps. Code compilation, device running, and installation package generation can all be completed within the same tool.&lt;/p&gt;

&lt;p&gt;For development phases requiring frequent app debugging, this development environment reduces many preparatory steps.&lt;/p&gt;




&lt;h3&gt;
  
  
  Managing Different Types of Projects Simultaneously
&lt;/h3&gt;

&lt;p&gt;To test the IDE's project support capabilities, I created two additional projects of different types.&lt;/p&gt;

&lt;p&gt;One is an Objective-C project, and the other is a Flutter project.&lt;/p&gt;

&lt;p&gt;The project creation method is similar to the Swift project. After creation, I wrote a simple page, connected the iPhone, and clicked run; the IDE executed compilation and installed the app.&lt;/p&gt;

&lt;p&gt;Test results show that all three project types can run normally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swift project&lt;/li&gt;
&lt;li&gt;Objective-C project&lt;/li&gt;
&lt;li&gt;Flutter project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Managing projects with different technology stacks in the same iOS development tool makes the development environment more unified.&lt;/p&gt;




&lt;h3&gt;
  
  
  Building the App Installation Package
&lt;/h3&gt;

&lt;p&gt;After app development is complete, an installation package needs to be generated for testing or release.&lt;/p&gt;

&lt;p&gt;In FastScorpion IDE's build menu, you can execute app building. The IDE compiles the code and generates installation files.&lt;/p&gt;

&lt;p&gt;Build logs are displayed in the output window; if issues arise during compilation, detailed information can be viewed here.&lt;/p&gt;

&lt;p&gt;The generated installation files can be used for testers to install or for submitting to app store review.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbdxi2v1ujqxq26eh0pz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbdxi2v1ujqxq26eh0pz.png" alt="Building" width="799" height="403"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;In this test project, the development process was relatively seamless:&lt;/p&gt;

&lt;p&gt;Create project → Write code → Connect device and run → Modify code → Recompile → Generate installation package&lt;/p&gt;

&lt;p&gt;These steps were all completed within the same development tool.&lt;/p&gt;

&lt;p&gt;For developers, a stable iOS development tool can make the development workflow smoother. Reducing environment configuration and tool switching allows more time to focus on the code itself.&lt;/p&gt;

&lt;p&gt;Reference link: &lt;a href="https://kxapp.com/" rel="noopener noreferrer"&gt;https://kxapp.com/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Upload iOS Apps via Command Line on Linux: Fastlane + AppUploader (Happy Uploading)</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Fri, 20 Mar 2026 10:32:35 +0000</pubDate>
      <link>https://dev.to/objc_coder/upload-ios-apps-via-command-line-on-linux-fastlane-appuploader-happy-uploading-2ni5</link>
      <guid>https://dev.to/objc_coder/upload-ios-apps-via-command-line-on-linux-fastlane-appuploader-happy-uploading-2ni5</guid>
      <description>&lt;p&gt;Many teams run their CI or release environments on Linux servers, such as GitLab Runner, Jenkins, or self-built build nodes. After the app has generated a &lt;code&gt;.ipa&lt;/code&gt; file, the next question is: &lt;strong&gt;Can the IPA be directly uploaded to the App Store from Linux?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer is yes, with the key being to separate the processes—building the IPA and uploading the IPA are not the same thing.&lt;/p&gt;

&lt;p&gt;Below explains how to &lt;strong&gt;complete the iOS upload process via command line on Linux&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Prepare Files Required for Release
&lt;/h1&gt;

&lt;p&gt;Before uploading from Linux, three files need to be prepared:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.ipa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;iOS app installation package&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.p12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;iOS distribution certificate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.mobileprovision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;App Store provisioning profile&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These files can come from different sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mac build environment&lt;/li&gt;
&lt;li&gt;CI build system&lt;/li&gt;
&lt;li&gt;Cloud packaging services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the team does not have a Mac, certificates and provisioning profiles can also be generated in Windows or Linux environments using &lt;strong&gt;AppUploader (Happy Uploading)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;General process for generating certificates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to the Apple Developer account&lt;/li&gt;
&lt;li&gt;Go to certificate management&lt;/li&gt;
&lt;li&gt;Create a &lt;code&gt;distribution&lt;/code&gt; type certificate&lt;/li&gt;
&lt;li&gt;Download the &lt;code&gt;.p12&lt;/code&gt; file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Process for creating provisioning profiles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to provisioning profile management&lt;/li&gt;
&lt;li&gt;Create a new &lt;code&gt;App Store&lt;/code&gt; type&lt;/li&gt;
&lt;li&gt;Bind the Bundle ID and certificate&lt;/li&gt;
&lt;li&gt;Download the &lt;code&gt;.mobileprovision&lt;/code&gt; file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These files will be used during the packaging or CI build phase.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ga5iq04l6ljpfm4j5tf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ga5iq04l6ljpfm4j5tf.png" alt="Certificate Generation" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  2. Build IPA in CI or on Mac
&lt;/h1&gt;

&lt;p&gt;Linux environments typically only handle releases, not building iOS apps.&lt;/p&gt;

&lt;p&gt;IPA can be generated in the following ways:&lt;/p&gt;
&lt;h3&gt;
  
  
  Using Xcode
&lt;/h3&gt;

&lt;p&gt;Execute on Mac:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product → Archive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then export the App Store type IPA.&lt;/p&gt;




&lt;h3&gt;
  
  
  Using Fastlane
&lt;/h3&gt;

&lt;p&gt;If the project uses Fastlane, it can be built via script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lane :release do
  build_app(
    scheme: "AppScheme",
    export_method: "app-store"
  )
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastlane release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate the &lt;code&gt;.ipa&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;After building, upload the IPA to the Linux server.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Install Upload Tool on Linux
&lt;/h1&gt;

&lt;p&gt;Upload tools from Xcode cannot run on Linux, but command-line upload tools can be used.&lt;/p&gt;

&lt;p&gt;One way is to use &lt;strong&gt;AppUploader CLI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After downloading AppUploader, the command-line tool can be found in the compressed package.&lt;/p&gt;

&lt;p&gt;Confirm the command is executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod +x appuploader_cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  4. Upload IPA Using Command Line
&lt;/h1&gt;

&lt;p&gt;Execute on the Linux server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;appuploader_cli -f app.ipa -u appleid@example.com -p xxxx-xxxx-xxxx-xxxx -c 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter explanation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IPA file path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Apple Developer account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;App-specific password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upload channel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Channel explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1&lt;/code&gt; Old upload channel&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;2&lt;/code&gt; New upload channel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After successful upload, the command line will return the upload status.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. View Build in App Store Connect
&lt;/h1&gt;

&lt;p&gt;After uploading, go to &lt;strong&gt;App Store Connect&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;My Apps → App → TestFlight
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait for Apple to process the build.&lt;/p&gt;

&lt;p&gt;After processing is complete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New build version can be seen&lt;/li&gt;
&lt;li&gt;TestFlight distribution is possible&lt;/li&gt;
&lt;li&gt;Submission for review is possible
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foigae75kwdyigj9pyb6j.png" alt="asc" width="800" height="340"&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  6. Automate Upload in CI
&lt;/h1&gt;

&lt;p&gt;One advantage of Linux command-line upload is direct integration into CI.&lt;/p&gt;

&lt;p&gt;For example, Jenkins Pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stage('Upload IPA') {
    sh '''
    ./appuploader_cli \
    -u $APPLE_ID \
    -p $APP_PASSWORD \
    -c 2 \
    -f build/app.ipa
    '''
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CI automatically uploads after building is complete.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Common Issue Troubleshooting
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Build Not Appearing in App Store Connect
&lt;/h3&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether Bundle ID is consistent&lt;/li&gt;
&lt;li&gt;Whether build number is incremented&lt;/li&gt;
&lt;li&gt;Whether Distribution provisioning profile is used&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Upload Failure
&lt;/h3&gt;

&lt;p&gt;Confirm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App-specific password is correct&lt;/li&gt;
&lt;li&gt;Network is not blocked&lt;/li&gt;
&lt;li&gt;IPA file is not corrupted&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  8. Summary of Linux Release Process
&lt;/h1&gt;

&lt;p&gt;If the process is organized into a tool combination, the structure is as follows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Certificate Generation&lt;/td&gt;
&lt;td&gt;AppUploader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning Profile Generation&lt;/td&gt;
&lt;td&gt;AppUploader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPA Building&lt;/td&gt;
&lt;td&gt;Xcode / Fastlane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command-line Upload&lt;/td&gt;
&lt;td&gt;AppUploader CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review Submission&lt;/td&gt;
&lt;td&gt;App Store Connect&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;iOS app upload process is not necessarily tied to macOS.&lt;br&gt;
If the IPA file is already generated, the upload phase can be completely done via command line in Linux environments.&lt;/p&gt;

&lt;p&gt;Reference link: &lt;a href="https://www.appuploader.net/tutorial/zh/83/83.html" rel="noopener noreferrer"&gt;https://www.appuploader.net/tutorial/zh/83/83.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>Complete Guide to Apple App Store Submission Process: From Developer Registration to Happy</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Thu, 04 Dec 2025 04:47:30 +0000</pubDate>
      <link>https://dev.to/objc_coder/complete-guide-to-apple-app-store-submission-process-from-developer-registration-to-happy-4ea</link>
      <guid>https://dev.to/objc_coder/complete-guide-to-apple-app-store-submission-process-from-developer-registration-to-happy-4ea</guid>
      <description>&lt;p&gt;Compared to the relatively open Android market, the Apple App Store's submission process is strict and systematic.&lt;br&gt;
For developers, understanding the &lt;strong&gt;Apple App Store submission process&lt;/strong&gt; not only increases the approval rate but also avoids multiple rejections due to signing, privacy policy, or screenshot issues.&lt;/p&gt;

&lt;p&gt;With the rise of cross-platform development, more developers want to &lt;strong&gt;complete iOS submission in Windows or Linux environments&lt;/strong&gt;. The new &lt;strong&gt;Happy Submission (Appuploader) command-line tool (CLI)&lt;/strong&gt; is designed for this purpose.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Basic Process of Submitting an App to the Apple App Store
&lt;/h2&gt;

&lt;p&gt;The Apple App submission process consists of 6 core stages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stage 1&lt;/td&gt;
&lt;td&gt;Register an Apple Developer account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stage 2&lt;/td&gt;
&lt;td&gt;Create App ID, apply for signing certificates and provisioning profiles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stage 3&lt;/td&gt;
&lt;td&gt;Package and generate an IPA file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stage 4&lt;/td&gt;
&lt;td&gt;Configure app information in App Store Connect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stage 5&lt;/td&gt;
&lt;td&gt;Upload the IPA file (can use Appuploader)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stage 6&lt;/td&gt;
&lt;td&gt;Submit for review and release&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Below, we will break down each step in detail.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Register an Apple Developer Account
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Register on the Official Website
&lt;/h3&gt;

&lt;p&gt;Visit the &lt;a href="https://developer.apple.com/programs/" rel="noopener noreferrer"&gt;Apple Developer official website&lt;/a&gt;, log in with your Apple ID, and click "Enroll" to join the developer program.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pay the Annual Fee
&lt;/h3&gt;

&lt;p&gt;Registering as an individual or company account requires paying an annual fee of $99 (approximately 699 RMB).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Account Type&lt;/th&gt;
&lt;th&gt;Suitable For&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Individual Account&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Independent developers&lt;/td&gt;
&lt;td&gt;Simple registration, fewer permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Company Account&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise teams&lt;/td&gt;
&lt;td&gt;Supports multi-user collaboration and role assignment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After registration, you can log in to &lt;a href="https://appstoreconnect.apple.com" rel="noopener noreferrer"&gt;App Store Connect&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Create Signing Certificates and Provisioning Profiles
&lt;/h2&gt;

&lt;p&gt;The Apple system requires all submitted apps to use valid signing certificates.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Development Certificate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;For real device debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distribution Certificate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;For App Store submission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Provisioning Profile&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Binds certificates and App ID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Use Happy Submission (Appuploader) to Create Certificates with One Click
&lt;/h3&gt;

&lt;p&gt;No Mac or Keychain required.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5eaxr8rlnip1py3vvvup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5eaxr8rlnip1py3vvvup.png" alt="Certificate" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports Windows / Linux / macOS;&lt;/li&gt;
&lt;li&gt;One-click generation of certificates and provisioning profiles;&lt;/li&gt;
&lt;li&gt;Can be shared among multiple users;&lt;/li&gt;
&lt;li&gt;Completely eliminates Mac environment dependency.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  4. Package and Generate an IPA File
&lt;/h2&gt;

&lt;p&gt;IPA is the final release package for iOS apps.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Packaging Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Native iOS (Xcode)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use Xcode → Product → Archive → Export IPA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;uni-app / HBuilderX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud packaging to generate IPA, no Mac required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flutter / React Native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Command-line build + signing export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cordova / Ionic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CLI build followed by IPA upload&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you don't have a Mac, you can use HBuilder cloud packaging + Happy Submission CLI to complete the entire process.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftulyettum6gg0xl6njlc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftulyettum6gg0xl6njlc.png" alt="HBuilder Packaging" width="786" height="761"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Configure App Information in App Store Connect
&lt;/h2&gt;

&lt;p&gt;Log in to &lt;a href="https://appstoreconnect.apple.com" rel="noopener noreferrer"&gt;App Store Connect&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Click "My Apps" → "+" to create a new app; fill in the following information:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Information Item&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Up to 30 characters, cannot be duplicate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bundle ID&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Must match the certificate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SKU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Internal tracking number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Category&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Select an appropriate category (e.g., Education, Utilities)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language and Region&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Determine the app's language version&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Also upload required content such as screenshots, app icon (1024×1024 PNG), and privacy policy link.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq585plxg6lcraggf6hwl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq585plxg6lcraggf6hwl.png" alt="ASC" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  6. Upload IPA to the App Store
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Traditional Method (Mac Users Only):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Upload via Xcode&lt;/li&gt;
&lt;li&gt;Drag-and-drop upload via Transporter App&lt;/li&gt;
&lt;li&gt;Command-line using altool / Fastlane (requires Xcode environment)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes submission difficult for non-Mac users.&lt;/p&gt;


&lt;h3&gt;
  
  
  Cross-Platform Solution: Happy Submission (Appuploader)
&lt;/h3&gt;

&lt;p&gt;The new command-line tool supports &lt;strong&gt;Windows, Linux, macOS&lt;/strong&gt; across all systems, allowing IPA upload to the App Store without a Mac.&lt;/p&gt;

&lt;p&gt;Example command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;appuploader_cli &lt;span class="nt"&gt;-u&lt;/span&gt; ios@team.com &lt;span class="nt"&gt;-p&lt;/span&gt; xxx-xxx-xxx-xxx &lt;span class="nt"&gt;-c&lt;/span&gt; 2 &lt;span class="nt"&gt;-f&lt;/span&gt; ./release/MyApp.ipa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Apple Developer account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;App-specific password (not login password)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upload channel (1=old channel, 2=new channel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IPA file path&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports multiple systems;&lt;/li&gt;
&lt;li&gt;Stable upload with automatic retry;&lt;/li&gt;
&lt;li&gt;Does not carry Mac device information;&lt;/li&gt;
&lt;li&gt;Can integrate into CI/CD automation pipelines;&lt;/li&gt;
&lt;li&gt;Provides detailed upload logs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Submit for Review and Release
&lt;/h2&gt;

&lt;p&gt;After upload, return to App Store Connect:&lt;/p&gt;

&lt;p&gt;Fill in app description, keywords, and supported device information;&lt;br&gt;
Select build version → submit for review;&lt;br&gt;
Wait for Apple review (typically 1–3 business days);&lt;br&gt;
After approval, the app is automatically released globally on the App Store.&lt;/p&gt;

&lt;p&gt;If rejected, App Store provides detailed reasons, and you can modify and resubmit.&lt;/p&gt;


&lt;h2&gt;
  
  
  8. Common Review Rejection Reasons and Suggestions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Incomplete Privacy Declaration&lt;/td&gt;
&lt;td&gt;Missing permission descriptions&lt;/td&gt;
&lt;td&gt;Add fields like NSCameraUsageDescription in Info.plist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Crashes&lt;/td&gt;
&lt;td&gt;Program crashes&lt;/td&gt;
&lt;td&gt;Fix issues through real device testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use of Non-Public APIs&lt;/td&gt;
&lt;td&gt;Calling unauthorized interfaces&lt;/td&gt;
&lt;td&gt;Replace with official APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Compliant Screenshots&lt;/td&gt;
&lt;td&gt;Size or display issues&lt;/td&gt;
&lt;td&gt;Use 5.5" + 6.5" size screenshots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate App&lt;/td&gt;
&lt;td&gt;Multiple versions of similar apps&lt;/td&gt;
&lt;td&gt;Merge features and resubmit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  9. Automated Submission Practice (Fastlane + Happy Submission CLI)
&lt;/h2&gt;

&lt;p&gt;Development teams can simplify the submission process using automation tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build IPA&lt;/span&gt;
fastlane gym &lt;span class="nt"&gt;--scheme&lt;/span&gt; &lt;span class="s2"&gt;"MyApp"&lt;/span&gt; &lt;span class="nt"&gt;--output_directory&lt;/span&gt; &lt;span class="s2"&gt;"./build"&lt;/span&gt;

&lt;span class="c"&gt;# Upload IPA&lt;/span&gt;
appuploader_cli &lt;span class="nt"&gt;-u&lt;/span&gt; dev@icloud.com &lt;span class="nt"&gt;-p&lt;/span&gt; xxx-xxx-xxx-xxx &lt;span class="nt"&gt;-c&lt;/span&gt; 2 &lt;span class="nt"&gt;-f&lt;/span&gt; ./build/MyApp.ipa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Can be integrated into Jenkins, GitLab CI, GitHub Actions for fully automated build and upload.&lt;/p&gt;




&lt;p&gt;The &lt;strong&gt;Apple App Store submission process&lt;/strong&gt; may seem complex, but the core logic is clear: account → certificates → packaging → upload → review → release.&lt;br&gt;
Reference tutorial: &lt;a href="https://www.applicationloader.net/tutorial/zh/1/1.html" rel="noopener noreferrer"&gt;https://www.applicationloader.net/tutorial/zh/1/1.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>Engineering Troubleshooting and Tool Combination for App HTTPS Packet Capture</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Fri, 28 Nov 2025 09:50:12 +0000</pubDate>
      <link>https://dev.to/objc_coder/engineering-troubleshooting-and-tool-combination-for-app-https-packet-capture-1k01</link>
      <guid>https://dev.to/objc_coder/engineering-troubleshooting-and-tool-combination-for-app-https-packet-capture-1k01</guid>
      <description>&lt;p&gt;In mobile application debugging and online troubleshooting, &lt;strong&gt;app HTTPS packet capture&lt;/strong&gt; is a fundamental skill for identifying network, authentication, and encryption issues. When encountering problems such as "unable to capture packets," "HTTPS handshake failure," or "request inconsistency with the server," engineers should troubleshoot in the order of network layer → TLS layer → application layer, and flexibly combine proxy tools, low-level packet capture, and data export methods. Below, we provide actionable processes, common commands, tool responsibilities, and an alternative packet capture solution Sniffmaster, explaining how to use tools to complete a full analysis chain with practical feature points.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I. First Define the Goal: What to Capture and Where&lt;/strong&gt;&lt;br&gt;
Before packet capture, clarify: Are you looking at the TCP three-way handshake (connectivity), TLS handshake (certificate/ALPN/Alert), or the application layer HTTP/2/1.1 request body and headers (signature, Cookie, CORS)? Prioritize capturing at the location closest to the issue occurrence (client proxy or edge/origin server capture), and record the reproduction time, device IP, and request-id to align with logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;II. Tool Responsibilities and Combined Usage (Packet Capture Tool Matrix)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proxy tools (Charles / Fiddler / Proxyman / mitmproxy): Used for decrypting HTTPS, breaking and modifying requests, and quickly verifying headers/body. Suitable for development environments or test devices where CA can be installed.&lt;/li&gt;
&lt;li&gt;Low-level packet capture (tcpdump / tshark / Wireshark): Capture &lt;code&gt;-s 0&lt;/code&gt; pcap files at the gateway or backend for analyzing the three-way handshake, retransmissions, and TLS ClientHello/ServerHello. This provides authoritative evidence to determine if requests reach the backend.&lt;/li&gt;
&lt;li&gt;Scriptable tools (pyshark / scapy / mitmproxy scripts): Suitable for batch statistics on TLS Alerts, automated replay, and continuous monitoring.&lt;/li&gt;
&lt;li&gt;Alternative packet capture solution, Sniffmaster: When proxies are unavailable, apps use certificate pinning, or specific network policies block capture, it can filter traffic by App/domain and export pcap and single-packet binary files, supporting HTTPS decryption and mTLS/pinning analysis assistance, facilitating frame-by-frame comparison with backend pcap files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;III. Reproducible Troubleshooting Process (TCP → TLS → HTTP)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TCP layer: Confirm connectivity and port listening. Common commands:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nc &lt;span class="nt"&gt;-vz&lt;/span&gt; api.example.com 443
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; any host &amp;lt;client_ip&amp;gt; and port 443 &lt;span class="nt"&gt;-s&lt;/span&gt; 0 &lt;span class="nt"&gt;-w&lt;/span&gt; /tmp/cap.pcap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Check for excessive SYN, RST, or retransmissions.&lt;br&gt;
 \2. TLS layer: Check ClientHello (SNI, cipher), ServerHello, certificate chain, and TLS Alert:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; api.example.com:443 &lt;span class="nt"&gt;-servername&lt;/span&gt; api.example.com &lt;span class="nt"&gt;-showcerts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filter for &lt;code&gt;tls.handshake.type==1&lt;/code&gt; and &lt;code&gt;tls.alert_message&lt;/code&gt; in Wireshark. If incomplete chains, OCSP issues, or ALPN mismatches are found, prioritize fixing the certificate chain and stapling.&lt;br&gt;
 \3. Application layer: Use proxies to view HTTP/2 frames or HTTP/1.1 requests when decryption is possible, verifying signatures, timestamps, request body order, and header differences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IV. Common Challenges and Solutions (App HTTPS Packet Capture Scenarios)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Certificate pinning / Custom TLS&lt;/strong&gt;: Browsers can capture, but apps cannot; temporarily disable pinning in test builds or use alternative solutions that export pcap to export app traffic and compare with backend pcap files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/3 (QUIC)&lt;/strong&gt;: QUIC is UDP-based and bypasses TCP proxies. When encountered, force fallback to TCP+HTTP/2 on the client or server for reproduction and capture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partial network/ISP issues&lt;/strong&gt;: Collect affected users' ASN and region, capture edge pcap files, and compare certificate Issuers with app-exported pcap to determine if intermediate substitution or transparent proxies exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;V. Alternative Packet Capture Process When Proxies Are Not Feasible&lt;/strong&gt;&lt;br&gt;
When proxies cannot decrypt or be configured, capture packets at the backend and simultaneously export app traffic as pcap, then analyze side-by-side in Wireshark: align timelines, compare ClientHello SNI, ServerHello and certificate chains, and check tls.alert.&lt;br&gt;
Sniffmaster provides the ability to filter by App/domain, export Wireshark-compatible pcap and single-packet binary files, and supports interceptors and JavaScript scripts to modify requests/responses, significantly improving analysis efficiency in complex scenarios (use within compliance boundaries).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VI. Interception and Automated Modification (Advanced Debugging)&lt;/strong&gt;&lt;br&gt;
During development debugging, interceptors can temporarily modify request parameters or response bodies to verify fixes. Packet capture tools supporting JavaScript scripts can run custom logic at breakpoints, enabling automated test scenarios such as batch replacement of signature fields or simulating failure responses, facilitating quick identification of root causes.&lt;/p&gt;




&lt;p&gt;Packet capture files often contain sensitive data (Tokens, personal information). In production environments, packet capture must have approval, limited time windows, and exported files should be encrypted, anonymized, and regularly destroyed. When delivering analysis conclusions, include: reproduction time window (second-level), relevant pcap files, Wireshark key frame screenshots, conclusions, and actionable repair suggestions (e.g., patch fullchain, adjust proxy/firewall, update client pin configurations).&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
  </channel>
</rss>
