1<!DOCTYPE html> 2<html lang="en"> 3 4<head> 5 <meta charset="utf-8"> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 <meta name="google-site-verification" content="xBT4GhYoi5qRD5tr338pgPM5OWHHIDR6mNg1a3euekI" /> 8 <meta name="viewport" content="width=device-width, initial-scale=1"> 9 <meta name="description" content="å ³äºç§»å¨å¼åä¸è®¾è®¡ãçæ´»ä¸èºæ¯ | Mushank, Mobile Dev & Design, Life & Art | è¿éæ¯ @Jack ç个人å客ï¼ä¸ä½ ä¸èµ·åç°æ´å¤§çä¸çã"> 10 <meta name="keyword" content="Jack, MUSHANK, BLOG"> 11 <link rel="shortcut icon" href="/img/favicon.ico"> 12 13 <title>iOSå¼åï½App Store Connect API è°ç æ¥å - MUSHANK (Jack)</title> 14 15 <link rel="canonical" href="http://127.0.0.1:4000/post/iOS%E5%BC%80%E5%8F%91-App-Store-Connect-API-%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A.md"> 16 17 <!-- Bootstrap Core CSS --> 18 <link rel="stylesheet" href="/css/bootstrap.min.css"> 19 20 <!-- Custom CSS --> 21 <link rel="stylesheet" href="/css/hux-blog.min.css"> 22 23 <!-- Pygments Github CSS --> 24 <link rel="stylesheet" href="/css/syntax.css"> 25 26 <!-- Custom Fonts --> 27 <!-- <link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css"> --> 28 <!-- Hux change font-awesome CDN to qiniu --> 29 <link href="http://cdn.staticfile.org/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet" type="text/css"> 30 31 32 <!-- Hux Delete, sad but pending in China 33 <link href='http://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic' rel='stylesheet' type='text/css'> 34 <link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/ 35 css'> 36 --> 37 38 39 <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> 40 <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> 41 <!--[if lt IE 9]> 42
42<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
42 43
43<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
43 44 <![endif]--> 45 46 <!-- ga & ba script hoook --> 47
47<script></script>
47 48</head> 49 50 51<!-- hack iOS CSS :active style --> 52<body ontouchstart=""> 53 54 <!-- Navigation --> 55<nav class="navbar navbar-default navbar-custom navbar-fixed-top"> 56 <div class="container-fluid"> 57 <!-- Brand and toggle get grouped for better mobile display --> 58 <div class="navbar-header page-scroll"> 59 <button type="button" class="navbar-toggle"> 60 <span class="sr-only">Toggle navigation</span> 61 <span class="icon-bar"></span> 62 <span class="icon-bar"></span> 63 <span class="icon-bar"></span> 64 </button> 65 <a class="navbar-brand" href="/">MUSHANK</a> 66 </div> 67 68 <!-- Collect the nav links, forms, and other content for toggling --> 69 <!-- Known Issue, found by Hux: 70 <nav>'s height woule be hold on by its content. 71 so, when navbar scale out, the <nav> will cover tags. 72 also mask any touch event of tags, unfortunately. 73 --> 74 <div id="huxblog_navbar"> 75 <div class="navbar-collapse"> 76 <ul class="nav navbar-nav navbar-right"> 77 <li> 78 <a href="/">Home</a> 79 </li> 80 81 <li> 82 <a href="/about">About</a> 83 </li> 84 85 <li> 86 <a href="/tags">Tags</a> 87 </li> 88 89 </ul> 90 </div> 91 </div> 92 <!-- /.navbar-collapse --> 93 </div> 94 <!-- /.container --> 95</nav>
96<script> 97 // Drop Bootstarp low-performance Navbar 98 // Use customize navbar with high-quality material design animation 99 // in high-perf jank-free CSS3 implementation 100 var $body = document.body; 101 var $toggle = document.querySelector('.navbar-toggle'); 102 var $navbar = document.querySelector('#huxblog_navbar'); 103 var $collapse = document.querySelector('.navbar-collapse'); 104 105 $toggle.addEventListener('click', handleMagic) 106 function handleMagic(e){ 107 if ($navbar.className.indexOf('in') > 0) { 108 // CLOSE 109 $navbar.className = " "; 110 // wait until animation end. 111 setTimeout(function(){ 112 // prevent frequently toggle 113 if($navbar.className.indexOf('in') < 0) { 114 $collapse.style.height = "0px" 115 } 116 },400) 117 }else{ 118 // OPEN 119 $collapse.style.height = "auto" 120 $navbar.className += " in"; 121 } 122 } 123</script>
123 124 125 126 <!-- Post Header --> 127<style type="text/css"> 128 header.intro-header{ 129 background-image: url('/img/post-img/post-bg-ios.jpg') 130 } 131</style> 132<header class="intro-header" > 133 <div class="container"> 134 <div class="row"> 135 <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1"> 136 <div class="post-heading"> 137 <div class="tags"> 138 139 <a class="tag" href="/tags/#iOS" title="iOS">iOS</a> 140 141 <a class="tag" href="/tags/#WWDC18" title="WWDC18">WWDC18</a> 142 143 <a class="tag" href="/tags/#App Store Connect API" title="App Store Connect API">App Store Connect API</a> 144 145 </div> 146 <h1>iOSå¼åï½App Store Connect API è°ç æ¥å</h1> 147 148 149 <h2 class="subheading">èªå¨åæ§è¡ä½ å¨Appleå¼åè ç½ç«åApp Store Connectä¸çä»»å¡</h2> 150 151 <span class="meta">Posted by Jack on October 22, 2018</span> 152 </div> 153 </div> 154 </div> 155 </div> 156</header> 157 158<!-- Post Content --> 159<article> 160 <div class="container"> 161 <div class="row"> 162 163 <!-- Post Container --> 164 <div class=" 165 col-lg-8 col-lg-offset-2 166 col-md-10 col-md-offset-1 167 post-container"> 168 169 <h2 id="æ¦è§">æ¦è§</h2> 170 171<p>App Store Connect APIæ¯ä¸å¥æ åçRESTæ¥å£ï¼ç¨äºå¨Appçå½å¨æä¸æå»ºèªå®ä¹ç工使µï¼å¹¶èªå¨æ§è¡ä½ å¨App Store Connectä¸çæä½ãè¿å¥API使ç¨JSON Web Tokensï¼JWTï¼è¿è¡ææè®¤è¯ï¼è¿åç»ä¸çJSONæ ¼å¼ååºæ°æ®ï¼ååºæ°æ®å å«äºæåå ¶ä»ç¸å ³èµæºç龿¥ï¼ä½ å¯ä»¥ä½¿ç¨è¿äºå ³ç³»é¾æ¥å¯¼èªå°å ¶ä»ç¸å ³èµæºã</p> 172 173<blockquote> 174 <p>éè¦</p> 175 176 <p>éè¿App Store Connect APIè¿è¡ç任使´æ¹é½å°å½±åç¨äºå¼ååååççäº§æ°æ®ã</p> 177</blockquote> 178 179<p>API为èªå¨åApp Store Connectç以ä¸åè½æä¾äºæä½èµæºï¼</p> 180 181<ul> 182 <li>TestFlightï¼ç®¡çä½ çæµè¯å ï¼æµè¯äººå以念è¯å°ç»</li> 183 <li>ç¨æ·å¯èè½ï¼æ·»å ãå é¤ç¨æ·ï¼è°æ´ç¨æ·æé</li> 184 <li>æ¥åï¼ä¸è½½éå®åè´¢å¡æ¥å</li> 185</ul> 186 187<blockquote> 188 <p>å¨<a href="https://developer.apple.com/videos/play/wwdc2018/303/">WWDC18: Automating App Store Connect</a>ä¸è¿æå°å¯ä»¥èªå¨åæå¡é ç½®æä»¶ï¼Provisioningï¼:</p> 189 190 <ul> 191 <li>çææå¡é ç½®æä»¶ï¼Generate provisioning profilesï¼</li> 192 <li>åå»ºåæ¤éç¾åè¯ä¹¦ï¼Create and revoke signing cerï¼</li> 193 <li>管ç设å¤ä¸bundle IDï¼manager devices and bundle IDsï¼</li> 194 </ul> 195 196 <p>ä½å¨å®é çAPIææ¡£ä¸ï¼å¹¶æªåç°æ¤é¨åæ¥å£è½åã</p> 197</blockquote> 198 199<h2 id="æ¥å£è½å">æ¥å£è½å</h2> 200<blockquote> 201 <p><strong>å ¨é¨æ¥å£è½åå·²æ±æ»å°è¡¨æ ¼ï¼</strong><a href="https://www.icloud.com/numbers/0wZO_iubg9VdZ77rr9NmS2wvg#App_Store_Connect_API_List">App Store Connect API List.numbers</a></p> 202</blockquote> 203 204<h4 id="1-ææ">1. ææ</h4> 205<p>è¿é¨å说æå¦ä½ä½¿ç¨ç§é¥ï¼API Keyï¼çæJWTï¼JSON Web Tokenï¼ä¸ºæ¯ä¸ªAPI请æ±è¿è¡ææã</p> 206 207<ul> 208 <li>为App Store Connect APIå建å¯é¥ï¼API Keyï¼ï¼ç¨äºçæéªè¯è¯·æ±çJWT 209 <ul> 210 <li>å¯é¥çè®¿é®æéä¸è½è®¾å®ä¸ºä» éäºæä¸ªï¼äºï¼ç¹å®çåºç¨ç¨åºï¼æçè§£æ¯åªè½è®¾ç½®ä¸ºå 许访é®å ¨é¨Appï¼éè¦å®æéªè¯ï¼</li> 211 <li><a href="https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api">åç宿¹ææ¡£</a></li> 212 </ul> 213 </li> 214 <li>为API请æ±çæä»¤çï¼JWTï¼ 215 <ul> 216 <li>ææçAPI请æ±å¤´ä¸é½å¿ é¡»æºå¸¦è¯¥ä»¤ç</li> 217 <li>WWDCä¸Apple宿¹æåºï¼ä»¤ç20min失æï¼å»ºè®®æ¯18minéæ°çæä¸æ¬¡</li> 218 <li><a href="https://developer.apple.com/documentation/appstoreconnectapi/generating_tokens_for_api_requests">åç宿¹ææ¡£</a></li> 219 </ul> 220 </li> 221</ul> 222 223<p><em>举ä¾ï¼JWTçRubyå®ç°ï¼</em></p> 224 225<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">require</span> <span class="s1">
225'base64'</span> 226<span class="nb">require</span> <span class="s1">'jwt'</span> 227 228<span class="no">ISSUER_ID</span> <span class="o">=</span> <span class="s2">""</span> <span class="c1"># å¤å¶ä½ çISSUER_IDå°æ¤å¤</span> 229<span class="no">KEY_ID</span> <span class="o">=</span> <span class="s2">""</span> <span class="c1"># å¤å¶ä½ çKEY_IDå°æ¤å¤</span> 230<span class="n">private_key</span> <span class="o">=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">PKey</span><span class="p">.</span><span class="nf">read</span><span class="p">(</span><span class="no">File</span><span class="p">.</span><span class="nf">read</span><span class="p">(</span><span class="s2">"/Users/demo/Downloads/AuthKey_#(KEY_ID).p8"</span><span class="p">))</span> 231 232<span class="n">token</span> <span class="o">=</span> <span class="no">JWT</span><span class="p">.</span><span class="nf">encode</span> <span class="p">{</span> 233 <span class="p">{</span> 234 <span class="ss">iss: </span><span class="no">ISSUER_ID</span><span class="p">,</span> <span class="c1"># found on API Keys tab</span> 235 <span class="ss">exp: </span><span class="no">Time</span><span class="p">.</span><span class="nf">now</span><span class="p">.</span><span class="nf">ti_i</span> <span class="o">+</span> <span class="mi">20</span> <span class="o">*</span> <span class="mi">24</span><span class="p">,</span> <span class="c1"># up to 20 minutes in the future</span> 236 <span class="ss">aud: </span><span class="s2">"appstoreconnect-v1"</span> <span class="c1"># 常é</span> 237 <span class="p">},</span> 238 <span class="n">private_key</span><span class="p">,</span> 239 <span class="s2">"ES256"</span><span class="p">,</span> 240 <span class="n">header_fields</span><span class="o">=</span> <span class="p">{</span> 241 <span class="ss">kid: </span><span class="no">KEY_ID</span> <span class="c1"># found on API Keys tab</span> 242 <span class="p">}</span> 243<span class="p">}</span> 244 245<span class="nb">puts</span> <span class="n">token</span> 246</code></pre></div></div> 247 248<ul> 249 <li>ç§»é¤å¯é¥ï¼API Keyï¼ 250 <ul> 251 <li>å½å¯é¥ä¸åä½¿ç¨æè åçå¯é¥æ³æ¼æ¶ï¼åºè¯¥ç«å³ç§»é¤å¯¹åºå¯é¥</li> 252 <li><a href="https://developer.apple.com/documentation/appstoreconnectapi/revoking_api_keys">åç宿¹ææ¡£</a></li> 253 </ul> 254 </li> 255</ul> 256 257<h4 id="2-æµè¯testing--testflight">2. æµè¯ï¼Testing / TestFlightï¼</h4> 258 259<p>è¿é¨åä»ç»äºå¦ä½ç®¡çæµè¯ï¼TestFlightï¼èµæºã</p> 260 261<p>TestFlightå 许æä»¬å¨ä¸æ¶åºç¨ååºä¹åï¼å°Appååç»æµè¯äººåè¿è¡æµè¯ã使ç¨APIå¯ä»¥èªå¨åæ§è¡å¨App Store ConnectçTestFlighté项ä¸è¿è¡çå·¥ä½ï¼å æ¬é请æµè¯äººåï¼ç®¡çæå»ºçæ¬ãæµè¯ç¾¤ç»ãTestFlightå ¬å ±é¾æ¥ï¼æäº¤ç¼è¯çæ¬è¿è¡å¤é¨æµè¯çã</p> 262 263<h5 id="21-æµè¯äººåbeta-testers">2.1 æµè¯äººåï¼Beta Testersï¼</h5> 264 265<p><code class="language-plaintext highlighter-rouge">betaTesters</code> èµæºä»£è¡¨å¯ä»¥å®è£ åæµè¯é¢åå¸æå»ºçæ¬çç¨æ·ãéè¿APIä½ å¯ä»¥å¯¹æµè¯äººåè¿è¡å¢å æ¹æ¥æä½ï¼å¯ä»¥ä¿®æ¹æµè¯äººåä¸åºç¨ç¨åºãæå»ºçæ¬ãæµè¯ç¾¤ç»ä¹é´çå ³èå ³ç³»ã</p> 266 267<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 268 269<ul> 270 <li>å建æå 餿µè¯äººåï¼è·åæä¸ªæå ¨é¨æµè¯äººå</li> 271 <li>å°æµè¯äººåæ·»å æç§»åºä¸ä¸ªæå¤ä¸ªæµè¯ç¾¤ç»</li> 272 <li>èµäºæè§£é¤æµè¯äººå对æä¸ªæå»ºçæ¬çæµè¯æé</li> 273 <li>è§£é¤æµè¯äººå对ä¸ä¸ªæå¤ä¸ªAppçæææå»ºçæ¬çæµè¯æé</li> 274 <li>è·åæå®æµè¯äººåå ·ææµè¯æéçAppéåæAppçèµæºIDéå</li> 275 <li>è·åæå®æµè¯äººåå ·ææµè¯æéçæå»ºçæ¬éåææå»ºçæ¬çèµæºIDéå</li> 276 <li>è·åæå®æµè¯äººåæå±çæµè¯ç¾¤ç»éåææµè¯ç¾¤ç»çèµæºIDéå</li> 277</ul> 278 279<h5 id="22-æµè¯é请beta-tester-invitations">2.2 æµè¯é请ï¼Beta Tester Invitationsï¼</h5> 280 281<p><code class="language-plaintext highlighter-rouge">betaTesterInvitations</code>èµæºç¨æ¥åå·²åå¨çæµè¯äººååéæµè¯é请é®ä»¶ã</p> 282 283<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 284 285<ul> 286 <li>åæµè¯äººååéæéæ°åéæµè¯é请é®ä»¶ 287 <ul> 288 <li>å°æµè¯äººåå å ¥æµè¯ç¾¤ç»ææå»ºçæ¬æ¶ï¼å¦ææ¤æ¶Appå·²ç»å¯ä»¥æµè¯ï¼TestFlightä¼èªå¨åæµè¯äººååéæµè¯éè¯·ï¼æ¤æ¶è°ç¨è¯¥æ¥å£ä¸ºéæ°åéæµè¯é请é®ä»¶</li> 289 <li>å¦æä½ å ³éäºèªå¨éç¥ï¼æ¤æ¶è°ç¨è¯¥æ¥å£ä¸ºé¦æ¬¡åéé请é®ä»¶</li> 290 </ul> 291 </li> 292</ul> 293 294<h5 id="23-æµè¯ç¾¤ç»beta-groups">2.3 æµè¯ç¾¤ç»ï¼Beta Groupsï¼</h5> 295 296<p><code class="language-plaintext highlighter-rouge">betaGroups</code>èµæºä»£è¡¨ä¸ç»æ¥ææäºæå»ºçæ¬æµè¯æéçæµè¯äººç¾¤ãä¸ä¸ªæµè¯ç¾¤ç»ä¸ä¸ä¸ªAppç¸å ³èï¼å¹¶ä¸å å«ä¸ä¸ªæå¤ä¸ªæå»ºçæ¬ãéè¿APIä½ å¯ä»¥æ§å¶æµè¯ç¾¤ç»ä¸æµè¯äººåãåºç¨ç¨åºãæå»ºçæ¬ä¹é´çå ³èå ³ç³»ï¼å¹¶ä¸è½å¤æ§å¶TestFlightå ¬å ±æµè¯é¾æ¥çå¯ç¨ç¶æã</p> 297 298<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 299 300<ul> 301 <li>å建æä¿®æ¹æå 餿µè¯ç¾¤ç»ï¼è·åæä¸ªæå ¨é¨æµè¯ç¾¤ç» 302 <ul> 303 <li>å建æ¶å¿ é¡»ä¸æä¸ªAppå ³èï¼å¯éæ©å¼å¯æ¯å¦å¯ç¨TestFlightå ¬å ±
303龿¥</li> 304 </ul> 305 </li> 306 <li>è·åæå®æµè¯ç¾¤ç»å çåºç¨ç¨åºä¿¡æ¯æåºç¨ç¨åºèµæºID</li> 307 <li>æ·»å æç§»é¤æå®æµè¯ç¾¤ç»å çæµè¯äººåï¼è·åæå®æµè¯ç¾¤ç»å çæµè¯äººåéåææµè¯äººåèµæºIDéå</li> 308 <li>æ·»å æç§»é¤æå®æµè¯ç¾¤ç»å çæå»ºçæ¬ï¼è·åæå®æµè¯ç¾¤ç»å çæå»ºçæ¬éåææå»ºçæ¬èµæºIDéå</li> 309</ul> 310 311<h5 id="24-åºç¨ç¨åºapps">2.4 åºç¨ç¨åºï¼Appsï¼</h5> 312 313<p><code class="language-plaintext highlighter-rouge">apps</code> èµæºä»£è¡¨ä½ æ£å¨å¼åæè å·²ç»å¯ä»¥å¨App Storeè¿è¡åå¸çåºç¨ç¨åºãâ ï¸ï¼ä½ å¿ é¡»ä½¿ç¨ç½é¡µçConnectæXcodeæTransporterè¿è¡æå»ºçæ¬çä¸ä¼ ï¼APIä¸å è®¸ç´æ¥ä¸ä¼ Appçæå»ºçæ¬ï¼ä½APIçå¯é¥å¯ä»¥ä¸Transporterå ±äº«ä½¿ç¨ã</p> 314 315<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 316 317<ul> 318 <li>è·åApp Store Connectä¸çåºç¨ç¨åºéåï¼è·åæå®åºç¨ç¨åºçä¿¡æ¯</li> 319 <li>ç§»é¤æµè¯äººå对æå®åºç¨ç¨åºçæµè¯æé</li> 320 <li>è·åæå®åºç¨ç¨åºçæµè¯ç¾¤ç»éåææµè¯ç¾¤ç»çèµæºIDéå</li> 321 <li>è·åæå®åºç¨ç¨åºçæå»ºçæ¬éåææå»ºçæ¬çèµæºIDéå</li> 322 <li>è·åæå®åºç¨ç¨åºçé¢å叿µè¯çæ¬ï¼æçå¾ åå¸çæµè¯çæ¬ï¼<code class="language-plaintext highlighter-rouge">PrereleaseVersion</code>ï¼éåæé¢å叿µè¯çæ¬çèµæºIDéå</li> 323 <li>è·åæå®åºç¨ç¨åºçæµè¯çæ¬å®¡æ ¸è¯¦ç»ä¿¡æ¯ï¼<code class="language-plaintext highlighter-rouge">BetaAppReviewDetail</code>ï¼æè¯¦ç»ä¿¡æ¯çèµæºID</li> 324 <li>è·åæå®åºç¨ç¨åºçæµè¯è¯ä¹¦è®¸å¯åè®®ï¼<code class="language-plaintext highlighter-rouge">BetaLicenseAgreement</code>ï¼æè®¸å¯åè®®çèµæºID</li> 325 <li>è·åæå®åºç¨ç¨åºçæ¬å°åæµè¯ä¿¡æ¯ï¼<code class="language-plaintext highlighter-rouge">BetaAppLocalization</code>ï¼éåææµè¯ä¿¡æ¯çèµæºIDéå</li> 326</ul> 327 328<h5 id="25-é¢å叿µè¯çæ¬prerelease-versions">2.5 é¢å叿µè¯çæ¬ï¼Prerelease Versionsï¼</h5> 329 330<p><code class="language-plaintext highlighter-rouge">preReleaseVersions</code>èµæºæä»£TestFlightä¸çæµè¯ç¨åºç¨ç¨åºçæ¬ï¼å¹¶éæçå¾ åå¸è³åºç¨ååºççæ¬ã</p> 331 332<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 333 334<ul> 335 <li>è·åå ¨é¨åºç¨ç¨åºçé¢å叿µè¯çæ¬éå</li> 336 <li>è·åæå®é¢å叿µè¯çæ¬çä¿¡æ¯</li> 337 <li>è·åæå®é¢å叿µè¯çæ¬çåºç¨ç¨åºä¿¡æ¯æåºç¨ç¨åºèµæºID</li> 338 <li>è·åæå®é¢å叿µè¯çæ¬çæå»ºçæ¬éåææå»ºçæ¬çèµæºIDéå</li> 339</ul> 340 341<h5 id="26-æµè¯çåºç¨ç¨åºæ¬å°åbeta-app-localizations">2.6 æµè¯çåºç¨ç¨åºæ¬å°åï¼Beta App Localizationsï¼</h5> 342 343<p><code class="language-plaintext highlighter-rouge">betaAppLocalization</code>èµæºè¡¨ç¤ºä¸ç»å¯¹æµè¯äººåå¯è§çåºç¨ç¨åºæ¬å°åé 置信æ¯ãå½ä½ å¨TestFlightä¸åå¸ä¸ä¸ªæµè¯çæ¬æ¶ï¼æµè¯äººåä¼å¨ä»ä»¬ç设å¤ä¸çå°ç¸å ³çæè¿°ãURLãéç§æ¿ççã</p> 344 345<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 346 347<ul> 348 <li>åå»ºææ´æ°æå é¤ä¸ä¸ªæ¬å°åé ç½®</li> 349 <li>è·åæå®æå ¨é¨åºç¨ç¨åºçæ¬å°åé ç½®</li> 350 <li>è·å䏿å®çæ¬å°åé ç½®ç¸å ³èçåºç¨ç¨åºæå ¶èµæºID</li> 351</ul> 352 353<h5 id="27-åºç¨ç¨åºå å¯å£°æapp-encryption-declarations">2.7 åºç¨ç¨åºå å¯å£°æï¼App Encryption Declarationsï¼</h5> 354 355<p><code class="language-plaintext highlighter-rouge">AppEncryptionDeclaration</code>èµæºä»£è¡¨åºç¨ç¨åºå¨æ°æ®å 坿¹é¢ç使ç¨å£°æï¼éè¿è¯¥èµæºï¼ä½ è¿å¯ä»¥å¯¹æå»ºçæ¬è¿è¡å£°ææå®ãâ ï¸ï¼å±æ§<code class="language-plaintext highlighter-rouge">usesNonExemptEncryption</code>设置为<code class="language-plaintext highlighter-rouge">true</code>çæå»ºçæ¬ï¼å¿ é¡»ä¸æä¸ªå å¯å£°æåå ³èï¼å¦åä¸å 许æäº¤æµè¯å®¡æ ¸ã</p> 356 357<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 358 359<ul> 360 <li>è·åæå®æå ¨é¨å å¯å£°æ</li> 361 <li>仿å®çå å¯å£°æè·åç¸å ³èçåºç¨ç¨åºä¿¡æ¯æå ¶èµæºID</li> 362 <li>å°æå®çå å¯å£°æå ³èå°æå»ºçæ¬</li> 363</ul> 364 365<h5 id="28-æµè¯è®¸å¯åè®®beta-license-agreements">2.8 æµè¯è®¸å¯åè®®ï¼Beta License Agreementsï¼</h5> 366 367<p><code class="language-plaintext highlighter-rouge">betaLicenseAgreements</code>èµæºå å«äºåæµè¯ç¨æ·æä¾ç许å¯åè®®ãæ¯ä¸ªåºç¨ç¨åºé½å¿ é¡»è¦æä¸ä»½è®¸å¯åè®®ã</p> 368 369<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 370 371<ul> 372 <li>è·åæå®æå ¨é¨æµè¯è®¸å¯åè®®</li> 373 <li>è·åæå®æµè¯è®¸å¯åè®®ä¸çåºç¨ç¨åºæå ¶èµæºID</li> 374 <li>ç¼è¾æå®çæµè¯è®¸å¯åè®®</li> 375</ul> 376 377<h5 id="28-æå»ºçæ¬builds">2.8 æå»ºçæ¬ï¼Buildsï¼</h5> 378 379<p><code class="language-plaintext highlighter-rouge">build</code>èµæºä»£è¡¨æä¸ªåºç¨ç¨åºçä¸ä¸ªæå»ºçæ¬ãä½ å¯ä»¥ä½¿ç¨Xcodeæè Transporterä¸ä¼ æå»ºçæ¬ï¼ä¸æ¦App Store Connectå¤çå®æï¼æå»ºçæ¬å°±ä¼ä»¥<code class="language-plaintext highlighter-rouge">build</code>èµæºçå½¢å¼åºç°ã使ç¨APIå¯ä»¥å¯¹è¯¥èµæºè¿è¡æäº¤æµè¯å®¡æ ¸ãæ·»å å°æµè¯äººåææµè¯ç¾¤ç»çæä½ã</p> 380 381<p>å ·ä½æ¥å£è½åå¦ä¸</p> 382 383<ul> 384 <li>
384è·åæå®æå ¨é¨æå»ºçæ¬</li> 385 <li>ç¼è¾æå®æå»ºçæ¬ï¼ä½¿å ¶è¿æææ´æ¹å å¯è®¾ç½®</li> 386 <li>è·åä¸æå®æå»ºçæ¬ç¸å ³èçåºç¨ç¨åºæå ¶èµæºID</li> 387 <li>è·åä¸æå®æä»¶çæ¬ç¸å ³èçé¢å叿µè¯çæ¬æå ¶èµæºIDéå</li> 388 <li>为æå»ºçæ¬æ·»å å å¯å£°æ</li> 389 <li>为æµè¯ç¾¤ç»æ·»å æåæ¶æå»ºçæ¬çæµè¯æé</li> 390 <li>为æå»ºçæ¬æ·»å æç§»é¤åç¬çæµè¯äººå</li> 391 <li>è·åæå®æå»ºçæ¬çå ¨é¨ç¬ç«æµè¯äººåéåæå ¶èµæºIDéå</li> 392 <li>è·åæå®æå»ºçæ¬çæµè¯æäº¤å®¡æ ¸ç¶ææå ¶èµæºID</li> 393 <li>è·åæå®æå»ºçæ¬çè¯¦ç»æµè¯ä¿¡æ¯ï¼<code class="language-plaintext highlighter-rouge">BuildBetaDetail</code>ï¼æå ¶èµæºID</li> 394 <li>è·åæå®æå»ºçæ¬çå å¯å£°ææå ¶èµæºID</li> 395 <li>è·åæå®æå»ºçæ¬çæ¬å°åé ç½®æå ¶èµæºID</li> 396</ul> 397 398<h5 id="29-æå»ºçæ¬æµè¯è¯¦ç»ä¿¡æ¯build-beta-details">2.9 æå»ºçæ¬æµè¯è¯¦ç»ä¿¡æ¯ï¼Build Beta Detailsï¼</h5> 399 400<p>æ¯ä¸ªæå»ºçæ¬é½æä¸ä¸ª<code class="language-plaintext highlighter-rouge">buildBetaDetails</code>èµæºï¼è¡¨ç¤ºè¯¥æå»ºçæ¬ç¹å®äºTestFlightçä¿¡æ¯ã</p> 401 402<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 403 404<ul> 405 <li>è·åæå®æå ¨é¨æµè¯è¯¦ç»ä¿¡æ¯</li> 406 <li>è·å䏿宿µè¯è¯¦ç»ä¿¡æ¯ç¸å ³èçæå»ºçæ¬æå ¶èµæºID</li> 407 <li>ç¼è¾æå®çæµè¯è¯¦ç»ä¿¡æ¯</li> 408</ul> 409 410<h5 id="210-æå»ºçæ¬æ¬å°åbeta-build-localizations">2.10 æå»ºçæ¬æ¬å°åï¼Beta Build Localizationsï¼</h5> 411 412<p><code class="language-plaintext highlighter-rouge">betaBuildLocalizations</code>èµæºè¡¨ç¤ºTestFlightä¸<code class="language-plaintext highlighter-rouge">What's New</code>ææ¬ä¸æ¾ç¤ºçå 容ã</p> 413 414<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 415 416<ul> 417 <li>è·åæå®æå ¨é¨æ¬å°åé ç½®</li> 418 <li>è·å䏿宿¬å°åé ç½®ç¸å ³èçæå»ºçæ¬ä¿¡æ¯æå ¶èµæºID</li> 419 <li>å建æå 餿ç¼è¾ä¸ä¸ªæ¬å°åé ç½®</li> 420</ul> 421 422<h5 id="211-åºç¨ç¨åºæµè¯å®¡æ ¸è¯¦ç»ä¿¡æ¯beta-app-review-detail">2.11 åºç¨ç¨åºæµè¯å®¡æ ¸è¯¦ç»ä¿¡æ¯ï¼Beta App Review Detailï¼</h5> 423 424<p>åºç¨ç¨åºè¿è¡å¤é¨æµè¯ä¹åå¿ é¡»ç»è¿Appleå®¡æ ¸ï¼<code class="language-plaintext highlighter-rouge">betaAppReviewDetails</code>èµæºå å«äºå®¡æ ¸æ¶éè¦çä¿¡æ¯ï¼æ¯å¦demoè´¦å·ãèç³»æ¹å¼çã</p> 425 426<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 427 428<ul> 429 <li>è·åæå®æå ¨é¨åºç¨ç¨åºçæµè¯å®¡æ ¸è¯¦ç»ä¿¡æ¯</li> 430 <li>è·å䏿宿µè¯å®¡æ ¸è¯¦ç»ä¿¡æ¯ç¸å ³èçåºç¨ç¨åºä¿¡æ¯æå ¶èµæºID</li> 431 <li>ä¿®æ¹æå®çåºç¨ç¨åºæµè¯å®¡æ ¸è¯¦ç»ä¿¡æ¯</li> 432</ul> 433 434<h5 id="212-åºç¨ç¨åºæµè¯å®¡æ ¸æäº¤beta-app-review-submissions">2.12 åºç¨ç¨åºæµè¯å®¡æ ¸æäº¤ï¼Beta App Review Submissionsï¼</h5> 435 436<p><code class="language-plaintext highlighter-rouge">betaAppReviewSubmissions</code>èµæºè¡¨ç¤ºæå»ºçæ¬å¨éè¿TestFlightè¿è¡ååä¹åAppleè¿è¡çå®¡æ ¸ãå¨ä½ çæå»ºçæ¬åå¤å¥½æäº¤æ¶ï¼å建ä¸ä¸ª<code class="language-plaintext highlighter-rouge">betaAppReviewSubmissions</code>ï¼Appleä¼éªè¯è¿ä¸ªèµæºä»¥ç¡®ä¿å ¶å å«å¿ è¦çä¿¡æ¯ï¼æ¯å¦<code class="language-plaintext highlighter-rouge">appEncryptionDeclarations</code> <code class="language-plaintext highlighter-rouge">betaAppReviewDetails</code>çï¼å æ¬æäº¤è¯¥æå»ºçæ¬å°å®¡æ ¸å¢éã</p> 437 438<p>éè¿APIå¯ä»¥æ¥è¯¢è¯¥æäº¤æ¯å¦å·²è¢«éè¿æè 被æç»ã</p> 439 440<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 441 442<ul> 443 <li>æäº¤åºç¨ç¨åºè¿è¡æµè¯å®¡æ ¸ï¼ä»¥å 许è¿è¡å¤é¨æµè¯</li> 444 <li>è·åæå®æå ¨é¨æå»ºçæ¬çæµè¯å®¡æ ¸æäº¤</li> 445 <li>è·å䏿宿µè¯å®¡æ ¸æäº¤ç¸å ³èçæå»ºçæ¬æå ¶èµæºID</li> 446</ul> 447 448<h5 id="213-æå»ºçæ¬æµè¯éç¥build-beta-notifications">2.13 æå»ºçæ¬æµè¯éç¥ï¼Build Beta Notificationsï¼</h5> 449 450<p>使ç¨<code class="language-plaintext highlighter-rouge">buildBetaNotifications</code>èµæºéç¥æµè¯äººåæä¸ªæå»ºçæ¬å·²ä¸ºå¯æµè¯ç¶æã</p> 451 452<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 453 454<ul> 455 <li>åå ³èæµè¯äººåååºéç¥ï¼æä¸ªæå»ºçæ¬å·²å¯ä¾æµè¯</li> 456</ul> 457 458<h4 id="3-ç¨æ·ä¸èè½users-and-roles">3 ç¨æ·ä¸èè½ï¼Users and Rolesï¼</h4> 459 460<h5 id="31-ç¨æ·users">3.1 ç¨æ·ï¼Usersï¼</h5> 461 462<p><code class="language-plaintext highlighter-rouge">users</code>ç¨æ·èµæºè¡¨ç¤ºä½ App Store Connectå¢éä¸çç¨æ·ãä½ å¯ä»¥å é¤ææ´æ¹ç¨æ·ï¼ä½æ¯ä½ ä¸è½éè¿è¯¥èµæºç´æ¥æ·»å ç¨æ·ï¼æ·»å ç¨æ·è¯·ä½¿ç¨<code class="language-plaintext highlighter-rouge">userInvitation</code>èµæºã</p> 463 464<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 465 466<ul> 467 <li>è·åå¢éä¸å ¨é¨ç¨æ·éå</li> 468 <li>è·åæä¿®æ¹æå 餿å®ç¨æ·</li> 469 <li>è·åæå®ç¨æ·å¯è§çå ¨é¨åºç¨ç¨åºæå ¶èµæºID</li> 470 <li>为æå®ç¨æ·æ·»å æç§»é¤å¯è§åºç¨ç¨åº</li> 471 <li>为æå®ç¨æ·æ¿æ¢å¯è§åºç¨ç¨åºéå</li> 472</ul> 473 474<h5 id="32-ç¨æ·é请user-invitations">3.2 ç¨æ·é请ï¼User Invitationsï¼</h5> 475 476<p><code class="language-plaintext highlighter-rouge">userInvitations</code>èµæºè¡¨ç¤ºå·²è¢«åéé请çç¨æ·ï¼ä¸æ¦ç¨æ·æ¥åé请ï¼<code class="language-plaintext highlighter-rouge">user</code>èµæºå°ä¼è¢«å建ï¼å¯¹åºç<code class="language-plaintext highlighter-rouge">userInvitations</code>èµæºå°ä¼è¢«å é¤ãâ ï¸ï¼éè¯·æææåªæ3天ã</p> 477 478<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 479 480<ul> 481 <li>è·åæå®æå ¨é¨çåéç¶æç¨æ·</li> 482 <li>åéæåæ¶ä¸ä¸ªç¨æ·é请</li> 483 <li>æ¥çå¤äºåéç¶æçç¨æ·æææ¥ççåºç¨ç¨åºéåæå ¶èµæºIDéå</li> 484</ul> 485 486<h4 id="4-éå®åè´¢å¡æ¥åsales-and-finance-reports">4 éå®åè´¢å¡æ¥åï¼Sales and Finance Reportsï¼</h4> 487 488<p>
488App Store Connectæä¾æ¥çéå®åè´¢å¡æ¥åçè½åï¼ä¾ä½ è¡¡éåºç¨ç¨åºçç¸å ³è¡¨ç°ãéè¿APIå¹¶é å使ç¨è¿æ»¤å¨ï¼å¯ä»¥èªç±çéæ°æ®è¿è¡èªå¨åä¸è½½éå®åè´¢å¡æ°æ®ãç鿡件æï¼å°åºãæ¥æãæ¥åç±»åçï¼å¯åç宿¹ææ¡£ã</p> 489 490<p>å ·ä½æ¥å£è½åå¦ä¸ï¼</p> 491 492<ul> 493 <li>æ ¹æ®æå®æ¡ä»¶ä¸è½½è´¢å¡æ¥å 494 <ul> 495 <li><a href="https://developer.apple.com/documentation/appstoreconnectapi/download_sales_and_trends_reports">åç宿¹ææ¡£</a></li> 496 </ul> 497 </li> 498 <li>æ ¹æ®æå®æ¡ä»¶ä¸è½½éå®åè¶å¿æ¥å 499 <ul> 500 <li><a href="https://developer.apple.com/documentation/appstoreconnectapi/download_finance_reports">åç宿¹ææ¡£</a></li> 501 </ul> 502 </li> 503</ul> 504 505<h4 id="5-å页">5 å页</h4> 506 507<ul> 508 <li><strong>大忰æ®é</strong> 509 <ul> 510 <li>使ç¨å页信æ¯è·å大忰æ®é</li> 511 </ul> 512 </li> 513</ul> 514 515<h4 id="6-é误å¤ç">6 é误å¤ç</h4> 516<ul> 517 <li><code class="language-plaintext highlighter-rouge">error</code> ä¸ç <code class="language-plaintext highlighter-rouge">id</code> æ¯é误çå¯ä¸æ 示ï¼å¯åé¦ç»Appleè¿è¡å®ä½</li> 518 <li><code class="language-plaintext highlighter-rouge">error</code> ä¸ç <code class="language-plaintext highlighter-rouge">code</code> æ¯ç¨åºä¸å¤çé误åºè¯¥ä½¿ç¨ç屿§ï¼æ¯ç¨³å®çé误å符串 519 <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">></span> <span class="no">GET</span> <span class="sr">/v1/</span><span class="n">betaTesters?filter</span><span class="p">[</span><span class="n">emaill</span><span class="p">]</span><span class="o">=</span><span class="n">kate</span><span class="o">-</span><span class="n">bell</span><span class="o">%</span><span class="mi">22</span><span class="n">mac</span><span class="p">.</span><span class="nf">com</span> 520<span class="no">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">400</span> <span class="no">Bad</span> <span class="no">Request</span> 521<span class="p">{</span> 522 <span class="s2">"errors"</span><span class="p">:</span> <span class="p">[</span> 523 <span class="p">{</span> 524 <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"400"</span><span class="p">,</span> 525 <span class="c1"># errorçå¯ä¸æ 示ï¼å¯åé¦ç»Appleè¿è¡å®ä½</span> 526 <span class="s2">"id"</span><span class="p">:</span> <span class="s2">"5becf2db-2f12-4d6a-9dc2-6ceb33c683b4"</span><span class="p">,</span> 527 <span class="s2">"title"</span><span class="p">:</span> <span class="s2">"A parameter has an invalid value"</span><span class="p">,</span> 528 <span class="s2">"detail"</span><span class="p">:</span> <span class="s2">"'emaill' is not a valid filter type"</span><span class="p">,</span> 529 <span class="c1"># ç¨åºé误å¤ç使ç¨è¯¥code屿§ï¼ç¨³å®çé误å符串</span> 530 <span class="s2">"code"</span><span class="p">:</span> <span class="s2">"PARAMETER_ERROR.INVALID"</span><span class="p">,</span> 531 <span class="s2">"source"</span><span class="p">:</span> <span class="p">{</span> 532 <span class="s2">"parameter"</span><span class="p">:</span> <span class="s2">"filter[emaill]"</span> 533 <span class="p">}</span> 534 <span class="p">}</span> 535 <span class="p">]</span> 536<span class="p">}</span> 537</code></pre></div> </div> 538 </li> 539</ul> 540 541<h2 id="è°ç ç»è®º">è°ç ç»è®º</h2> 542 543<h3 id="appleçèªå¨åè¿ç¨">Appleçèªå¨åè¿ç¨</h3> 544 545<p>Appleå¨WWDC18䏿»ç»çç®åèªå¨åè¿ç¨ï¼</p> 546 547<ul> 548 <li>æå åä¸ä¼ æå»ºçæ¬</li> 549 <li>ä¸è½½å´©æºæ¥å</li> 550 <li>Transporterï¼å½ä»¤è¡å·¥å ·ï¼ 551 <ul> 552 <li>èªå¨ä¸ä¼ metadata.xmlãæå»ºçæ¬ï¼buildsï¼</li> 553 <li>ç°å¨é¤äºMacOSï¼ä¹æ¯æLinuxå¹³å°</li> 554 </ul> 555 </li> 556 <li>Reporterï¼å½ä»¤è¡å·¥å ·ï¼ 557 <ul> 558 <li>ä¸è½½éå®åè´¢å¡æ¥å</li> 559 <li>åAPIçReportsé¨åæ¥å£è½å类似</li> 560 </ul> 561 </li> 562</ul> 563 564<p>App Store Connect APIçæ¨åºï¼å¯ä»¥æ´èªç±çç»åèªå¨å工使µã</p> 565 566<h3 id="ç¬¬ä¸æ¹èªå¨åå·¥å ·">ç¬¬ä¸æ¹èªå¨åå·¥å ·</h3> 567 568<p>ä¸å æ¯è¾æåçèªå¨åå·¥å ·ï¼<a href="https://fastlane.tools/">Fastlane</a>ï¼å¯å®ç°å¦ä¸èªå¨åæµç¨ï¼</p> 569 570<ul> 571 <li>è¿è¡æµè¯å·¥å ·ï¼çææµè¯æ¥å</li> 572 <li>å¢å Buildçæ¬å·</li> 573 <li>æå </li> 574 <li>ä¸ä¼ ï¼æªå¾ï¼å æ°æ®ï¼IPAå ï¼</li> 575 <li>管çTestFlightçæµè¯ç¨æ·ï¼åå¸TestFlightæµè¯</li> 576</ul> 577 578<h3 id="å¢éç°ç¶åæ¼è¿æ¹å">å¢éç°ç¶åæ¼è¿æ¹å</h3> 579 580<p><strong>å¢éç®åçèªå¨åè¿ç¨ï¼</strong></p> 581 582<ul> 583 <li>èªå¨åæå </li> 584 <li>èªå¨åä¸ä¼ æå»ºçæ¬ï¼buildsï¼å°App Store Connect</li> 585</ul> 586 587<p><strong>éè¿App Store Connect APIå¯å¢å /ä¼åçèªå¨åæµç¨ï¼</strong></p> 588 589<ul> 590 <li>èªå¨åç®¡çæµè¯äººå/æµè¯ç¾¤ç» 591 <ul> 592 <li>å æ¬æ·»å ãå é¤ï¼æ´æ¹æéï¼åéæµè¯é请ï¼ç®¡çTestFlightå ¬å ±æµè¯é¾æ¥ç</li> 593 </ul> 594 </li> 595 <li>èªå¨å管çæå»ºçæ¬ï¼buildsï¼çé ç½®ä¸æµè¯å®¡æ ¸æäº¤æä½ï¼<strong>é åèªå¨æå ä¸ä¼ ï¼å¯å®ç°TestFlightçå ¨èªå¨å</strong> 596 <ul> 597 <li>å æ¬æ¬å°åãå å¯å£°æã许å¯åè®®ãå®¡æ ¸ä¿¡æ¯ãæäº¤å®¡æ ¸ãå®¡æ ¸ç»æï¼BetaAppReviewSubmissionResponseï¼ãåéå¯ä¾æµè¯éç¥ï¼BuildBetaNotificationï¼</li> 598 <li>â ï¸å¹¶éæäº¤App Storeçå®¡æ ¸</li> 599 </ul> 600 </li> 601 <li>èªå¨å管çApp Store Connectå¢éæå 602 <ul> 603 <li>å æ¬é请ãç§»é¤ãæé设置ç</li> 604 </ul> 605 </li> 606 <li>èªå¨åæåéå®åè´¢å¡æ¥å</li> 607 <li>èªå¨å管ç设å¤ãè¯ä¹¦ãBundleIDãæè¿°æä»¶ 608 <ul> 609 <li>â ï¸<em>è¿é¨åå 容å¨WWDC18ä¸æç¡®æåºæ¯æï¼ä½Appleç®åè¿æªæä¾æ¥å£ææ¡£ï¼åç»æä¾åå¯è¿è¡ç¸åºå·¥ä½ã</em></li> 610 </ul> 611 </li> 612</ul> 613 614<h2 id="qa">Q&A</h2> 615<p>é®ï¼æ¯å¦å¯ä»¥ä½¿ç¨APIè¿è¡åºç¨ç¨åºå¨App Storeçæå®¡æä½ï¼ 616çï¼å¾ä¸å¹¸ï¼ä¸å¯ä»¥ã使¯APIå è®¸ä½ æä½TestFlight䏿µè¯çæ¬çå®¡æ ¸æäº¤æä½ã</p> 617 618<h2 id="åè">åè</h2> 619<h4 id="宿¹åè">宿¹åèï¼</h4> 620 621<ol> 622 <li><a href="https://developer.apple.com/videos/play/wwdc2018/301/">WWDC18 Whatâs New in App Store Connect</a></li> 623 <li><a href="https://developer.apple.com/videos/play/wwdc2018/303/">WWDC18 Automating App Store Connect</a></li> 624 <li><a href="https://developer.apple.com/documentation/appstoreconnectapi">App Store Connect API Documentation</a></li> 625</ol> 626 627<h4 id="ç¬¬ä¸æ¹åè">ç¬¬ä¸æ¹åèï¼</h4> 628 629<ol> 630 <li><a href="https://www.avanderlee.com/swift/app-store-connect-api-adoption/">App Store Connect API adoption with use case examples</a></li> 631 <li><a href="https://www.xcteq.co.uk/xcblog/wwdc18-a-basic-guide-to-app-store-connect-api/">WWDC18: A Basic Guide to App Store Connect API</a></li> 632 <li><a href="https://www.xcteq.co.uk/xcblog/app-store-connect-api-is-here-how-to-prepare-for-it/">App Store Connect API is Here: How To Prepare For It</a></li> 633 <li><a href="https://fastlane.tools/">https://fastlane.tools/</a></li> 634</ol> 635 636 637 <hr> 638 639 640 641 642 <ul class="pager"> 643 644 <li class="previous"> 645 <a href="/post/iOS%E5%BC%80%E5%8F%91-WWDC18-Automating-App-Store-Connect" data-toggle="tooltip" data-placement="top" title="iOSå¼åï½WWDC18 Automating App Store Connect">← Previous Post</a> 646 </li> 647 648 649 </ul> 650 651 652 653 654 655 <!-- disqus è¯è®ºæ¡ start --> 656 <div class="comment"> 657 <div id="disqus_thread" class="disqus-thread"></div> 658 </div> 659 <!-- disqus è¯è®ºæ¡ end --> 660 661 662 </div> 663 664 <!-- Sidebar Container --> 665 <div class=" 666 col-lg-8 col-lg-offset-2 667 col-md-10 col-md-offset-1 668 sidebar-container"> 669 670 <!-- Featured Tags --> 671 672 <section> 673 <hr class="hidden-sm hidden-xs"> 674 <h5><a href="/tags/">FEATURED TAGS</a></h5> 675 <div class="tags"> 676 677 678 <a href="/tags/#PAT" title="PAT" rel="3"> 679 PAT 680 </a> 681 682 683 684 <a href="/tags/#C" title="C" rel="2"> 685 C 686 </a> 687 688 689 690 691 692 <a href="/tags/#Python" title="Python" rel="12"> 693 Python 694 </a> 695 696 697 698 <a href="/tags/#C++" title="C++" rel="3"> 699 C++ 700 </a> 701 702 703 704 <a href="/tags/#STL" title="STL" rel="3"> 705 STL 706 </a> 707 708 709 710 711 712 713 714 715 716 717 718 <a href="/tags/#Usage" title="Usage" rel="6"> 719 Usage 720 </a> 721 722 723 724 725 726 <a href="/tags/#Git" title="Git" rel="2"> 727 Git 728 </a> 729 730 731 732 733 734 <a href="/tags/#iOS" title="iOS" rel="15"> 735 iOS 736 </a> 737 738 739 740 741 742 <a href="/tags/#Xcode" title="Xcode" rel="2"> 743 Xcode 744 </a> 745 746 747 748 <a href="/tags/#ARC" title="ARC" rel="2"> 749 ARC 750 </a> 751 752 753 754 <a href="/tags/#MRC" title="MRC" rel="2"> 755 MRC 756 </a> 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 <a href="/tags/#WWDC2018" title="WWDC2018" rel="2"> 791 WWDC2018 792 </a> 793 794 795 796 <a href="/tags/#App Store Connect API" title="Ap
796p Store Connect API" rel="3"> 797 App Store Connect API 798 </a> 799 800 801 802 803 </div> 804 </section> 805 806 807 <!-- Friends Blog --> 808 809 <hr> 810 <h5>FRIENDS</h5> 811 <ul class="list-inline"> 812 813 <li><a href="https://www.objc.io/">ojbc.io</a></li> 814 815 <li><a href="https://objccn.io/">objccn.io</a></li> 816 817 <li><a href="https://onevcat.com/">OneV's Den</a></li> 818 819 <li><a href="http://blog.sunnyxx.com/">sunnyxx</a></li> 820 821 </ul> 822 823 </div> 824 </div> 825 </div> 826</article> 827 828 829 830 831 832<!-- disqus å ¬å ±JS代ç start (ä¸ä¸ªç½é¡µåªéæå ¥ä¸æ¬¡) -->
833<script type="text/javascript"> 834 /* * * CONFIGURATION VARIABLES * * */ 835 var disqus_shortname = "mushank"; 836 var disqus_identifier = "/post/iOSå¼åï½App Store Connect API è°ç æ¥å.md"; 837 var disqus_url = "http://127.0.0.1:4000/post/iOS%E5%BC%80%E5%8F%91-App-Store-Connect-API-%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A.md"; 838 839 (function() { 840 var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; 841 dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; 842 (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); 843 })(); 844</script>
844 845<!-- disqus å ¬å ±JS代ç end --> 846 847 848 849 850<!-- async load function -->
851<script> 852 function async(u, c) { 853 var d = document, t = 'script', 854 o = d.createElement(t), 855 s = d.getElementsByTagName(t)[0]; 856 o.src = u; 857 if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); } 858 s.parentNode.insertBefore(o, s); 859 } 860</script>
860 861<!-- anchor-js, Doc:http://bryanbraun.github.io/anchorjs/ -->
862<script> 863 async("http://cdn.bootcss.com/anchor-js/1.1.1/anchor.min.js",function(){ 864 anchors.options = { 865 visible: 'always', 866 placement: 'right', 867 icon: '#' 868 }; 869 anchors.add().remove('.intro-header h1').remove('.subheading').remove('.sidebar-container h5'); 870 }) 871</script>
871 872<style> 873 /* place left on bigger screen */ 874 @media all and (min-width: 800px) { 875 .anchorjs-link{ 876 position: absolute; 877 left: -0.75em; 878 font-size: 1.1em; 879 margin-top : -0.1em; 880 } 881 } 882</style> 883 884 885 886 <!-- Footer --> 887<footer> 888 <div class="container"> 889 <div class="row"> 890 <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1"> 891 <ul class="list-inline text-center"> 892 893 894 <li> 895 <a href="https://twitter.com/realmushank"> 896 <span class="fa-stack fa-lg"> 897 <i class="fa fa-circle fa-stack-2x"></i> 898 <i class="fa fa-twitter fa-stack-1x fa-inverse"></i> 899 </span> 900 </a> 901 </li> 902 903 904 <!-- add Weibo, Zhihu by Hux, add target = "_blank" to <a> by Hux --> 905 906 907 <li> 908 <a target="_blank" href="http://weibo.com/mushank"> 909 <span class="fa-stack fa-lg"> 910 <i class="fa fa-circle fa-stack-2x"></i> 911 <i class="fa fa-weibo fa-stack-1x fa-inverse"></i> 912 </span> 913 </a> 914 </li> 915 916 917 918 919 920 <li> 921 <a target="_blank" href="https://github.com/mushank"> 922 <span class="fa-stack fa-lg"> 923 <i class="fa fa-circle fa-stack-2x"></i> 924 <i class="fa fa-github fa-stack-1x fa-inverse"></i> 925 </span> 926 </a> 927 </li> 928 929 </ul> 930 <p class="copyright text-muted"> 931 Copyright © MUSHANK 2023 932 <br> 933 Theme by <a href="https://github.com/mushank">Jack</a> | 934 <iframe 935 style="margin-left: 2px; margin-bottom:-5px;" 936 frameborder="0" scrolling="0" width="100px" height="20px" 937 src="https://ghbtns.com/github-btn.html?user=mushank&repo=mushank.github.io&type=star&count=true" > 938 </iframe> 939 </p> 940 </div> 941 </div> 942 </div> 943</footer> 944 945<!-- jQuery -->
946<script src="/js/jquery.min.js "></script>
946 947 948<!-- Bootstrap Core JavaScript -->
949<script src="/js/bootstrap.min.js "></script>
949 950 951<!-- Custom Theme JavaScript -->
952<script src="/js/hux-blog.min.js "></script>
952 953 954 955<!-- async load function -->
956<script> 957 function async(u, c) { 958 var d = document, t = 'script', 959 o = d.createElement(t), 960 s = d.getElementsByTagName(t)[0]; 961 o.src = u; 962 if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); } 963 s.parentNode.insertBefore(o, s); 964 } 965</script>
965 966 967<!-- 968 Because of the native support for backtick-style fenced code blocks 969 right within the Markdown is landed in Github Pages, 970 From V1.6, There is no need for Highlight.js, 971 so Huxblog drops it officially. 972 973 - https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0 974 - https://help.github.com/articles/creating-and-highlighting-code-blocks/ 975--> 976<!-- 977
977<script> 978 async("http://cdn.bootcss.com/highlight.js/8.6/highlight.min.js", function(){ 979 hljs.initHighlightingOnLoad(); 980 }) 981 </script>
981 982 <link href="http://cdn.bootcss.com/highlight.js/8.6/styles/github.min.css" rel="stylesheet"> 983--> 984 985 986<!-- jquery.tagcloud.js -->
987<script> 988 // only load tagcloud.js in tag.html 989 if($('#tag_cloud').length !== 0){ 990 async("/js/jquery.tagcloud.js",function(){ 991 $.fn.tagcloud.defaults = { 992 //size: {start: 1, end: 1, unit: 'em'}, 993 color: {start: '#bbbbee', end: '#0085a1'}, 994 }; 995 $('#tag_cloud a').tagcloud(); 996 }) 997 } 998</script>
998 999 1000<!--fastClick.js -->
1001<script> 1002 async("http://cdn.bootcss.com/fastclick/1.0.6/fastclick.min.js", function(){ 1003 var $nav = document.querySelector("nav"); 1004 if($nav) FastClick.attach($nav); 1005 }) 1006</script>
1006 1007 1008 1009<!-- Google Analytics --> 1010
1011<script> 1012 // dynamic User by Hux 1013 var _gaId = 'UA-87707150-1'; 1014 var _gaDomain = ''; 1015 1016 // Originial 1017 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 1018 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 1019 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 1020 })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 1021 1022 ga('create', _gaId, _gaDomain); 1023 ga('send', 'pageview'); 1024</script>
1024 1025 1026 1027 1028<!-- Baidu Tongji --> 1029 1030 1031 1032</body> 1033 1034</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.