<?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>App Store IPA Upload Automation: .p8 Key Auth and CI/CD Integration in Practice</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Thu, 10 Sep 2026 10:11:34 +0000</pubDate>
      <link>https://dev.to/objc_coder/app-store-ipa-upload-automation-p8-key-auth-and-cicd-integration-in-practice-2e52</link>
      <guid>https://dev.to/objc_coder/app-store-ipa-upload-automation-p8-key-auth-and-cicd-integration-in-practice-2e52</guid>
      <description>&lt;p&gt;On release day, the most annoying step is the manual upload: the build machine produces the package, but a human still has to open the upload tool, pick the file, enter credentials, and watch the progress bar—then do it all over again if the network hiccups. Worse, these operations live on individual laptops, so handing off to someone else means walking them through the process again. To wire "upload the IPA" into CI/CD, the first thing to solve is actually authentication—letting a machine in the pipeline submit the build to App Store Connect as you, without scattering your Apple ID password everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two types of credentials for CI
&lt;/h2&gt;

&lt;p&gt;Credentials for automation fall into two categories. One is an app-specific password, generated in the Apple account backend in the xxxx-xxxx-xxxx-xxxx format, tied to an Apple ID, and suited to being typed manually into interactive tools. The other is an App Store Connect API key, which yields a .p8 private key plus two identifiers, a Key ID and an Issuer ID; requests are signed with JWT. It doesn't consume password quota, can be revoked independently, and its permissions can be scoped. In CI scenarios the .p8 route is handier: it doesn't trigger two-factor authentication, needs no human at a terminal, and if the key leaks only it is affected—rotating it doesn't disrupt other automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The official route on Mac: altool and fastlane
&lt;/h2&gt;

&lt;p&gt;Apple's official route is feeding the .p8 to altool. The altool bundled with Xcode supports the --apiKey and --apiIssuer parameters, so one command uploads the build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xcrun altool &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;--apiKey&lt;/span&gt; XXXXXXXXXX &lt;span class="nt"&gt;--apiIssuer&lt;/span&gt; YYYYYYYYYY &lt;span class="nt"&gt;--type&lt;/span&gt; ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;fastlane's pilot lane consumes the same credentials, injected via the three environment variables APP_STORE_CONNECT_API_KEY_KEY_ID, APP_STORE_CONNECT_API_KEY_ISSUER_ID, and APP_STORE_CONNECT_API_KEY, so CI never has to commit the key to the repository. The cost of this approach is the environment: altool depends on the Xcode toolchain, fastlane needs Ruby dependencies installed, and it basically won't run on Windows or bare Linux build machines—the key itself, ironically, has no platform restrictions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating the .p8: the Appuploader approach
&lt;/h2&gt;

&lt;p&gt;If your build machine isn't a Mac, or you don't want to maintain another Xcode environment in the pipeline, take a look at the Appuploader combination. Its account overview page lets you generate an App Store Connect API key directly: enter a key name and submit, and it creates a key with ADMIN privileges that can access every app under the account. The private key (.p8) is shown only this once, and the page prompts you to copy it immediately or download it as a .json key file and store it safely—import that .json under "Add Account → API Key → Key File" on the login page, and you can sign in to the same App Store Connect account without a password or a second verification step. The key works across devices, anything derived from it dies the moment it's revoked, and revoking it leaves things clean.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting the upload step on the command line
&lt;/h2&gt;

&lt;p&gt;The IPA upload step runs on the command line. The runtime folder in the Appuploader install directory ships appuploader_cli, invoked as a subcommand:&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; dev@example.com &lt;span class="nt"&gt;-p&lt;/span&gt; abcd-efgh-ijkl-mnop &lt;span class="nt"&gt;--type&lt;/span&gt; ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-f specifies the IPA path, -u is the Apple ID, -p is the app-specific password, and --type defaults to ios. It does exactly what the "Submit to App Store" button in the GUI does, but it's fully scriptable and runs on Windows, Linux, and Mac; the whole chain involves no Xcode and carries no Mac device information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring it into GitHub Actions
&lt;/h2&gt;

&lt;p&gt;Hooking it into CI is just a few ordinary pipeline steps: once the build artifact is out, download the Linux build of Appuploader in Actions, add the runtime directory to PATH after extraction, put the account and app-specific password in secrets, and one run step completes the upload. You can also run appuploader_cli's info command before uploading to analyze the IPA locally and generate AppStoreInfo.plist, validating things like signing and version up front so problems surface early instead of waiting for Apple to reject the build and digging through logs afterward—when an upload fails, the CLI's logs likewise spell out the reason, making version conflicts and signing mismatches obvious at a glance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing a route by environment
&lt;/h2&gt;

&lt;p&gt;Pick between the two routes based on the build environment: on a Mac-based CI, altool with a .p8 is convenient, the ecosystem is mature, and there are plenty of community write-ups on pitfalls; on a Linux or Windows build machine, the Appuploader command line is the most direct way to get IPA uploads into the pipeline. The .p8 key solves the identity problem on the account side—login, certificate management, and package upload all share one identity. Once uploads are pulled out of manual operations, the only thing left to watch on release day is the review status, saving you that half hour per release and the back-and-forth of a handoff.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>Can VS Code be used for iOS development? Does it support code completion and real-device debugging?</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Wed, 09 Sep 2026 09:58:34 +0000</pubDate>
      <link>https://dev.to/objc_coder/can-vs-code-be-used-for-ios-development-does-it-support-code-completion-and-real-device-debugging-2e28</link>
      <guid>https://dev.to/objc_coder/can-vs-code-be-used-for-ios-development-does-it-support-code-completion-and-real-device-debugging-2e28</guid>
      <description>&lt;p&gt;Many iOS developers have had this thought: Xcode is too heavy—slow to start, slow to index—so can we use VS Code to write iOS code? VS Code does offer better startup speed, a richer plugin ecosystem, and a more polished editor experience than Xcode, but iOS development isn't just about writing code; the compilation and debugging stages inevitably depend on underlying toolchains. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Can VS Code + Swift Plugins Do?
&lt;/h2&gt;

&lt;p&gt;After installing the Swift plugin and SourceKit-LSP server in VS Code, you can handle basic code editing: syntax highlighting, code completion, jump to definition, and error hints are all supported. Combined with Git plugins for version control, Prettier for formatting, and GitHub Copilot for AI-assisted completion, the editor experience can actually surpass Xcode. &lt;/p&gt;

&lt;p&gt;VS Code provides solid support for Swift Package Manager projects with high native integration. After opening Package.swift, you can browse and edit code normally. For traditional xcodeproj projects, support relies on the extension capabilities of apple/sourcekit-lsp and isn't as smooth as working directly with SPM projects. &lt;/p&gt;

&lt;h2&gt;
  
  
  What VS Code Can't Do
&lt;/h2&gt;

&lt;p&gt;Real-device debugging is VS Code's weak point. Xcode bundles compilation, signing, installation to a physical device, and breakpoint debugging into a single workflow. VS Code has no built-in iOS debugger support; to debug you must return to Xcode or compile the app via the command line with xcodebuild, then attach LLDB to the process. &lt;/p&gt;

&lt;p&gt;VS Code also cannot do visual editing for Interface Builder or Storyboards; you can only edit XML source files in text mode. If your project heavily relies on XIBs and Storyboards, VS Code can only act as a text editor for those XML files. &lt;/p&gt;

&lt;p&gt;Instruments' deep performance analysis tools are also beyond VS Code's reach. Tools like Time Profiler, Allocations, and Energy Log require the Xcode environment—VS Code plugins cannot replace them. &lt;/p&gt;

&lt;h2&gt;
  
  
  How KXApp Differs
&lt;/h2&gt;

