左手中指麻木是什么原因| 孤注一掷什么意思| 虹为什么是虫字旁| 4月20号是什么星座| 反应迟钝是什么原因造成的| 艾滋病初期有什么症状| 梦见蒸馒头是什么意思| 陆陆续续是什么意思| 脚崴了吃什么药| 盆腔积液有什么症状有哪些| 喝老陈皮水有什么好处| 成双成对是什么生肖| 神龙摆尾什么意思| 八字比肩是什么意思| 什么降血糖| 叶酸是什么维生素| 石膏的主要成分是什么| 卷柏属于什么植物| 经常吃南瓜有什么好处和坏处| 尿ph值是什么| mk属于什么档次| 发烧不能吃什么东西| 贪恋是什么意思| 长白头发缺什么维生素| 病毒性心肌炎吃什么药| 骨蒸是什么意思| 沙僧是什么生肖| 人间烟火是什么意思| 猫怕什么声音| 弟弟的孩子叫姐姐什么| 爱新觉罗改成什么姓了| 血小板低是什么意思| 系列是什么意思| 舌苔黄腻吃什么中成药| 小猫为什么会踩奶| 三鹿奶粉现在叫什么| 感冒全身酸痛吃什么药| 什么是公历年份| 身是什么结构| kb是什么| 硬度不够吃什么中成药| 舌根痛吃什么药好得快| 失眠为什么开奥氮平片| 神机妙算是什么生肖| 6d是什么意思| 什么是卧蚕| 银925是什么意思| 耐人寻味什么意思| 三个鬼念什么| 男女身份证号码有什么区分| 什么的形象| 乳头痛是什么原因| 女人梦见猪是什么预兆| 什么是员额制| 越字五行属什么| 肾功能不好吃什么药| 大脑缺氧有什么症状| 梦见缝被子是什么意思| 梦到死去的亲人是什么意思| 非营利性医院是什么意思| 胎心停了是什么原因引起的| 济南为什么叫泉城| 孝庄是康熙的什么人| 什么血型生出o型血| 癔症是什么病| 玄孙是什么意思| 新陈代谢是什么| 大熊猫吃什么| 沙茶是什么| 经期是什么意思| 空灵是什么意思| 八卦是什么生肖| 改嫁是什么意思| 牛奶洗脸有什么好处| 肾虚吃什么食物好| pouch什么意思| 软笔书法是什么| 开塞露属于什么剂型| 宫腔积液是什么意思| 蛾子吃什么| rh血型D阳性是什么意思| 李开复是什么人| 子宫为什么会长息肉| 温碧泉属于什么档次| 春分是什么意思| 心电图j点抬高什么意思| 手脚肿胀是什么原因| 怀孕需要注意什么| 检查胃应该挂什么科| 眉下有痣代表什么| 十月6号是什么星座| 才貌双全是什么生肖| 支气管扩张是什么原因引起| 眼睛老是肿着是什么原因造成的| 血脂是什么意思| 骨质增生吃什么药效果好| 阳历是什么意思| 风寒感冒吃什么药最快| 桂枝和肉桂有什么区别| 07年属什么生肖| 红萝卜和胡萝卜有什么区别| 淋巴门消失是什么意思| 咽后壁淋巴滤泡增生吃什么药| span是什么意思| vodka是什么酒| nu11是什么意思| 吴孟达什么时候去世的| 马蜂吃什么| 脚气泡脚用什么泡最好| 孔子是什么家| plt是什么意思| 有恃无恐什么意思啊| 相对湿度是什么意思| 手上三条线分别代表什么| 什么动物菩萨心肠| 全身骨显像是查什么的| 胃火吃什么食物好| 黄疸高有什么危害| 干贝是什么| 一只脚面肿是什么原因| 拉肚子应该吃什么药| 什么的爱| cue什么意思| 头晕晕的是什么原因| 蜘蛛痣是什么样的| 老蒯是什么意思| 莱卡是什么面料| 包皮是什么样子图片| 吃什么解腻| 三尖瓣反流什么意思| 刑警队是干什么的| 什么品牌的沙发好| 蝉的幼虫叫什么| 卯戌相合发生什么| 甲沟炎用什么药好| ca199偏高是什么原因| 扬州瘦马什么意思| 治痛风吃什么药| 吃什么补充黄体酮| 红红的太阳像什么| gln是什么氨基酸| 蒲公英叶和根的功效有什么不同| 海鲜配啤酒有什么反应| 眼冒金星是什么原因| 次月什么意思| 6月五行属什么| 不置可否什么意思| 白起为什么被赐死| 走之旁与什么有关| 职业年金什么时候领取| 浅笑安然是什么意思| 维生素b族适合什么人吃| 手心发热是什么原因引起的| 1961年属什么生肖| 5月什么星座| 饶有兴致是什么意思| 对方忙线中什么意思| 跟腱是什么| 自然周是什么意思| 美白吃什么| 肾错构瘤是什么原因引起的| 切除子宫对身体有什么影响| 吃什么对前列腺有好处| 97年什么命| 平板支撑有什么好处| 针眼长什么样子图片| 理数是什么| md是什么学位| 芒果不能和什么食物一起吃| 查处是什么意思| 16是什么生肖| 鸡肚是什么部位| 反流性咽喉炎吃什么药| 72年属鼠是什么命| 脚趾起水泡是什么原因| 开火上下结构念什么| 摩羯座女生和什么星座男生最配| 小腿疼痛为什么| 头发多剪什么发型好看| 感恩节吃什么| 血压低容易得什么病| 六是什么意思| 最大的罩杯是什么杯| 扬字五行属什么| 容易流鼻血是什么原因| 每次睡觉都做梦为什么| 吃什么降胆固醇| 肌肤甲错是什么意思| 爷爷的兄弟叫什么| 困惑是什么意思| bp是什么职位| 睡醒嘴巴苦是什么原因| 孕妇梦见大蟒蛇是什么意思| 脚板麻木是什么原因| 企鹅是什么意思| 卯时五行属什么| 誉之曰的之是什么意思| 江诗丹顿是什么档次| 9.3是什么日子| 云是由什么组成的| 音叉是什么| 子宫形态失常是什么意思| 孕晚期脚肿是什么原因| 来例假肚子疼是什么原因| 16588a是什么尺码女装| 神仙是什么生肖| 时光静好是什么意思| 皮肤疖是什么病| 弥漫性脂肪肝什么意思| 胎盘能吃吗有什么作用与功效| 小腿肚疼是什么原因| 纾字五行属什么| 果五行属什么| 植物神经紊乱吃什么药| 女人喝黄酒有什么好处| 慢性非萎缩性胃炎伴糜烂吃什么药| 移植后吃什么水果好| c反应蛋白高是什么意思| 早上空腹喝淡盐水有什么好处| 左肾肾盂分离什么意思| 怀孕3天有什么症状| 妇科炎症用什么药好| tps是什么意思| 结扎后需要注意什么| 逃之夭夭是什么意思| 肾炎吃什么好| 总打喷嚏是什么原因| 小孩打喷嚏流鼻涕吃什么药| 扁平足为什么不能当兵| 横空出世什么意思| 梦见水是什么征兆| 刀枪不入是什么生肖| 拉尿分叉是什么原因| 初次见面说什么| 尿是红色的是什么原因| 链球菌感染是什么病| 压箱钱是什么意思| 加湿器加什么水最好| 日本是什么时候投降的| 性冷淡什么意思| 什么人不能吃鹅蛋| 12月20日是什么星座| 临床路径是什么意思| 肌肉紧张是什么症状| 火凤凰是什么意思| 吃什么降血糖| 晕3d是什么原因| hg是什么单位| c反应蛋白什么意思| 梦见蛇是什么预兆| 什么程度要做肾穿刺| 月经期间喝什么比较好| 蜂蜜的波美度是什么意思| 什么是隐私| 桃子什么时候成熟| 肠炎吃什么食物调理| 胃疼吃什么消炎药| 什么牌子的燃气灶质量好| 昱念什么| 血管痉挛是什么症状| 溃烂用什么药治愈最快| 捉奸什么意思| hm是什么牌子的衣服| 查肝肾功能挂什么科| 百度