&lt;p&gt;KXApp is built on VS Code and preserves all editor-level shortcuts, interface layout, and the plugin ecosystem of VS Code. The key difference from a typical VS Code + Swift plugin setup is that KXApp includes the iOS compilation toolchain internally. &lt;/p&gt;

&lt;p&gt;This means after writing code in KXApp, you don't need to switch to the terminal to run xcodebuild or open Xcode to compile. The built-in swiftc, clang, and ld toolchain can compile source code directly into an IPA file. Real-device debugging is also natively supported: connect your iPhone via USB, click Build and Run, and the tool automatically handles signing and deployment. &lt;/p&gt;

&lt;p&gt;KXApp also provides native Dart-to-iOS compilation support for Flutter projects, eliminating the need to configure the Xcode toolchain separately within the Flutter environment. &lt;/p&gt;

&lt;p&gt;VS Code isn't incapable of writing iOS code—its editor experience is genuinely good, even surpassing Xcode in some respects. However, the typical VS Code + Swift plugin approach requires external tools for compilation and debugging, leaving the development workflow disjointed. KXApp fills the compilation and debugging gap on top of VS Code, closing the entire loop within the same tool. &lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Which
&lt;/h2&gt;

&lt;p&gt;For everyday coding and code reviews, use VS Code or KXApp for fast startup, rich plugins, and a smooth editing experience. When you need visual UI editing, Instruments performance analysis, or App Store submission, switch back to Xcode. Combining both tools yields higher efficiency than relying solely on Xcode.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
      <category>development</category>
      <category>flutter</category>
    </item>
    <item>
      <title>TraceEagle NIC Packet Capture: Without Proxy or Certificate</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Wed, 09 Sep 2026 09:30:12 +0000</pubDate>
      <link>https://dev.to/objc_coder/traceeagle-nic-packet-capture-without-proxy-or-certificate-19nh</link>
      <guid>https://dev.to/objc_coder/traceeagle-nic-packet-capture-without-proxy-or-certificate-19nh</guid>
      <description>&lt;h1&gt;
  
  
  NIC Packet Capture
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;This guide teaches you to use &lt;strong&gt;NIC capture&lt;/strong&gt; to grab &lt;strong&gt;everything that flows through this machine's NIC&lt;/strong&gt;: DNS, QUIC, games, IoT, various proprietary protocols — anything passing through the NIC is right before your eyes. &lt;strong&gt;No proxy configuration, no certificate installation&lt;/strong&gt; — pick a NIC and start capturing. HTTPS no longer stays as ciphertext either: common apps are decrypted to plaintext as soon as captured, and for the rest, just click &lt;strong&gt;Decrypt this app&lt;/strong&gt; to read them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. When to Use This Approach
&lt;/h2&gt;

&lt;p&gt;This suits you if any of the following applies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want to see &lt;strong&gt;non-HTTP traffic&lt;/strong&gt;: DNS, QUIC, ICMP, ARP, or any TCP/UDP — what proxies can't capture is all captured here.&lt;/li&gt;
&lt;li&gt;Want to &lt;strong&gt;understand a program's full network behavior&lt;/strong&gt;: which addresses it connects to, which protocols it uses, and whether it has any "silent" connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't want to change the system proxy or install certificates&lt;/strong&gt; — you want zero-intrusion direct capture.&lt;/li&gt;
&lt;li&gt;You have &lt;strong&gt;proprietary / self-developed protocols&lt;/strong&gt; and want to capture raw streams first, then reverse-engineer them later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you just want to debug an HTTP API and rewrite or replay requests, &lt;strong&gt;Proxy Capture&lt;/strong&gt; is more precise. If you only need to capture a program that can be launched from a command line, &lt;strong&gt;Process Capture&lt;/strong&gt; is more convenient.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;TraceEagle is installed and started (simply agree to system permissions on first launch).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No&lt;/strong&gt; need to change the system proxy or &lt;strong&gt;install certificates&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Only when you want to read a program's HTTPS plaintext do you need to click &lt;strong&gt;Decrypt this app&lt;/strong&gt; on it during capture (see Section 4). For common programs, even that step is unnecessary.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Start Capturing: Capture Your First Packet
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a new session and choose &lt;strong&gt;"Local NIC Capture"&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select a NIC&lt;/strong&gt;: The tool automatically lists all local NICs and preselects the currently active one. Choose whichever you want to capture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(Optional) &lt;strong&gt;Set a capture filter before starting&lt;/strong&gt;: If you only care about certain traffic, enter a capture filter rule or simply apply a built-in preset (&lt;strong&gt;TLS / HTTP / QUIC / DNS / TCP / UDP / ICMP / ARP / SSH&lt;/strong&gt;, etc.) with one click.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Capture filters can only be set &lt;strong&gt;before&lt;/strong&gt; capture and cannot be changed afterward — they determine what is captured at the NIC layer. To filter already-captured data, use the &lt;strong&gt;Display Filter&lt;/strong&gt; in the packet view (see Section 4).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;. Packets flowing through the NIC appear in the list in real time.&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%2Flsm56d5odq0okqgistoz.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%2Flsm56d5odq0okqgistoz.png" alt="New Session" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make the target program produce network requests (open a webpage, initiate a connection), and traffic will stream into the list in real time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. View Plaintext: Turn Ciphertext into Plaintext
&lt;/h2&gt;