View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Videos

Open Menu Close Menu
  • Collections
  • Topics
  • All Videos
  • About

More Videos

  • About
  • Transcript
  • Code
  • 高铁为什么会晚点

    百度 值得一提的是,宁句城际还将连接南沿江铁路。

    Learn how ShazamKit can help you build custom catalogs and support exact matching of any audio source within your app — all on-device. Find out how you can easily generate audio signatures and build catalogs at scale through the new ShazamKit CLI. We'll also show you how you can quickly update your app to sync with large amounts of audio content like multiple seasons of a TV show or multiple episodes of a podcast, and we'll share updates to the ShazamKit API and SHMediaItems to help your apps respond precisely to key moments in audio sources using time ranges. For more on ShazamKit, we recommend watching "Explore ShazamKit" and "Create custom audio experiences with ShazamKit" from WWDC21.

    Resources

    • ShazamKit
      • HD Video
      • SD Video

    Related Videos

    WWDC23

    • Create a great ShazamKit experience

    WWDC21

    • Create custom audio experiences with ShazamKit
    • Explore ShazamKit
  • Search this video…

    ? instrumental hip hop music ? Hello, I'm Neil Foley, an engineer on the ShazamKit team. In 2021, we introduced ShazamKit, allowing you to match audio against Shazam's vast catalog of recorded music. We also introduced custom catalog matching, giving developers the ability to match their own audio and provide synced experiences. Now we have some important updates that streamline working with custom catalogs at scale. In this session, I'm going to use some of the existing ShazamKit concepts such as signatures, catalogs, and media items. If you're not already familiar with those, check out the "Explore ShazamKit” and "Create custom audio experiences with ShazamKit" talks from WWDC21. But as quick overview, ShazamKit lets you convert audio into a special format that can be matched. We call these signatures. Signatures can be combined with media items containing metadata to form a reference signature. And reference signatures can be stored together in a file that we call a custom catalog. Now that we are all caught up, I'll take you through building custom catalogs at scale, and then I'll talk about some tips and tricks to make great catalogs. In today's custom catalog workflow, if you have a small amount of content you want to be matched, working with custom catalogs can be a simple task. You just need to follow these steps. Record your audio in a format that ShazamKit accepts.

    Use the signature generator to transform it into a signature.

    Annotate it with your metadata, and then store it in a custom catalog. And that's it, you can provide a Shazam experience. But some of those steps can be daunting, especially if you're not familiar with audio programming. Dealing with sample rates and buffers can be tricky even for the most experienced developer. And what happens when you have a vast amount of content you'd like to make Shazamable, like 10 seasons of a TV show? This workflow can become painful.

    And if you have large amounts of content, it can quickly become unmanageable. If you're thinking of improving this workflow for yourself, you'll probably need to write code to transform audio into signatures, more code to load and associate media items, and each time you change your content, you'll have to repeat the work. This is a big investment when you just want to match some audio. And then if you want to sync content with ShazamKit, you need complicated logic to figure out what should be shown and when. I'll introduce some great enhancements to ShazamKit that streamline this workflow. But first a quick demo. Here I have the FoodMath app that Alex demonstrated in 2021 that syncs a maths quiz with an on screen lesson. I've updated it with the latest ShazamKit features, and I'm going play back the FoodMath video to see how it syncs.

    Skip to 26 seconds.

    2, 3 green apples. How many apples do I have in total? Your timer starts…now. Okay, time's up. Let's see how you did. Skip to 56 seconds. Today, to spice it up a bit, when I went to the shop, started with 2 red apples... and I bought 2 green apples. How many apples did I have in total this time? Your timer starts…now.

    Okay, time's up. Seems to be working great.

    There's rich content synced with the video and when I said "now," the menu appeared at exactly the right time. Also, when content was no longer relevant, it disappeared right on cue. But how does it work? Let's have a look at the code. There's just a simple loop. It uses an AsyncSequence on the session instead of the delegate callbacks that we used before. The sequence returns an enum representing match, no match, or error. I'm only interested in matches, so I've restricted the loop to just that case. And to build the result for display, I reduce the media items to the content that I need.

    There's actually not much more to see in the app, just SwiftUI views that are driven by the matchResult that we create. There's no complicated logic or timing code and it syncs perfectly. So the question remains, how does it sync so well? FoodMaths' secret is the rich custom catalog that drives the experience. I created the catalog with a simple tool that we've built to complement ShazamKit, and you can use it too to create rich experiences in your own apps. The Shazam CLI ships as part of macOS 13 and provides an easy way to sync content. It can help to automate some of the repetitive tasks associated with creating custom catalogs. Let's update the custom catalog that I just showed you. Time for another demo.

    Here's a folder containing the FoodMath video file, and here's my terminal in the same folder. I'll use the CLI to convert the video into a signature using the signature command.

    I just pass the video file as input and specify our signature output.

    Okay. There's our signature.

    Now I want combine this signature with media items to make a custom catalog. The CLI accepts a simple comma separated file for describing media items that I'll copy here.

    It describes everything that I need to sync my content.

    Here's where I've specified my titles, and here's a custom JSON field I've defined for the equation. The headers map to media item properties. For details on the mapping, run the custom catalog create command with the help flag.

    It describes the relationship between the csv headers and media item properties. Now I want to combine them together into a custom catalog. So I'll run the create command.

    I pass in the signature file and the csv file and it outputs a catalog.

    Okay, now we have our catalog. Excitingly, I have early access to the latest FoodMath episode, so I want to add that to our catalog file. Let me copy the files here.

    Here's our media items for our new episode.

    I'll run the update command passing in the video, the new media, and the catalog to update.

    Okay, we've updated our catalog. That's a quick overview of how to create catalogs, but if you're like me, you'll really you'll want to script this.

    The FoodMath app actually has quite a few new episodes, and I want to add them all to this catalog. I've written a really simple script that loops through all the episode folders and combines them into a custom catalog. I'll run it now.

    There we go. We now have one catalog representing every FoodMath episode and the script used the display command to detail what's inside the catalog. I think we have everything. The foodmath project is already referencing our new catalog. So let's build and run so that we can enjoy doing some maths.

    Skip to 30 seconds. How many apples do I have in total? Your timer starts…now. Okay, time's up. Let's see how you did. I like that guy. That's a great episode. What about a new episode? Let's try that.

    Skip to 15 seconds. Over the years, I explored what makes a guacamole truly delicious, and I wrote down my favorite guacamole recipe. It calls for 4 avocados. Tomorrow my friend is visiting. So for the two of us, I only need to make half of the portion. How many avocados do I need? The timer starts…now. That's correct. You need two avocados. Let's make this guacamole together. Let's give this a try.

    Mmm. That turned out to be great. I hope you had some fun and see you next time.

    Oh! They have a new host. Interesting. Anyway, I've created a rich synced experience in no time at all. The Shazam CLI supports a rich set of commands. Let's go over them.

    You can create a signature from any media file that has an audio track. You can create custom catalogs by combining signatures and media items. You can display a catalog's content. Add, remove, and export both signatures and media items. Next, on to how the CLI created the signatures from the FoodMath videos.

    SHSignatureGenerator now has a method signatureFromAsset that's available on all platforms. With this method, there's no more manually pulling audio buffers from media. Simply pass an AVAsset with an audio track to turn it into a signature. If you have multiple tracks in your asset, they'll be mixed together ensuring the signature captures everything. Okay, now that I have a signature that represents the media, how did I accurately sync content? I used the Timed MediaItem API. Attaching a time range to the media item makes it easy to specify when it starts and when it ends. Media items can also have multiple time ranges to target more than one portion of a signature. Imagine that you have a media item that targets the chorus of a song. You can add a time range for each place it's sung.

    Specifying the time ranges is only useful if you're notified when they start and when they end. ShazamKit will deliver a match callback synced with the time range, one when it starts and one when it ends. Signatures can contain many media items, so this callback will contain only the media items that are in range at that specific point in time. There's a few simple rules for which media items will be returned in a callback and their order, so let's go over them.

    Media items outside of their time range will not be returned. Media items within their time range will be returned, with the most recent events coming first.

    And finally, media items with no time ranges will always be returned last, but they will be unordered. Media items that have no time range can be a great place to store global information that applies to the whole reference signature. In my FoodMath example, I used it to store the name of the episode. It appears when no other media items are in range.

    One final point, if all your media items have time ranges and none of them are in scope, ShazamKit will always return a media item with basic match information. This way, you will always get important properties, such as the predictedCurrentMatch offset and the frequencySkew.

    And in code, it's easy too. Timed media items are created by specifying the timeRanges media item property. It's an array of Swift ranges. It can also be read back using the timeRanges property. And for Objective-C programmers, there's a new SHRange class as a drop in replacement. Now that you've seen how to build them, let's explore some tips and tricks to make great custom catalogs. Avoid creating many small signatures for one piece of media. A signature is a one to one mapping to the media that it represents, so for each piece of audio you have, be it from a song or video, create one signature for the entire duration.

    A longer signature provides more opportunities for ShazamKit to match audio peaks, resulting in better accuracy. It also avoids issues with query signatures overlapping multiple reference signatures.

    Using the new Timed MediaItem API, you can target synced content to individual areas. There's no need to divide a piece of audio into multiple signatures. I showed an example where we had one piece of media, but with multiple media items. But what should we do if we have a huge amount of content that we want to make Shazamable? How should we split it up? There's a trade-off you need to make when splitting your content across custom catalogs. If you create individual catalogs for each media asset, you'll need to know which piece of audio is being played so that you can load the correct catalog. And if you put them all together in one catalog, you'll have a larger download and use more memory, but you can match many more pieces of audio. Our advice is to keep the catalog files you create tightly focused. For example, a catalog per music track or the whole album, but not the artist's whole discography. Keeping things separate means that you can decide what to load at runtime. You can do that with the custom catalog add API.

    Try it out and see if helps with your use case. If you have multiple audio assets that sound the same, maybe a show that always starts with the same intro music, and you want to provide a custom experience for each episode, or a song that's sampled in another track, maybe consider using frequency skew as a differentiator. Skewing audio is raising or lowing the frequencies in the recording. When you do this, you affect how the audio sounds, but if you do it by a small enough amount, it can be noticed by ShazamKit but not by the average human ear.

    So if we take an audio recording, make a custom catalog from it, and then play it back with the frequencies slightly shifted: ShazamKit will still match the audio, and it will also report the skew amount through the frequencySkew property. Here's how to do that in code.

    There are limits to how much you can skew audio without the change becoming either noticeable to the human ear or unrecognizable to ShazamKit.

    Keeping the skew to less than 5 percent should be safe and provide enough room to differentiate multiple skewed recordings. To really take advantage of this, use the frequencySkew ranges. Media items will only be returned if they fall inside the specified skew ranges.

    The range specifies as a percentage how much the audio differs from the original. A value of 0 indicates the audio is unskewed and a value of .01 indicates a 1 percent skew. You can access the property on media items using the frequencySkewRanges property.

    I'll go over the steps to get this working in your app: First create a reference signature of your original audio recording. Then take a media item and restrict it by frequency skew to 3 to 4 percent. Place this inside your custom catalog.

    Now play back the audio skewed by 3 to 4 percent, and your media item will be returned. Playing back the audio unskewed or skewed outside of the range will not return your media item. That's frequency skewing.

    Now that you've seen the exciting updates to ShazamKit this year, you're ready to make some amazing synced experiences. So remember these best practices: First, create one signature per media asset. You'll get better accuracy from ShazamKit and simpler creation pipeline. Create your signatures with SHSignatureGenerators signatureFromAsset. It accepts a wide variety of media, meaning you no longer have to deal with low level audio details.

    Target synced content to areas of interest with the new Timed MediaItem API. It combines a simple API with excellent accuracy. And finally let the Shazam CLI streamline the way you create custom catalogs. It's been designed take away the hassle of dealing with vast amounts of media and let you focus on the great experiences you want to make instead. I hope you enjoyed the latest updates to ShazamKit, and I'm excited to see you make everything Shazamable. All of the information we discussed and links to documentation are attached to this session. Thanks for joining. Enjoy the rest of WWDC22. ? ?

    • 4:26 - Food Math Matcher

      /*
      See LICENSE folder for this sample’s licensing information.
      
      Abstract:
      The model that is responsible for matching against the catalog and update the SwiftUI Views.
      */
      
      import ShazamKit
      import AVFAudio
      
      struct MatchResult {
          var title: String?
          var equation: Equation?
          var episode: Episode?
          var answerRange: ClosedRange<Int>?
          
          var hasContent: Bool {
              equation != nil || title != nil || answerRange != nil
          }
      }
      
      class Matcher: NSObject, ObservableObject, SHSessionDelegate {
          @Published var matchResult: MatchResult?
          
          private var session: SHSession!
          private let audioEngine = AVAudioEngine()
          private var matchingTask: Task<Void, Never>? = nil
          
          func match(catalog: SHCustomCatalog) throws {
              
              session = SHSession(catalog: catalog)
              session.delegate = self
              
              let audioFormat = AVAudioFormat(standardFormatWithSampleRate: audioEngine.inputNode.outputFormat(forBus: 0).sampleRate,
                                              channels: 1)
              audioEngine.inputNode.installTap(onBus: 0, bufferSize: 2048, format: audioFormat) { [weak session] buffer, audioTime in
                  session?.matchStreamingBuffer(buffer, at: audioTime)
              }
              
              try AVAudioSession.sharedInstance().setCategory(.record)
              AVAudioSession.sharedInstance().requestRecordPermission { [weak self] success in
                  guard success, let self = self else { return }
                  
                  Task.detached {
                      try? self.audioEngine.start()
                  }
              }
              
              Task { @MainActor in
                  for await case .match(let match) in session.results {
                      self.matchResult = match.matchResult
                  }
              }
          }
      }
      
      extension SHMatch {
      
          var matchResult: MatchResult {
              mediaItems.reduce(into: MatchResult()) { result, mediaItem in
                  result.title = result.title ?? mediaItem.title
                  result.episode = result.episode ?? mediaItem.episode
                  result.equation = result.equation ?? mediaItem.equation
                  result.answerRange = result.answerRange ?? mediaItem.answerRange
              }
          }
      }
    • 13:51 - Timed Media Items

      // Restrict this media item to only describe the first 5 seconds
      
       let mediaItem = SHMediaItem(properties: [
                  .title: "Title",
                  .timeRanges:[0.0..<5.0]
              ])
      
       let timeRanges: [Range<TimeInterval>] = mediaItem.timeRanges
    • 16:02 - Combine Catalogs

      let parentCatalog = SHCustomCatalog()
      
      parentCatalog.add(from: URL(fileURLWithPath: "/path/to/Episode1.shazamcatalog"))
      parentCatalog.add(from: URL(fileURLWithPath: "/path/to/Episode2.shazamcatalog"))
      parentCatalog.add(from: URL(fileURLWithPath: "/path/to/Episode3.shazamcatalog"))
    • 16:58 - Frequency Skew

      func within(range: Range<Float>, for matchedMediaItem: SHMatchedMediaItem) -> Bool {
              
      	range.contains(matchedMediaItem.frequencySkew)
      }
    • 17:21 - Frequency Skew Ranges

      // Restrict this media item to only describe the first 5 seconds
      
       let mediaItem = SHMediaItem(properties: [
                  .title: “Frequency Skewed Audio”,
                  .frequencySkewRanges:[0.01..<0.02]
              ])
      
       let frequencySkewRanges: [Range<Float>] = mediaItem.frequencySkewRanges

Developer Footer

  • Videos
  • WWDC22
  • Create custom catalogs at scale with ShazamKit
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Extensions
    • App Store
    • Audio & Video
    • Augmented Reality
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright ? 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines
    北京属于什么气候 尿不尽是什么症状 经期吃什么水果 小便分叉是什么原因男 血糖有点高吃什么食物好
    夏天穿什么衣服比较凉爽 消纳是什么意思 巧妙是什么意思 肾结石忌口什么 心悸吃什么药
    早上4点是什么时辰 异禀是什么意思 顶臂长是什么意思 虾米是什么意思 黑色签字笔是什么笔
    湿气重的人适合吃什么 西洋参吃了有什么好处 炒菜用什么锅好 霜花店讲了什么故事 什么叫高尿酸血症
    莎字五行属什么hcv8jop0ns8r.cn 吃了虾不能吃什么hcv9jop8ns0r.cn 振幅是什么意思hcv8jop5ns6r.cn 马拉色菌是什么weuuu.com 伤口止血用什么药hcv8jop8ns0r.cn
    甘草泡水喝有什么功效adwl56.com 5月22是什么星座hcv8jop5ns3r.cn 人流后吃什么恢复快hcv9jop2ns8r.cn 因子是什么hcv9jop4ns7r.cn 肉苁蓉和什么搭配最好hcv8jop7ns8r.cn
    牙齿发黄是什么原因导致的hcv9jop5ns4r.cn 孕妇梦见蛇是什么意思onlinewuye.com 尿血是什么原因女性hcv9jop5ns6r.cn 皮肤糖化是什么意思hcv8jop3ns6r.cn 文科和理科有什么区别hcv9jop1ns0r.cn
    请示是什么意思cl108k.com 庶子什么意思hcv8jop8ns2r.cn 门子是什么意思hcv9jop0ns4r.cn 天丝是什么面料hcv8jop1ns7r.cn 农历八月是什么月jiuxinfghf.com
    百度