&lt;p&gt;Traffic captured on the NIC is &lt;strong&gt;ciphertext&lt;/strong&gt; by default (captured as-is). To see HTTPS plaintext for a program, use these three levels, each as a fallback:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Auto-decryption&lt;/strong&gt;: Common programs such as browsers and Electron apps &lt;strong&gt;usually appear as plaintext right after capture&lt;/strong&gt;, with no extra action needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual "Decrypt this app"&lt;/strong&gt;: For programs that cannot be auto-decrypted, click &lt;strong&gt;Decrypt this app&lt;/strong&gt; and select it in the list to reveal its encrypted traffic. Multiple programs can be decrypted simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two enhancement switches&lt;/strong&gt; (use only if decryption is still incomplete):

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Restart the program&lt;/strong&gt;: Restart the target from scratch so even the encrypted traffic from its &lt;strong&gt;early startup phase&lt;/strong&gt; is decrypted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle child processes in one click&lt;/strong&gt;: Some programs send/receive traffic through child processes; enabling this &lt;strong&gt;processes child processes as well&lt;/strong&gt;, avoiding gaps.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;During capture, two views help you make sense of the packets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Packet view&lt;/strong&gt;: Inspect individual packets like in professional capture tools. Selecting a frame shows its frame info, raw bytes, and the protocol hierarchy tree expanded layer by layer. The search box supports &lt;strong&gt;Wireshark-style display filters&lt;/strong&gt; (e.g., &lt;code&gt;tcp.port==443&lt;/code&gt;, &lt;code&gt;tls.handshake&lt;/code&gt;, &lt;code&gt;dns&lt;/code&gt;), validating syntax as you type, allowing precise navigation across the full captured data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection view&lt;/strong&gt;: Reassembles scattered packets into logical connections. Use &lt;strong&gt;Follow Stream&lt;/strong&gt; to see the complete sent/received data of a connection; DNS/TLS/HTTP can also be viewed structurally.&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%2F56xvjntcgyukhh8r905a.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%2F56xvjntcgyukhh8r905a.png" alt="Packet view" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two views &lt;strong&gt;navigate back and forth&lt;/strong&gt; (jump from a connection to its raw packets, or follow an entire connection from a single packet). Right-clicking any frame lets you &lt;strong&gt;show only this connection / filter this connection&lt;/strong&gt;, &lt;strong&gt;flag the frame&lt;/strong&gt;, &lt;strong&gt;copy source/destination address&lt;/strong&gt;, or directly &lt;strong&gt;look up host details / ping / port scan&lt;/strong&gt; a remote IP. You can also &lt;strong&gt;pause anytime&lt;/strong&gt; during capture, review what's been captured, then continue.&lt;/p&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%2F2kjgt3um8dzbvgxnfuxj.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%2F2kjgt3um8dzbvgxnfuxj.png" alt="Connection view" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Verification: Confirm Capture and Decryption
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Captured successfully&lt;/strong&gt;: The list refreshes continuously when traffic passes the NIC; in the connection view you can see connections grouped by protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readable&lt;/strong&gt;: Open an HTTPS connection. If it displays as readable plaintext (e.g., JSON), decryption has succeeded. If still ciphertext, return to Section 4 and click &lt;strong&gt;Decrypt this app&lt;/strong&gt; on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify non-HTTP&lt;/strong&gt;: Type &lt;code&gt;dns&lt;/code&gt;, &lt;code&gt;quic&lt;/code&gt;, &lt;code&gt;icmp&lt;/code&gt;, etc., into the display filter in the packet view. If corresponding traffic appears, the NIC layer has captured everything.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Nothing Captured / Can't Decrypt? Troubleshoot
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Likely Cause&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;Captured, but a program is still ciphertext&lt;/td&gt;
&lt;td&gt;It isn't one of the common programs that are plaintext immediately&lt;/td&gt;
&lt;td&gt;Click &lt;strong&gt;Decrypt this app&lt;/strong&gt; on it and select it. If still incomplete, enable &lt;strong&gt;Restart program&lt;/strong&gt; / &lt;strong&gt;Handle child processes&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No traffic at all&lt;/td&gt;
&lt;td&gt;Wrong NIC selected, or the capture filter filtered out all traffic&lt;/td&gt;
&lt;td&gt;Switch to the currently active NIC; relax or clear the capture filter and restart the session.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want to re-filter captured data but find the capture filter can't be changed&lt;/td&gt;
&lt;td&gt;Capture filters only take effect before the capture starts&lt;/td&gt;
&lt;td&gt;Use the &lt;strong&gt;Display Filter&lt;/strong&gt; in the packet view to filter the captured full data (e.g., &lt;code&gt;tcp.port==443&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target uses HTTP/3 (QUIC), cannot see all traffic&lt;/td&gt;
&lt;td&gt;More apps are adopting QUIC; it has always been hard to capture and decrypt at the NIC layer&lt;/td&gt;
&lt;td&gt;Induce the target to gracefully fall back from HTTP/3 to a regular connection, making it capturable and decryptable again (stopping the session auto-restores). When session keys are available, you can also decrypt QUIC/HTTP/3 directly.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only want to debug an HTTP API, but NIC traffic is too noisy&lt;/td&gt;
&lt;td&gt;NIC captures "everything", focusing on completeness over precision&lt;/td&gt;
&lt;td&gt;Use &lt;strong&gt;Proxy Capture&lt;/strong&gt; (more precise) or &lt;strong&gt;Process Capture&lt;/strong&gt; (only one program).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  7. Choosing a Local Capture Method
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Use this method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;See all traffic on the whole machine, non-HTTP traffic, or a program's full network behavior&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;NIC Capture&lt;/strong&gt; (this article, most complete)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debug HTTP APIs, rewrite/replay requests&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Proxy Capture&lt;/strong&gt; (more precise)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ordinary programs launchable from command line (browser/script/CLI)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Process Capture&lt;/strong&gt; (simplest)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Program already running / certificate pinned / proxy unsupported / proprietary encryption&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Application-Layer Capture&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System apps on macOS / stubborn applications&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;System-Level Capture&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How to read captured data, switch views, and decode: see &lt;strong&gt;Data Viewing and Decoding&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For proprietary/self-developed protocols, to teach the tool how to read them: see &lt;strong&gt;Custom Protocol Decoding&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;To quickly look up remote IP ownership/geolocation/certificates: see &lt;strong&gt;Host Details&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;To probe a remote further: see &lt;strong&gt;Network Diagnostics, Port Scanning, and Subdomain Discovery&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mobile</category>
      <category>software</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Quick Start with TraceEagle Network Tracker</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Tue, 08 Sep 2026 07:18:28 +0000</pubDate>
      <link>https://dev.to/objc_coder/quick-start-with-traceeagle-network-tracker-1nbe</link>
      <guid>https://dev.to/objc_coder/quick-start-with-traceeagle-network-tracker-1nbe</guid>
      <description>&lt;h1&gt;
  
  
  Quick Start
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;This guide gets you through a packet capture in minutes: install, launch, capture your &lt;strong&gt;first decrypted request&lt;/strong&gt; in the simplest way, then pick a capture approach that fits your goal. You'll be up and running after reading.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Install and Launch
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download and install the desktop app for your platform (macOS / Windows / Linux).&lt;/li&gt;
&lt;li&gt;Open the app. On first launch it may ask for system permissions (required for low-level capture) — grant them.&lt;/li&gt;
&lt;li&gt;It works right away, with no extra configuration.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Fastest Success: Capture Your Own Browser
&lt;/h2&gt;

&lt;p&gt;To see results immediately, use Targeted App Capture: the tool launches a browser for you, captures only that process, and auto-decrypts all the way — &lt;strong&gt;no proxy configuration, no certificate installation&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new session and choose &lt;strong&gt;Local Targeted App Capture&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the built-in &lt;strong&gt;Browser Example&lt;/strong&gt; (it auto-fills the launch command), or enter your own command under &lt;strong&gt;Launch Command&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;. The tool opens an independent, clean browser window.&lt;/li&gt;
&lt;li&gt;In that browser, open any website. Requests appear in the list instantly. Click one to see the decrypted plaintext: request line, request headers, body — and the same for the response.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to get it working the first time, take this route — no system proxy, no certificate, least effort. It's the perfect way to get a taste of "capture and see plaintext." See Targeted App Capture for full steps.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Choose a Capture Approach That Fits Your Goal
&lt;/h2&gt;

&lt;p&gt;Use different approaches for different goals; pick one from the table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you want to capture&lt;/th&gt;
&lt;th&gt;Which approach to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Local browser / app, or want to tamper and replay&lt;/td&gt;
&lt;td&gt;Proxy Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entire machine traffic, including non-proxy traffic, UDP / QUIC, DNS&lt;/td&gt;
&lt;td&gt;NIC Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only one app, auto-decrypt, no certificate&lt;/td&gt;
&lt;td&gt;Targeted App Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apps with certificate pinning or custom encryption that can't be broken&lt;/td&gt;
&lt;td&gt;App-Layer Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System built-in apps, stubborn apps&lt;/td&gt;
&lt;td&gt;System-Level Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone / iPad traffic&lt;/td&gt;
&lt;td&gt;iOS Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android phone traffic&lt;/td&gt;
&lt;td&gt;Android Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If in doubt, start with Proxy Capture: it's the most general, supports plaintext viewing, request tampering/replay, and can also capture phones and LAN devices.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Understand the Interface
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Request List&lt;/strong&gt;: Each captured traffic item appears here in order; click to expand its details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Decryption&lt;/strong&gt;: When the session key for an item is available, the tool automatically turns ciphertext into plaintext; the details show TLS as "Decrypted".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raw and Plaintext Side by Side&lt;/strong&gt;: View both the decrypted request/response and the underlying raw bytes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Attribution&lt;/strong&gt;: Each item is tagged with which program sent it, so you can tell them apart at a glance even when they're mixed together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To understand a capture, switch views, or decode payloads, see Data Viewing &amp;amp; Decoding; to compare two requests, see Request Comparison.&lt;/p&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%2Fmb9w35knz1hqjevbaxqu.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%2Fmb9w35knz1hqjevbaxqu.png" alt="Traffic Details" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Can't Capture / Can't Decrypt? Check These First
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;What to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No requests at all&lt;/td&gt;
&lt;td&gt;Target doesn't go through the system proxy&lt;/td&gt;
&lt;td&gt;Switch to NIC Capture — it sees everything at the NIC layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Captured, but all ciphertext&lt;/td&gt;
&lt;td&gt;No certificate installed, or app has certificate pinning&lt;/td&gt;
&lt;td&gt;Install a certificate (see Certificate Installation), or switch to App-Layer Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phone capture still fails after certificate installed&lt;/td&gt;
&lt;td&gt;Newer OS versions don't trust user certificates&lt;/td&gt;
&lt;td&gt;See the certificate-free methods in Android Capture / iOS Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP/3 / QUIC not visible&lt;/td&gt;
&lt;td&gt;It runs over UDP, which ordinary proxies can't see&lt;/td&gt;
&lt;td&gt;Use NIC Capture with H3 decryption&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For more detailed troubleshooting, run Network Diagnostics first.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. What's Next
&lt;/h2&gt;

&lt;p&gt;Once you can capture, decrypt, and understand, these are the everyday high-frequency features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rule Rewrite &amp;amp; Breakpoint Interception&lt;/strong&gt;: Modify requests and responses without changing code, or intercept requests mid-way and edit them manually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request Construction &amp;amp; Replay&lt;/strong&gt;: Modify any request and resend it; even signed and timestamped APIs can be truly replayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Replay &amp;amp; Stress Testing&lt;/strong&gt;: Replay a whole batch of requests, or load-test a single endpoint in place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Generation &amp;amp; API Document Export&lt;/strong&gt;: Turn a request into multi-language code, or reverse the entire session into an OpenAPI document.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mobile</category>
      <category>software</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>App Store App Management Features</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Fri, 04 Sep 2026 10:51:45 +0000</pubDate>
      <link>https://dev.to/objc_coder/app-store-app-management-features-2l5f</link>
      <guid>https://dev.to/objc_coder/app-store-app-management-features-2l5f</guid>
      <description>&lt;h1&gt;
  
  
  App
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Requires a paid Apple Developer Program membership.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Manage your apps on App Store Connect: maintain app information, localized text, version details, screenshots and preview videos. Create and manage in-app purchases (name, price, review screenshot). You can import/export metadata, add review information, and track submission and review status.&lt;/p&gt;

&lt;p&gt;The app list supports searching by name / Bundle ID / SKU. Click an app to enter the detail page, where you can open it in App Store Connect or App Store to jump to Apple's official pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  App Information
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;App Information&lt;/strong&gt; tab maintains app-level, version-independent information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary Language&lt;/strong&gt;: The default display language on the App Store.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categories&lt;/strong&gt;: Primary and secondary categories, plus optional subcategories (up to two levels).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Age Rating&lt;/strong&gt;: Check the frequency of each content descriptor (e.g., violence, profanity) as None / Infrequent, Mild / Frequent, Strong. The age rating is generated after saving.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Managing categories and age ratings requires an App Store Connect API Key account; other sign-in methods are not supported.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Version Management
&lt;/h2&gt;

&lt;p&gt;Each app can have multiple versions, divided into two tabs: &lt;strong&gt;Versions&lt;/strong&gt; and &lt;strong&gt;Builds&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create and Submit a Version
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;New Version&lt;/strong&gt;, enter the version number. Existing versions can be &lt;strong&gt;edited&lt;/strong&gt; to modify copyright information.&lt;/li&gt;
&lt;li&gt;On &lt;strong&gt;Release Settings&lt;/strong&gt; choose a release method:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manual release after approval&lt;/strong&gt;: You must click release manually after approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic release after approval&lt;/strong&gt;: The app goes live immediately after approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduled release&lt;/strong&gt;: Specify a release date; the app becomes available automatically once the date arrives after approval.&lt;/li&gt;
&lt;li&gt;Optionally enable &lt;strong&gt;Phased Release&lt;/strong&gt;: After the version is released, updates are gradually pushed to users over 7 days instead of all at once.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Review Information&lt;/strong&gt;, enter contact name, email, phone, and notes. If the app requires login for testing, check &lt;strong&gt;Need demo account&lt;/strong&gt; and provide a demo account and password for Apple reviewers.&lt;/li&gt;
&lt;li&gt;After completing metadata and screenshots, click &lt;strong&gt;Select a build to submit&lt;/strong&gt;. You must first upload and process a build via Xcode or Transporter before it can be selected.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Submit for Review&lt;/strong&gt;. The status will show “Waiting for Review”. If you need to withdraw, you can &lt;strong&gt;Cancel&lt;/strong&gt; this submission.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Metadata Editing (Multilingual)
&lt;/h2&gt;

&lt;p&gt;App Store display text must be maintained per language: name, subtitle, description, keywords, what's new, promotional text, support URL, marketing URL, privacy policy URL, etc.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add Language&lt;/strong&gt;: Choose from the languages supported by App Store (multi-select) to create blank localization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Translation&lt;/strong&gt;: Select a language with existing content as the source, click &lt;strong&gt;Translate to Other Languages&lt;/strong&gt;, and automatically translate description, keywords, what's new, and promotional text to target languages. (Name and subtitle are not translated because they are app-level shared fields.)&lt;/li&gt;
&lt;li&gt;Name and subtitle are app-level shared fields; changes take effect only after they pass review with the next version. Promotional text can be effective immediately without review. “What's New” is required only on version updates.&lt;/li&gt;
&lt;li&gt;Each field is labeled whether it is required by App Store.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Screenshots &amp;amp; Preview Videos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot Management&lt;/strong&gt;: Check the languages to upload to, drag in or select screenshot images. The system automatically identifies pixel dimensions and categorizes each image to the corresponding device size, batch-uploading to all checked languages. Images whose dimensions do not match any App Store device are skipped. You can also &lt;strong&gt;Copy screenshots to other languages&lt;/strong&gt;, copying all screenshots of one language to others (optionally clearing the same screenshots in the destination language first to avoid duplicates).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview Video Management&lt;/strong&gt;: Upload app preview videos for a specific device and language. You can set a cover frame timestamp (if left blank, Apple automatically chooses the middle frame). After upload, Apple transcodes asynchronously; the status later changes to &lt;strong&gt;Completed&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Export / Import Store Information via Folder
&lt;/h2&gt;

&lt;p&gt;Store information for a given version can be exported to a local folder for offline editing, then imported back to App Store. This is convenient for batch modifications or version control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Export to Folder
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Export to Folder&lt;/strong&gt; on the version detail page.&lt;/li&gt;
&lt;li&gt;Enter the export path (leave blank to use the default directory). Optionally include screenshots and preview videos in the export (this downloads uploaded media from Apple, may be large and time-consuming).&lt;/li&gt;
&lt;li&gt;Directory structure after export: the root &lt;code&gt;config.yaml&lt;/code&gt; contains category/copyright/age rating; &lt;code&gt;review_information.yaml&lt;/code&gt; separately stores review information (for Apple reviewers); under &lt;code&gt;metadata/&amp;lt;language&amp;gt;/&lt;/code&gt;, each field is a &lt;code&gt;.txt&lt;/code&gt; file; screenshots and videos are under &lt;code&gt;screenshots/&lt;/code&gt; and &lt;code&gt;previews/&lt;/code&gt; directories respectively.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Import from Folder
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Import from Folder&lt;/strong&gt;, enter the import path (leave blank to import from the default directory).&lt;/li&gt;
&lt;li&gt;Import is a &lt;strong&gt;partial update&lt;/strong&gt;: only the content actually present in the folder is applied. For example, if the folder contains only &lt;code&gt;review_information.yaml&lt;/code&gt;, only the review information is updated; if only &lt;code&gt;metadata/zh-Hans/&lt;/code&gt;, only the Chinese (Simplified) text is updated. Empty files are skipped and will not clear existing content on Apple. If a &lt;code&gt;screenshots/&lt;/code&gt; or &lt;code&gt;previews/&lt;/code&gt; directory exists, the corresponding language/device screenshots or videos are replaced entirely.&lt;/li&gt;
&lt;li&gt;After import, a summary is shown: counts of updated, skipped, and failed items, along with detailed results for each item.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  In-App Purchases (IAP)
&lt;/h2&gt;

&lt;p&gt;In-app purchases belong to the current app. Each purchase must have a localized display name, price, and review screenshot before Apple will approve it. &lt;strong&gt;Auto-renewable subscriptions should be managed on the App Store Connect official pages&lt;/strong&gt;. This tool manages three types: consumable, non-consumable, and non-renewing subscriptions.&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;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Consumable&lt;/td&gt;
&lt;td&gt;Consumed upon use and can be purchased again, e.g., gold coins, stamina, hint counts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Consumable&lt;/td&gt;
&lt;td&gt;Owned forever after purchase, e.g., removing ads, paid level packs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Renewing Subscription&lt;/td&gt;
&lt;td&gt;A fixed-duration entitlement that does not auto-renew, e.g., season pass&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Creation steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;New In-App Purchase&lt;/strong&gt;, enter the product ID (reverse-DNS format, &lt;strong&gt;cannot be modified after creation, nor can it be reused after deletion&lt;/strong&gt;), reference name (internal only, used in App Store Connect and sales reports; not shown to users), and type.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Localization&lt;/strong&gt; tab, enter display name and description for each language (what users see on the purchase screen). You must add the app's primary language at minimum.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Price&lt;/strong&gt; tab, select a base region, then choose a price point. This price determines the price in the base region, and Apple converts to other regional prices.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Review Screenshot&lt;/strong&gt; tab, upload a screenshot showing where the in-app purchase appears in your app (for review only, not displayed on App Store; one per purchase).&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Settings&lt;/strong&gt; tab, you can enable &lt;strong&gt;Family Sharing&lt;/strong&gt;, allowing purchases to be shared with the buyer's family sharing group.&lt;/li&gt;
&lt;li&gt;Once localization, price, and review screenshot are complete, click &lt;strong&gt;Submit for Review&lt;/strong&gt;. &lt;strong&gt;Submissions cannot be withdrawn after submission&lt;/strong&gt;, so make sure everything is correct before submitting.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Using the in-app purchase management feature requires signing in with an App Store Connect API Key or Developer Portal account; other sign-in methods are not supported.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>Several Ways to Develop iOS Applications on Windows</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Thu, 03 Sep 2026 09:44:15 +0000</pubDate>
      <link>https://dev.to/objc_coder/several-ways-to-develop-ios-applications-on-windows-50p</link>
      <guid>https://dev.to/objc_coder/several-ways-to-develop-ios-applications-on-windows-50p</guid>
      <description>&lt;p&gt;Previously, a colleague of mine encountered a situation where the company-issued computer was Windows, but the project required participation in iOS development. A troublesome aspect of iOS development is the environment lock-in: macOS + Xcode is a hard requirement, and Windows cannot directly compile and sign iOS apps. Later, after trying several different approaches, we found that although each has limitations, each also has its own applicable scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install macOS in a Virtual Machine
&lt;/h2&gt;

&lt;p&gt;The most straightforward approach is to run macOS on Windows through a virtual machine. Install a macOS image in VMware Workstation or VirtualBox, then install Xcode and the iOS SDK inside the virtual machine. This effectively gives you a complete Mac development environment running on Windows. The advantage is that you can run the full Xcode, including Instruments and the debugger. The disadvantages include high hardware requirements—at least 16 GB of RAM, CPU with virtualization support—and significant disk space taken up. Running macOS on non-Apple hardware also has licensing restrictions. In terms of compilation speed, Xcode in a virtual machine is considerably slower than on a real Mac, and for large projects, every clean build takes a long time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compiling on a Remote Mac
&lt;/h2&gt;

&lt;p&gt;Another approach is to write code on a local Windows machine and remotely connect to a Mac for compilation. On Windows, you use VS Code or any editor for development, then SSH into the remote Mac and use the &lt;code&gt;xcodebuild&lt;/code&gt; command to package. This approach gives you freedom in your coding environment—you can use your preferred editor, plugins, and fonts. The remote Mac can be a shared Mac mini or a Mac server.&lt;/p&gt;

&lt;p&gt;The main drawback is that compilation and debugging are split between two separate environments. You write code on Windows, push it to the remote for compilation, and when errors occur, you switch back to local to fix them—each iteration cycle is much longer than local development. Certificates and provisioning profiles must also be managed on the remote Mac, and compilation can easily time out when the network is unstable. If you only occasionally participate in iOS development, it’s acceptable; but when it becomes frequent, efficiency suffers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using KXApp on Windows
&lt;/h2&gt;

&lt;p&gt;KXApp takes a different approach than the two previous options. It is built on VS Code, and the editor itself runs natively on Windows. The difference is that it includes an iOS compilation toolchain, allowing you to compile and sign apps without installing Xcode on the system. From creating Swift, Objective-C, or Flutter projects to building IPA files, everything can be done on Windows.&lt;/p&gt;

&lt;p&gt;For real-device debugging, iOS devices connect to the Windows PC via USB, and KXApp can directly recognize the device. Click the one-click build and install button, and the tool automatically handles signing and deployment—no need to operate a remote Mac or configure virtual machine network bridging. If your project uses Flutter, KXApp directly supports Dart compilation to iOS, saving the step of configuring the Xcode toolchain in the Flutter environment.&lt;/p&gt;

&lt;p&gt;There is still no perfect solution for iOS development on Windows; each approach has its own trade-offs and focuses. The virtual machine approach is feature-complete but resource-intensive and consumes disk space. Remote compilation is flexible but switching between multiple environments hampers efficiency. KXApp covers the main phases of iOS development—coding, real-device debugging, and packaging—making it suitable for fast development, real-device testing, and daily verification in a Windows environment, reducing dependence on Mac hardware.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What other handy tools are there for iOS development? An IDE that doesn't require Xcode</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Wed, 02 Sep 2026 09:52:21 +0000</pubDate>
      <link>https://dev.to/objc_coder/what-other-handy-tools-are-there-for-ios-development-an-ide-that-doesnt-require-xcode-5gnl</link>
      <guid>https://dev.to/objc_coder/what-other-handy-tools-are-there-for-ios-development-an-ide-that-doesnt-require-xcode-5gnl</guid>
      <description>&lt;p&gt;I've noticed that iOS devs around me are often running low on storage space. Xcode takes up over a dozen gigabytes, the Simulator eats tens of gigabytes across a few versions, and on top of that there's DerivedData and various caches—a 256GB Mac will show red within half a year. Before every major version update, you have to delete a bunch of things to make room. Once I was complaining in a group about not having enough disk space, and someone replied, "You actually don't need to install Xcode." I didn't believe it at first.&lt;/p&gt;

&lt;p&gt;Later, in another developer group, I saw someone discuss a tool called KXApp that lets you do iOS development without installing Xcode. My first reaction was: isn't it common knowledge that iOS development is tied to Xcode? But looking at the description, it has a built-in compilation toolchain, so you can compile and sign apps without Xcode installed on the system. It's built on VS Code, with the same shortcuts, plugin ecosystem, and interface layout as VS Code, so your editor habits basically carry over. Everything from creating a project to running on a real device happens in one interface—no switching between different tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  When might you reach for it
&lt;/h2&gt;

&lt;p&gt;After some thought, I came up with a few scenarios where it genuinely helps.&lt;/p&gt;

&lt;p&gt;First, scenarios where the team includes Windows developers. A hard requirement for iOS development is having a Mac, but occasionally front-end or server-side engineers need to collaborate on iOS modules, or new members temporarily use Windows because Mac resources are scarce. In a pure Windows environment, the traditional approach to writing iOS code is either setting up a remote Mac as a build machine or running macOS in a virtual machine. The former lengthens the process and hurts efficiency; the latter demands high hardware specs and degrades the experience.&lt;/p&gt;

&lt;p&gt;Second, scenarios for quickly validating prototypes. Sometimes you just want to run a small demo to see how it looks, but changing one line of code means launching Xcode, waiting for indexing to complete, then clicking Run and waiting for the build—in a large project, that's several minutes each time. Simple UI tweaks or small logic changes could be done in a lighter editor, making the iteration pace much smoother.&lt;/p&gt;

&lt;p&gt;Third, Flutter projects. Flutter developers who write Dart on a Mac traditionally rely on Xcode's toolchain for iOS compilation validation. But if your main job is Flutter business logic and iOS is only for packaging and real-device verification, installing a full Xcode just for that isn't cost-effective.&lt;/p&gt;

&lt;p&gt;There's also a very practical issue—disk space. Xcode updates add over a dozen gigabytes every major release, the iOS SDK keeps growing, and the storage on older Macs gets tighter. If you can remove Xcode from the daily workflow, you free up a lot of room.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is it suitable for
&lt;/h2&gt;

&lt;p&gt;In these scenarios, KXApp positions itself as a supplementary tool. Creating a project doesn't require ticking off tons of template options in Xcode; connect an iPhone and build with one click, and it includes built-in support for Flutter iOS compilation. Development, debugging, and packaging all happen in the same interface.&lt;/p&gt;

&lt;p&gt;Can it completely replace Xcode? For complex project configuration, visual Storyboard editing, and Instruments performance analysis, you still need to go back to Xcode. But if you mainly write business code, or develop Flutter with tight Mac resources, KXApp is worth installing as an alternative. Having more options never hurts.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>iPhone Real-Device Debugging Methods: Solutions from a Push Notification Permission Issue</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Wed, 02 Sep 2026 09:26:26 +0000</pubDate>
      <link>https://dev.to/objc_coder/iphone-real-device-debugging-methods-solutions-from-a-push-notification-permission-issue-2oe3</link>
      <guid>https://dev.to/objc_coder/iphone-real-device-debugging-methods-solutions-from-a-push-notification-permission-issue-2oe3</guid>
      <description>&lt;p&gt;The QA colleague reported that the push notification authorization dialog did not appear after the app was installed for the first time. I initially thought it was an API timing issue, but later discovered that the problem only occurs on real devices. In the simulator, everything works fine. During that troubleshooting, I re-compiled the common methods for debugging on a real iPhone, because many iOS features can only be verified on a device, such as push notifications, Bluetooth, camera, Face ID, background location, and Apple Sign-In. These behaviors involve system permissions and real hardware, which the simulator cannot fully cover.&lt;/p&gt;

&lt;h2&gt;
  
  
  Xcode Direct Connection Debugging: The Most Common Approach
&lt;/h2&gt;

&lt;p&gt;The first real-device debugging method most iOS developers encounter is Xcode. Connect the iPhone, select the device, click Run, and the IDE automatically builds and installs the app. During debugging, you can directly view console logs, crash information, memory usage, and network requests. The advantage of this method is completeness. Project management, compilation, and debugging are all done in the same environment. However, as projects become more complex, some teams begin to split the development workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using TestFlight for Real-Environment Verification
&lt;/h2&gt;

&lt;p&gt;Some issues are not suitable for debugging via a development build, such as differences in review environment, Release configuration behavior, or real user permission flows. In such cases, many teams distribute test versions via TestFlight. The typical process is: Build IPA → Upload to App Store Connect → Install via TestFlight. This approach is closer to the production environment, but the downside is obvious: every modification requires a rebuild and upload. If you're only debugging UI or APIs, the entire feedback loop can be quite long.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wireless Debugging: Reducing Device Connection Efforts
&lt;/h2&gt;

&lt;p&gt;Later, Apple added wireless debugging. After the first connection, you can continue debugging over the local network. For those who frequently test page layouts or animations, this reduces many cable plug/unplug actions. However, it still relies on a full IDE, and the build and installation process remains unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Log Tools to Aid Real-Device Troubleshooting
&lt;/h2&gt;

&lt;p&gt;Some problems do not directly cause crashes, such as an empty API field, abnormal background state transitions, or inconsistent permission states. In these cases, many developers also use the following tools:&lt;/p&gt;

&lt;h3&gt;
  
  
  Charles
&lt;/h3&gt;

&lt;p&gt;Used for packet capture, viewing requests, and analyzing API responses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Console.app
&lt;/h3&gt;

&lt;p&gt;Used for viewing device system logs and analyzing runtime status.&lt;/p&gt;

&lt;p&gt;These tools do not run the app directly, but they help diagnose real-device behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging Methods in Flutter and Hybrid Projects
&lt;/h2&gt;

&lt;p&gt;After cross-platform projects appeared, the real-device debugging workflow has also changed. For example, a Flutter project uses "flutter run" to directly install and run on a device, and hot reload shortens page verification time. However, when a project includes Flutter, Swift, and Objective-C together, the development process becomes more complex, and some changes still require going back through the iOS build process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools That Begin to Re-integrate the Real-Device Debugging Workflow
&lt;/h2&gt;

&lt;p&gt;In recent years, some new iOS development tools have emerged that no longer completely separate "editing," "compiling," and "running on a real device." Recently, I came across &lt;strong&gt;Kuaixie (kxapp)&lt;/strong&gt;. Its special feature is that real-device debugging capabilities are directly embedded in the IDE. It currently supports Swift projects, Objective-C projects, and Flutter projects. After modifying code, you can directly build, install to iPhone, and run on the real device. The editor is based on the VSCode architecture and also includes its own iOS compilation tool suite. For those who frequently modify UI, debug interactions, or verify permission behaviors, this approach reduces tool switching in the development process.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Issue of Real-Device Debugging Is Feedback Speed
&lt;/h2&gt;

&lt;p&gt;Different tools are addressing this issue. Some choose Xcode direct connection debugging, TestFlight for verifying the real environment, or Flutter hot reload, while others are beginning to try integrated workflows.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>iOS App Submission Pitfalls: Common Issues and Solutions for Certificates, Packaging, and Submission Review</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Tue, 01 Sep 2026 09:22:31 +0000</pubDate>
      <link>https://dev.to/objc_coder/ios-app-submission-pitfalls-common-issues-and-solutions-for-certificates-packaging-and-7hk</link>
      <guid>https://dev.to/objc_coder/ios-app-submission-pitfalls-common-issues-and-solutions-for-certificates-packaging-and-7hk</guid>
      <description>&lt;p&gt;I used to think that as long as the code was fine, submitting an iOS app was easy. But after uploading one myself, I realized that most of the process is spent dealing with certificates, provisioning profiles, and various ITMS errors. Knowing these pitfalls in advance can save a lot of time. This iOS submission guide lists several typical issues we encountered, explaining the cause and solution for each.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certificate-Related Issues
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Wrong certificate type.&lt;/strong&gt; Development certificates are only for debugging on a real device; you must use a Distribution certificate for submission. If you select the wrong one during packaging, the upload will fail with an invalid signature. Check which type is currently used in Keychain. If you don't have a Mac, &lt;strong&gt;Appuploader&lt;/strong&gt; lets you directly regenerate a Distribution certificate on Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forgotten P12 password.&lt;/strong&gt; The password you set for the P12 file when generating the certificate cannot be retrieved if forgotten; you have to regenerate it. It's recommended to record this password separately and not mix it with your Apple ID password.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Certificate not available on another computer.&lt;/strong&gt; If the certificate is generated on one Mac, it won't be available on another. You need to export the .p12 and provisioning profile, then import them on the new computer. Alternatively, tools like Appuploader can sync certificates to the cloud, allowing other computers to download them directly after login, avoiding manual copying and transfer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provisioning Profile Issues
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Provisioning profile type mismatch.&lt;/strong&gt; You must use an App Store type profile for submission; selecting Ad Hoc or Development will cause upload errors. Check the type carefully when creating it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bundle ID mismatch.&lt;/strong&gt; If the Bundle ID used for packaging doesn't match the provisioning profile, signature verification fails. Make sure both are consistent when creating a new project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test device UDID not in the provisioning profile.&lt;/strong&gt; For Ad Hoc distribution, if the tester's UDID is not included in the profile, the app cannot be installed on that device. The App Store type for submission does not have device limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upload and Build Version Issues
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Build version not showing.&lt;/strong&gt; After a successful upload, the build may not appear in App Store Connect. Possible reasons: the build version number (CFBundleVersion) duplicates a previous submission—change it in Info.plist and rebuild; the upload is still processing—wait 5-15 minutes and refresh; using a free Apple ID—it has no distribution rights and can only create development certificates. Uploading to a different App Store Connect account can also cause it not to show. If you resubmit with a different developer account, confirm the app record exists under the new account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ITMS errors.&lt;/strong&gt; ITMS-90189 means duplicate build version, fix it and re-upload. ITMS-90101 is a certificate issue—check if the Distribution certificate is expired or whether the provisioning profile type is correct. ITMS-90704 indicates incorrect icon size—adjust to the required size and rebuild. ITMS-90076 means the image has an Alpha channel (transparent background)—use a tool to remove the channel and save as an opaque format. UnknownError usually occurs when the app record hasn't been created in App Store Connect—create the app first, then upload. ITMS-90161 is a configuration issue during packaging—check the signing settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submission Review Notes
&lt;/h2&gt;

&lt;p&gt;Screenshot sizes not meeting App Store specifications, missing privacy policy links, user permission descriptions not included in the review notes, and not providing a test account for login-required apps are common rejection reasons. Going through the checkpoints in this iOS submission guide before submitting can reduce the chance of rejection. If rejected, modify the corresponding issues based on Apple's feedback and resubmit; you don't need to go through the entire submission process again.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>Complete Step-by-Step Guide to Publishing an iOS App to the App Store with Appuploader: From Certificates to Submission</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Fri, 28 Aug 2026 10:29:40 +0000</pubDate>
      <link>https://dev.to/objc_coder/complete-step-by-step-guide-to-publishing-an-ios-app-to-the-app-store-with-appuploader-from-aek</link>
      <guid>https://dev.to/objc_coder/complete-step-by-step-guide-to-publishing-an-ios-app-to-the-app-store-with-appuploader-from-aek</guid>
      <description>&lt;h1&gt;
  
  
  Complete Step-by-Step Guide to Publishing an iOS App to the App Store with Appuploader: From Certificates to Submission
&lt;/h1&gt;

&lt;p&gt;Recently, I helped a team release a version. Their development machines were all Windows, and the project used Flutter. The package was built as an .ipa, but how to get it to the App Store? We tried Xcode Organizer — it can't be installed. Transporter — only has a macOS version. fastlane — it depends on xcrun at the core, and the CI also needs a Mac node. After researching, we found that Appuploader can complete the entire process on Windows: certificate creation, provisioning profile generation, IPA upload, and batch screenshot management. Here's a record of our operations in order that day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certificates and Provisioning Profiles: Creating from Scratch on Windows
&lt;/h2&gt;

&lt;p&gt;Before publishing, you need to configure certificates. The normal process involves generating a CSR using Keychain on a Mac, submitting it to developer.apple.com, downloading the .cer, and importing it back into Keychain to convert it to a .p12 — the entire process depends on macOS, and none of it can be done on Windows. Appuploader compresses these steps into a single interface: go to certificate management, click add, select iOS Distribution as the type, enter a name and P12 password, and click OK to generate. It's done in minutes, without touching Keychain or understanding what CSR is. The generated .p12 can be exported and shared with other team members, so everyone can use the same certificate across different computers without each person having to apply separately.&lt;/p&gt;

&lt;p&gt;Provisioning profiles are also handled in the same tool. Select the corresponding App ID, check the test devices, click create, and it's done. If you need to add new test devices during development, the UDID can be automatically read from the phone connected to the computer, saving manual input. You need to distinguish the purpose here: for publishing, you must use a Distribution certificate paired with an App Store type provisioning profile. Development is only suitable for debugging on real devices; using it to upload a release build will cause errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  IPA Upload and Channel Selection
&lt;/h2&gt;

&lt;p&gt;Once the certificates are in place, go to the submission upload interface. Select the compiled .ipa file, and switch the upload channel in the upper-right corner — the tool provides four options: 1, 2, 3, and the legacy channel. Different broadband operators respond differently to these channels. If the default doesn't work, switch to the legacy channel or retry with a mobile hotspot. This trick has resolved multiple cases of uploads getting stuck.&lt;/p&gt;

&lt;p&gt;Enter the Apple upload-specific password (the app-specific password generated in your appleid.apple.com account, not your login password), then click upload. After the progress bar completes, Apple will send a confirmation email. Here's a detail: if the app record hasn't been created in App Store Connect yet, the upload will prompt "No suitable application records were found" — go to App Store Connect first to create a new app, fill in the Bundle ID and basic information, then come back to upload.&lt;/p&gt;

&lt;p&gt;If you need to integrate with CI, the tool also provides a command-line version:&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; your@apple.com &lt;span class="nt"&gt;-p&lt;/span&gt; xxxx-xxxx-xxxx &lt;span class="nt"&gt;-c&lt;/span&gt; 1 &lt;span class="nt"&gt;-f&lt;/span&gt; app.ipa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command works on both Windows and Linux, so there's no need for a Mac node. It's suitable for integrating into Jenkins or GitLab CI, allowing automatic packaging and uploading after each code commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do When the Build Doesn't Appear
&lt;/h2&gt;

&lt;p&gt;After uploading, you sometimes can't see the build in App Store Connect; I've encountered this a few times. The troubleshooting path is fairly fixed: first wait 5-15 minutes for Apple to process it. If it still doesn't appear, check the version number — if CFBundleShortVersionString or CFBundleVersion duplicates a previously submitted one, you need to change it in Info.plist, rebuild, and upload again. Also, check the account: a free Apple ID can only generate development certificates for internal testing and cannot upload release builds. You must use a developer account that has paid the $99 annual fee.&lt;/p&gt;

&lt;p&gt;Another situation is when you selected a Development or Ad Hoc provisioning profile during upload. These are only suitable for internal test distribution, and the App Store won't receive the build. Make sure you use an iOS Distribution provisioning profile, repackage, and upload again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch Processing of Screenshots and Metadata
&lt;/h2&gt;

&lt;p&gt;Before submission, you also need to prepare screenshots and metadata. Appuploader's batch upload feature lets you select multiple screenshots of different sizes at once, and the tool automatically assigns them to the corresponding device positions and language versions. There's no need to drag and drop each screenshot one by one on the App Store Connect web page. If the project supports both iPhone and iPad, just place the two sets of images in the corresponding directories when batch uploading. App description, keywords, and multilingual information are also managed on the same page. After filling in and saving, the data syncs to the developer backend, eliminating the need to switch pages repeatedly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submitting for Review
&lt;/h2&gt;

&lt;p&gt;After completing all the steps above, return to App Store Connect and click Submit for Review. From a Windows machine, you can handle certificates, upload the IPA, manage screenshots and metadata, and finally submit for review — the entire chain is viable, so you don't need to prepare a dedicated Mac for releases. If your team has both Mac and Windows development machines, Windows colleagues can fully participate in release operations without having to wait to borrow a machine each time.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>A Complete Guide to iOS Certificate Management: From Creation to Renewal</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Thu, 27 Aug 2026 08:34:46 +0000</pubDate>
      <link>https://dev.to/objc_coder/a-complete-guide-to-ios-certificate-management-from-creation-to-renewal-4plp</link>
      <guid>https://dev.to/objc_coder/a-complete-guide-to-ios-certificate-management-from-creation-to-renewal-4plp</guid>
      <description>&lt;p&gt;iOS certificate management is one of the most overlooked yet error-prone aspects of development. Expired certificates prevent app submission, forgotten updates to the provisioning profile's device list prevent test devices from installing the IPA, and chaotic certificate file sharing among team members during collaboration — almost every team has encountered these issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certificate Types and Purposes
&lt;/h2&gt;

&lt;p&gt;iOS certificates come in two types: development certificates and distribution certificates. Development certificates are used to install apps on physical devices for debugging, with a maximum of 2 per developer. Distribution certificates are used for App Store submission or Ad Hoc distribution, with a maximum of 3.&lt;/p&gt;

&lt;p&gt;Provisioning profiles correspond to either development or distribution types. Development provisioning profiles must include the UDIDs of test devices, while distribution profiles do not bind to devices. A single certificate can be referenced by multiple provisioning profiles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certificate Lifecycle Management
&lt;/h2&gt;

&lt;p&gt;iOS certificates are valid for one year. Once expired, apps already on the App Store are unaffected — users who have installed the app with the old certificate can continue using it normally. However, to submit a version update, you must repackage with a new certificate.&lt;/p&gt;

&lt;p&gt;It is recommended to start renewal operations one month before the certificate expires. Regenerate the certificate in the Apple Developer Center or Appuploader, then create new provisioning profiles with the new certificate. The old certificate's P12 file can be retired, but keeping a backup for reference is advisable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certificate Security
&lt;/h2&gt;

&lt;p&gt;P12 files contain private keys, so password protection is mandatory. It is recommended to manage the passwords set during certificate generation centrally and avoid overly simple passwords. Do not mix passwords across different projects' certificates.&lt;/p&gt;

&lt;p&gt;Do not transmit P12 files in plaintext. When uploading to shared storage, compress with a password, or use Appuploader's certificate sync feature — once enabled, certificates can be downloaded and used across computers, avoiding leakage during transfer. Free developer accounts only have a 7-day validity; after expiration, delete and regenerate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Device and Multi-Member Management
&lt;/h2&gt;

&lt;p&gt;Managing certificates on a single Mac for an individual developer is straightforward — install them in the keychain and Xcode associates automatically. Team collaboration adds complexity. Each member's Mac needs to import the P12 file. If someone forgets the P12 password or loses the file, all provisioning profiles and build processes depending on that certificate will be affected.&lt;/p&gt;

&lt;p&gt;It is recommended to have one person centrally manage certificates and provisioning profiles. After creating certificates in Appuploader, enable the certificate sync feature. Other members can log in with the same account and use them directly without needing to pass P12 files individually. Provisioning profiles are also centrally managed, with device list updates modified directly in the tool.&lt;/p&gt;

&lt;p&gt;If using Fastlane match, you can manage certificates securely through an encrypted Git repository. match syncs all certificates and provisioning profiles via an encrypted Git repository, combined with the Appuploader command-line version for uploads. This enables versioned management of certificates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Issues
&lt;/h2&gt;

&lt;p&gt;Certificate installation error "Valid signing identity not found" — re-download the certificate and import it into Keychain or Appuploader. If a provisioning profile indicates a device is not included — update the device UDID in provisioning profile management. If a signing error occurs during build — check that the correct certificate is selected for Code Signing Identity in the project's Build Settings.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>software</category>
    </item>
    <item>
      <title>Complete App Store Submission Guide: Certificates, Provisioning Profiles, and Windows Publishing</title>
      <dc:creator>ObjC_Coder</dc:creator>
      <pubDate>Thu, 20 Aug 2026 09:12:45 +0000</pubDate>
      <link>https://dev.to/objc_coder/complete-app-store-submission-guide-certificates-provisioning-profiles-and-windows-publishing-45h8</link>
      <guid>https://dev.to/objc_coder/complete-app-store-submission-guide-certificates-provisioning-profiles-and-windows-publishing-45h8</guid>
      <description>&lt;p&gt;When submitting to the App Store for the first time, the most troublesome part is the process involving certificates and provisioning profiles. It's even more difficult without a Mac—the traditional approach requires finding a Mac to generate certificates, export P12 files, create provisioning profiles, and then use Xcode to upload. Later, I found that using a cross-platform tool can bypass the Mac environment dependency, and the entire process can be done on a single Windows machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparation Before Submission
&lt;/h2&gt;

&lt;p&gt;First, you need to register an Apple Developer account. Register at developer.apple.com and pay an annual fee of 688 RMB. A free account can only be used for debugging on a real device and cannot be used to submit apps. After account registration, you need to generate an app-specific password: enable two-factor authentication on the Apple ID page, create an app-specific password, which will be used when uploading the IPA.&lt;/p&gt;

&lt;p&gt;To submit an app, you need three things: a certificate (P12), a provisioning profile, and an IPA installation package. The certificate is used for signing, the provisioning profile binds the app's Bundle ID and certificate, and the IPA is the compiled application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Completing the Entire Process with Appuploader
&lt;/h2&gt;

&lt;p&gt;On the homepage of Appuploader, you can select three modules: Certificate Management, Provisioning Profile Management, and Submission Upload, which correspond to the three core steps of the submission process.&lt;/p&gt;

&lt;p&gt;Certificate Management: Click "Add" to create a certificate, select Development or Distribution type, fill in the name and password, and the tool will automatically generate a P12 file. Distribution certificates are used for submitting to the App Store, while development certificates are used for testing installations.&lt;/p&gt;

&lt;p&gt;Provisioning Profile Management: Click "New Provisioning Profile", fill in the name, select the type (choose App Store type for distribution), and the corresponding Bundle ID. The Bundle ID must match the one in your project; otherwise, packaging and installation will fail. If you have test devices, the development provisioning profile needs to add the device UDIDs. Once Appuploader is connected to the device, it can automatically read the UDIDs.&lt;/p&gt;

&lt;p&gt;IPA Upload: On the submission upload screen, select the IPA file, the upload channel, and the app-specific password for the Apple account, then click Upload. Appuploader provides multiple upload channels, and you can switch if the network is not good. After successful upload, wait a few minutes, and the build version will appear on iTunes Connect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Steps to Note
&lt;/h2&gt;

&lt;p&gt;Before submission, make sure the app icon and screenshot sizes meet the requirements. At least two screen sizes are required: 5.5-inch and 6.5-inch. You can use Appuploader's batch upload feature to upload screenshots at once. If the app does not support iPad, uploading only these two sizes is sufficient.&lt;/p&gt;

&lt;p&gt;Regarding filing, apps released in China also need to complete APP filing. You need to fill in the package name, signing information, and operation information on Alibaba Cloud or Tencent Cloud, and after obtaining the filing number, fill it in the App Store review information.&lt;/p&gt;

&lt;p&gt;After uploading, if the build version does not appear on iTunes Connect, wait for ten to twenty minutes and refresh. If it still does not appear, check whether the IPA version number duplicates a previously submitted version, or try uploading again using the command-line version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Suggestions
&lt;/h2&gt;

&lt;p&gt;The first submission process is relatively lengthy. It is recommended to first go through certificate and provisioning profile creation in Appuploader, confirm that the Bundle ID matches the app configuration, and then build the IPA package. After the toolchain is well-coordinated, subsequent updates will only require rebuilding and uploading the IPA.&lt;/p&gt;

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