Rules Management API

MAXダッシュボードから、新しい競合他社ルールやリスクのあるコンテンツのルールを作成できます。 これらは一度に1つずつ作成します。 しかし、このページで説明するAd Review Rules Management APIを使用すると、1回のリクエストで多数のルールを表示または作成することもできます。

このドキュメントの「競合他社のモニタリング」および「リスクのあるコンテンツの検出」を参照してください。

このAPIには2つのエンドポイントがあります。

  1. /v1/rules/competitors
    • 事前に定義されたすべての競合他社ルール(アクティブおよび一時停止中のルール)を表示するには、/v1/rules/competitorsGETリクエストを送信します。
    • 新しい競合他社ルールを作成するには、/v1/rules/competitorsPOSTリクエストを送信します。
  2. /v1/rules/risky
    • 事前に定義されたすべてのリスクのあるコンテンツのルール(アクティブおよび一時停止中のルール)を表示するには、/v1/rules/riskyGETリクエストを送信します。
    • 新しいリスクのあるコンテンツのルールを作成するには、/v1/rules/riskyPOSTリクエストを送信します。

このページの以降のセクションで、これらのエンドポイントについて詳しく説明します。

各APIリクエストを認証する必要があります。 認証を行うには、リクエストにApi-Key HTTPヘッダーを追加し、その値にお使いのアカウントのAd Review Keyを設定します。 Ad Review Keyは、AppLovinダッシュボードのAccount > General > Keysセクションで確認できます。

ターゲットURL

https://api-safedk.applovin.com/v1/rules/competitors

POST リクエストボディ

{
  "rules": [
    {
      "name": "android title rule",
      "platform": "android",
      "package_names": ["com.mytest.app"],
      "rule_type": "title",
      "value": ["com.examplegames.solitaire", "com.eg.Bricks"]
    },
    ⋮
  ]
}

リクエストボディ要素の表

名前タイプ説明 / 有効な値作成時に必須 (POST)
namestringルール名(複数のルールに同じ名前を使用できます)。最大長は35文字です。ルール名には、英数字、_:-&、または半角スペースを含めることができます。true
platformstring"android" または "ios"true
package_namesstring[]このルールに関連付けられているパブリッシャーアプリのパッケージ名 / バンドルID(例: "com.my.test.app")。ここに空の配列を渡すと、このプラットフォームのすべてのアプリにルールが適用されます。注意: これらの名前のいずれかが、選択したプラットフォームと一致しないアプリのものである場合、ルール全体が無効になります。false
rule_typestring"title""store_category"、または "advertiser"true
valuestring[]rule_type フィールドで指定された広告特性の候補値の配列。広告がその特性においてこれらの文字列のいずれかと一致する場合、このルールはその広告にフラグを立てます。注意: 値のいずれかが選択したプラットフォームに適していない場合(たとえば、ルールがAndroidアプリに適用されると指定しているにもかかわらず、iTunes IDを渡した場合)、ルール全体が無効になり、APIはそれを拒否します。この配列内の文字列の正しい値は、選択する platformrule_type によって異なります(下記の「有効なルール値」を参照してください)。true

発生し得るエラー

  • 400 (Bad Request): リクエストのボディ構造が無効な場合。
  • 401 (Unauthorized): 各APIリクエストを認証する必要があります。 認証を行うには、リクエストにApi-Key HTTPヘッダーを追加し、その値にお使いのアカウントのAd Review Keyを設定します。 Ad Review Keyは、AppLovinダッシュボードのAccount > General > Keysセクションで確認できます。

レスポンス形式 (POST)

レスポンスには、次の3つの要素を持つハッシュが含まれます。

  1. updated_rules — 新しく作成されたルール、およびこのリクエストによって再アクティブ化された一時停止中のルール
  2. existing_rules
  3. invalid_rules

これらの各要素には以下が含まれます。

  1. total — この要素がカバーするルールの総数を示す整数
  2. rules — 関連する rule オブジェクトを含む配列(POST リクエスト内にあるものと同じ種類の rule オブジェクト。このオブジェクトの要素については、上記の「リクエストボディ要素の表」を参照してください)

レスポンス形式 (GET)

リクエストが成功すると、既存のすべてのカスタム競合他社ルールオブジェクトの配列が返されます。 これには、MAX Ad Reviewによって自動生成されたルールは含まれません。 このレスポンスオブジェクトの要素には、nameplatformpackage_namesrule_typevalue(これらの要素の説明については、上記の「リクエストボディ要素の表」を参照してください)、およびルールがアクティブな場合は true、そうでない場合は false となる is_active が含まれます。

[
  {
    "name": "android title rule",
    "platform": "android",
    "package_names":["com.test.my_first_app","com.test.my_second_app"],
    "rule_type": "title",
    "value": ["solitaire", "block", "com.games.solitaire", "com.bestgames.Bricks"],
    "is_active": "true"
  },
  {
    "name": "ios title rule",
    "platform": "ios",
    "rule_type": "title",
    "value": ["1449713068"],
    "is_active": "false"
  }
]

/v1/rules/risky エンドポイント

新しいリスクのあるコンテンツのルールを作成するには、risky エンドポイントに POST リクエストを送信します。 以下で説明するように、リクエストボディに必要なフィールドを含めます。 1回のリクエストで複数のリスクのあるコンテンツのルールを作成できます。 これにより、すべての新しいルールがアクティブなステータスで作成されます。

同一のアクティブなリスクのあるコンテンツのルールがすでに存在する場合、APIはそのルールを二重に追加しません。 代わりに、レスポンスの existing_rules 配列にそのルールを含めます。 同一の一時停止中のルールが存在する場合、そのステータスはアクティブに変更されます。 すべての新規または再アクティブ化されたルールは、レスポンスの updated_rules 配列に表示されます。 ルールに無効な値が含まれている場合、APIはそのルールを追加せず、レスポンスの invalid_rules 配列に含めます。

Rules Management API: Add Risky Content Rule

既存のすべてのリスクのあるコンテンツのルール(アクティブおよび一時停止中のルール)を表示するには、risky エンドポイントに GET リクエストを送信します。

Rules Management API: View Risky Content Rules

このエンドポイントでは、既存のルールを編集または一時停止することはできません。 代わりに、UIでそれを行ってください。

ターゲットURL

https://api-safedk.applovin.com/v1/rules/competitors

POST リクエストボディ

{
  "rules": [
    {
      "name": "android title rule",
      "platform": "android",
      "package_names": ["com.mytest.app"],
      "rule_type": "title",
      "value": ["com.examplegames.solitaire", "com.eg.Bricks"]
    },
    ⋮
  ]
}

リクエストボディ要素の表

名前タイプ説明 / 有効な値作成時に必須 (POST)
namestringルール名(複数のルールに同じ名前を使用できます)。最大長は35文字です。ルール名には、英数字、_:-&、または半角スペースを含めることができます。true
platformstring"android" または "ios"true
package_namesstring[]このルールに関連付けられているパブリッシャーアプリのパッケージ名 / バンドルID(例: "com.my.test.app")。ここに空の配列を渡すと、このプラットフォームのすべてのアプリにルールが適用されます。注意: これらの名前のいずれかが、選択したプラットフォームと一致しないアプリのものである場合、ルール全体が無効になります。false
rule_typestring"title""store_category"、または "advertiser"true
valuestring[]rule_type フィールドで指定された広告特性の候補値の配列。広告がその特性においてこれらの文字列のいずれかと一致する場合、このルールはその広告にフラグを立てます。注意: 値のいずれかが選択したプラットフォームに適していない場合(たとえば、ルールがAndroidアプリに適用されると指定しているにもかわらず、iTunes IDを渡した場合)、ルール全体が無効になり、APIはそれを拒否します。この配列内の文字列の正しい値は、選択する platformrule_type によって異なります(下記の「有効なルール値」を参照してください)。true

発生し得るエラー

  • 400 (Bad Request): リクエストのボディ構造が無効な場合。
  • 401 (Unauthorized): 各APIリクエストを認証する必要があります。 認証を行うには、リクエストにApi-Key HTTPヘッダーを追加し、その値にお使いのアカウントのAd Review Keyを設定します。 Ad Review Keyは、AppLovinダッシュボードのAccount > General > Keysセクションで確認できます。

レスポンス形式 (POST)

レスポンスには、次の3つの要素を持つハッシュが含まれます。

  1. updated_rules — 新しく作成されたルール、およびこのリクエストによって再アクティブ化された一時停止中のルール
  2. existing_rules
  3. invalid_rules

これらの各要素には以下が含まれます。

  1. total — この要素がカバーするルールの総数を示す整数
  2. rules — 関連する rule オブジェクトを含む配列(POST リクエスト内にあるものと同じ種類の rule オブジェクト。このオブジェクトの要素については、上記の「リクエストボディ要素の表」を参照してください)

レスポンス形式 (GET)

リクエストが成功すると、既存のすべてのカスタム競合他社ルールオブジェクトの配列が返されます。 これには、MAX Ad Reviewによって自動生成されたルールは含まれません。 このレスポンスオブジェクトの要素には、nameplatformpackage_namesrule_typevalue(これらの要素の説明については、上記の「リクエストボディ要素の表」を参照してください)、およびルールがアクティブな場合は true、そうでない場合は false となる is_active が含まれます。

[
  {
    "name": "android title rule",
    "platform": "android",
    "package_names":["com.test.my_first_app","com.test.my_second_app"],
    "rule_type": "title",
    "value": ["solitaire", "block", "com.games.solitaire", "com.bestgames.Bricks"],
    "is_active": "true"
  },
  {
    "name": "ios title rule",
    "platform": "ios",
    "rule_type": "title",
    "value": ["1449713068"],
    "is_active": "false"
  }
]

/v1/rules/risky エンドポイント

新しいリスクのあるコンテンツ of ルールを作成するには、risky エンドポイントに POST リクエストを送信します。 以下で説明するように、リクエストボディに必要なフィールドを含めます。 1回のリクエストで複数のリスクのあるコンテンツのルールを作成できます。 これにより、すべての新しいルールがアクティブなステータスで作成されます。

同一のアクティブなリスクのあるコンテンツのルールがすでに存在する場合、APIはそのルールを二重に追加しません。 代わりに、レスポンスの existing_rules 配列にそのルールを含めます。 同一の一時停止中のルールが存在する場合、そのステータスはアクティブに変更されます。 すべての新規または再アクティブ化されたルールは、レスポンスの updated_rules 配列に表示されます。 ルールに無効な値が含まれている場合、APIはそのルールを追加せず、レスポンスの invalid_rules 配列に含めます。

Rules Management API: Add Risky Content Rule

既存のすべてのリスクのあるコンテンツのルール(アクティブおよび一時停止中のルール)を表示するには、risky エンドポイントに GET リクエストを送信します。

Rules Management API: View Risky Content Rules

このエンドポイントでは、既存のルールを編集または一時停止することはできません。 代わりに、UIでそれを行ってください。

ターゲットURL

https://api-safedk.applovin.com/v1/rules/risky

POST リクエストボディ

{
  "rules": [
    {
      "name": "android title rule",
      "platform": "android",
      "package_names": ["com.my.android.test.app"],
      "rule_type": "title",
      "value": ["com.games.solitaire","com.games.Bricks"]
    },
    {
      "name": "ios title rule",
      "platform": "ios",
      "rule_type": "title",
      "value": ["1349713000"]
    },
    {
      "name": "store_category rule",
      "platform": "ios",
      "rule_type": "store_category",
      "value": ["Action", "Card"]
    },
    {
      "name": "advertiser ios rule",
      "platform": "ios",
      "rule_type": "advertiser",
      "value": ["ExampleAdvertiser1", "ExampleAdvertiser2"]
    },
    {
      "name": "content_rating ios rule",
      "platform": "ios",
      "rule_type": "content_rating",
      "value": ["12+", "17+"]
    },
    {
      "name": "advisory ios rule",
      "platform": "ios",
      "rule_type": "advisory",
      "value": ["Frequent/Intense Alcohol, Tobacco or Drug Use or References"]
    },
    {
      "name": "web_domain rule",
      "platform": "ios",
      "rule_type": "web_domain",
      "value": ["test.com", "example.com"]
    },
    {
      "name": "ios_platform_with_android_package_name_rule",  //invalid rule
      "platform": "ios",
      "package_names": "com.my.android.test.app",
      "rule_type": "title",
      "value": ["1449713068"]
    },
    {
      "name": "ios_platform_with_android_title_value",  //invalid rule
      "platform": "ios",
      "rule_type": "title",
      "value": ["1449713068", "com.games.solitaire1"]
    },
    {
      "name": "ios_platform_with_android_content_rating_value",  //invalid rule
      "platform": "ios",
      "rule_type": "content_rating",
      "value": ["Everyone"]
    }
  ]
}

このリクエストに対するレスポンスで、無効なルールがどのように報告されるかについては、下記の「レスポンス形式 (POST): 例」を参照してください。

リクエストボディ要素の表

名前タイプ説明 / 有効な値作成時に必須 (POST)
namestringルール名(複数のルールに同じ名前を使用できます)。最大長は35文字です。ルール名には、英数字、_:-&、または半角スペースを含めることができます。true
platformstring"android" または "ios"true
package_namesstring[]このルールに関連付けられているパブリッシャーアプリのパッケージ名 / バンドルID(例: "com.my.test.app")。ここに空の配列を渡すと、このプラットフォームのすべてのアプリにルールが適用されます。注意: これらの名前のいずれかが、選択したプラットフォームと一致しないアプリのものである場合、ルール全体が無効になります。false
rule_typestring"title""store_category""advertiser""web_domain""content_rating"、または "advisory"true
valuestring[]rule_type フィールドで指定された広告特性 of 候補値の配列。広告がその特性においてこれらの文字列のいずれかと一致する場合、このルールはその広告にフラグを立てます。注意: 値のいずれかが選択したプラットフォームに適していない場合(たとえば、ルールがAndroidアプリに適用されると指定しているにもかわらず、iTunesのコンテンツレーティング値を渡した場合)、ルール全体が無効になり、APIはそれを拒否します。この配列内の文字列の正しい値は、選択する platformrule_type によって異なります(下記の「有効なルール値」を参照してください)。true

発生し得るエラー

  • 400 (Bad Request): リクエストのボディ構造が無効な場合。
  • 401 (Unauthorized): 各APIリクエストを認証する必要があります。 認証を行うには、リクエストにApi-Key HTTPヘッダーを追加し、その値にお使いのアカウントのAd Review Keyを設定します。 Ad Review Keyは、AppLovinダッシュボードのAccount > General > Keysセクションで確認できます。

レスポンス形式 (POST)

レスポンスには、次の3つの要素を持つハッシュが含まれます。

  1. updated_rules — 新しく作成されたルール、およびこのリクエストによって再アクティブ化された一時停止中のルール
  2. existing_rules
  3. invalid_rules

これらの各要素には以下が含まれます。

  1. total — この要素がカバーするルールの総数を示す整数
  2. rules — 関連する rule オブジェクトを含む配列(POST リクエスト内にあるものと同じ種類の rule オブジェクト。このオブジェクトの要素については、上記の「リクエストボディ要素の表」を参照してください)

"updated_rules": {
  "total": 6
  "rules": {[
    {
      "name": "android title rule",
      "platform": "android",
      "package_names": ["com.my.android.test.app"],
      "rule_type": "title",
      "value": ["com.games.solitaire","com.games.Bricks"]
    }, {…},{…},{…},{…},{…}
  ]
},
"invalid_rules": {
  "total": 3
  "rules": [
    {
      "name": "ios_platform_with_android_package_name_rule",  //invalid rule
      "platform": "ios",
      "my_apps_package_name": "com.my.android.test.app",
      "rule_type": "title",
      "value": ["1449713068"]
    }, {…},{…}
  ]
},
"existing_rules": {
  "total": 1
  "rules":[
    {
      "name": "web_domain rule",
      "platform": "ios",
      "rule_type": "web_domain",
      "value": ["test.com", "example.com"]
    }
  ]
}

レスポンス形式 (GET)

リクエストが成功すると、既存のすべてのカスタムリスクのあるコンテンツのルールオブジェクトの配列が返されます。 これには、MAX Ad Reviewによって自動生成されたルールは含まれません。 このレスポンスオブジェクトの要素には、nameplatformpackage_namesrule_typevalue(これらの要素の説明については、上記の「リクエストボディ要素の表」を参照してください)、およびルールがアクティブな場合は true、そうでない場合は false となる is_active が含まれます。

[
  {
    "name": "android title rule",
    "platform": "android",
    "package_names":["com.test.my_first_app","com.test.my_second_app"],
    "rule_type": "title",
    "value": ["solitaire", "block", "com.games.solitaire", "com.bestgames.Bricks"],
    "is_active": "true"
  },
  {
    "name": "ios title rule",
    "platform": "ios",
    "rule_type": "title",
    "value": ["1449713068"],
    "is_active": "false"
  }
]

タイムアウトを回避するための GET リクエストの制限

ルールが多すぎる場合、これらのエンドポイントへの GET リクエストは、すべてのルールを取得して送信しようとする間にタイムアウトする可能性があります。 これを解決するには、これらのエンドポイントが返すルールの数を制限できます。 これを行うには、limit クエリパラメータを追加します。 その後、offset クエリパラメータを追加することで、すべてのルールをページネーションできます。 例えば:

  1. GET /v1/rules/risky?limit=10&offset=0 — 最初のリスクのあるコンテンツのルール10件を取得する
  2. GET /v1/rules/risky?limit=10&offset=10 — 次のリスクのあるコンテンツのルール10件を取得する
  3. GET /v1/rules/risky?limit=10&offset=20 — さらに次のリスクのあるコンテンツのルール10件を取得する

リストの最後に達し、返すルールがなくなると、レスポンスは空の配列になります。

有効なルール値

    Android

    有効な値の表

    rule_type有効な値
    advertiser任意の有効な広告主名(例: "Super Lucky Casino")。ストアから正確な広告主名をコピーしてください(大文字と小文字は区別されます)。
    advisoryGoogle Playからのアドバイザリ文字列(例: "Sexual Content")。下記の「アドバイザリの有効な値」を参照してください。
    content_rating米国におけるGoogle Playのcontent_rating: "Everyone""Everyone 10+""Teen""Mature 17+"、または "Adults only 18+"
    store_categoryGoogle Playのカテゴリ文字列。下記の「ストアカテゴリの有効な値」を参照してください。
    titleアプリのパッケージ名(このAPIではフリーテキストルールはサポートされていません。UIでのみサポートされています)
    web_domain有効なウェブドメイン(「http(s)」、「www」、または末尾のスラッシュを除く)。例: "apple.com"

    ストアカテゴリの有効な値

    • "Action"
    • "Action & Adventure"
    • "Adventure"
    • "Arcade"
    • "Art & Design"
    • "Auto & Vehicles"
    • "Beauty"
    • "Board"
    • "Books & Reference"
    • "Brain Games"
    • "Business"
    • "Card"
    • "Cards"
    • "Casino"
    • "Casual"
    • "Comics"
    • "Communication"
    • "Creativity"
    • "Dating"
    • "Education"
    • "Educational"
    • "Entertainment"
    • "Events"
    • "Finance"
    • "Food & Drink"
    • "Health & Fitness"
    • "House & Home"
    • "Libraries & Demo"
    • "Lifestyle"
    • "Maps & Navigation"
    • "Medical"
    • "Music"
    • "Music & Audio"
    • "Music & Video"
    • "Music Games"
    • "News & Magazines"
    • "Parenting"
    • "Personalization"
    • "Photography"
    • "Pretend Play"
    • "Productivity"
    • "Puzzle"
    • "Racing"
    • "Role Playing"
    • "Shopping"
    • "Simulation"
    • "Social"
    • "Sports"
    • "Strategy"
    • "Tools"
    • "Travel & Local"
    • "Trivia"
    • "Video Players & Editors"
    • "Weather"
    • "Word"
    • "Word Games"

    アドバイザリの有効な値

    • "Alcohol Reference"
    • "Alcohol and Tobacco Reference"
    • "Blood"
    • "Blood and Gore"
    • "Cartoon Violence"
    • "Comic Mischief"
    • "Crude Humor"
    • "Diverse Content: Discretion Advised"
    • "Drug Reference"
    • "Drug and Alcohol Reference"
    • "Fantasy Violence"
    • "Fear"
    • "Gambling"
    • "General"
    • "Horror"
    • "Implied Violence"
    • "Intense Violence"
    • "Language"
    • "Mild Blood"
    • "Mild Fantasy Violence"
    • "Mild Language"
    • "Mild Suggestive Themes"
    • "Mild Swearing"
    • "Mild Violence"
    • "Moderate Violence"
    • "Nudity"
    • "Online Interactivity"
    • "Parental Guidance Recommended"
    • "Partial Nudity"
    • "Real Gambling/Paid Contests"
    • "Sexual Content"
    • "Sexual Innuendo"
    • "Sexual Themes"
    • "Sexual Violence"
    • "Simulated Gambling"
    • "Strong Language"
    • "Strong Sexual Content"
    • "Strong Violence"
    • "Suggestive Themes"
    • "Tobacco Reference"
    • "Use of Alcohol"
    • "Use of Alcohol and Tobacco"
    • "Use of Drugs"
    • "Use of Drugs and Alcohol"
    • "Use of Tobacco"
    • "Violence"
    • "Violent References"

    iOS

    有効な値の表

    rule_type有効な値
    advertiser任意の有効な広告主名(例: "Super Lucky Casino")。ストアから正確な広告主名をコピーしてください(大文字と小文字は区別されます)。
    advisoryiTunesからのアドバイザリ文字列(例: "Frequent/Intense Alcohol, Tobacco or Drug Use or References")。下記の「アドバイザリの有効な値」を参照してください。
    content_rating米国におけるiTunesのcontent_rating値: "4+""9+""12+"、または "17+"
    store_categoryiTunesのカテゴリ文字列。下記の「ストアカテゴリの有効な値」を参照してください。
    titleiTunes ID(このAPIではフリーテキストルールはサポートされていません。UIでのみサポートされています)
    web_domain有効なウェブドメイン(「http(s)」、「www」、または末尾のスラッシュを除く)。例: "apple.com"

    ストアカテゴリの有効な値

    • "Action"
    • "Adventure"
    • "Animals & Nature"
    • "Arcade"
    • "Art"
    • "Board"
    • "Book"
    • "Books"
    • "Business"
    • "Card"
    • "Casino"
    • "Casual"
    • "Celebrations"
    • "Celebrities"
    • "Comics & Cartoons"
    • "Developer Tools"
    • "Eating & Drinking"
    • "Education"
    • "Emoji & Expressions"
    • "Entertainment"
    • "Family"
    • "Fashion"
    • "Finance"
    • "Food & Drink"
    • "Games"
    • "Gaming"
    • "Graphics & Design"
    • "Health & Fitness"
    • "Kids & Family"
    • "Lifestyle"
    • "Magazines & Newspapers"
    • "Medical"
    • "Movies & TV"
    • "Music"
    • "Navigation"
    • "News"
    • "People"
    • "Photo & Video"
    • "Places & Objects"
    • "Productivity"
    • "Puzzle"
    • "Racing"
    • "Reference"
    • "Role Playing"
    • "Role-Playing"
    • "Shopping"
    • "Simulation"
    • "Social Networking"
    • "Sports"
    • "Sports & Activities"
    • "Stickers"
    • "Strategy"
    • "Travel"
    • "Trivia"
    • "Utilities"
    • "Weather"
    • "Word"

    アドバイザリの有効な値

    • "Frequent/Intense Alcohol, Tobacco or Drug Use or References"
    • "Frequent/Intense Alcohol, Tobacco, or Drug Use or References"
    • "Frequent/Intense Cartoon or Fantasy Violence"
    • "Frequent/Intense Horror/Fear Themes"
    • "Frequent/Intense Mature/Suggestive Themes"
    • "Frequent/Intense Medical/Treatment Information"
    • "Frequent/Intense Profanity or Crude Humor"
    • "Frequent/Intense Profanity or Crude Humour"
    • "Frequent/Intense Realistic Violence"
    • "Frequent/Intense Sexual Content or Nudity"
    • "Frequent/Intense Simulated Gambling"
    • "Gambling and Contests"
    • "Infrequent/Mild Alcohol, Tobacco or Drug Use or References"
    • "Infrequent/Mild Alcohol, Tobacco, or Drug Use or References"
    • "Infrequent/Mild Cartoon or Fantasy Violence"
    • "Infrequent/Mild Horror/Fear Themes"
    • "Infrequent/Mild Mature/Suggestive Themes"
    • "Infrequent/Mild Medical/Treatment Information"
    • "Infrequent/Mild Profanity or Crude Humor"
    • "Infrequent/Mild Profanity or Crude Humour"
    • "Infrequent/Mild Realistic Violence"
    • "Infrequent/Mild Sexual Content and Nudity"
    • "Infrequent/Mild Simulated Gambling"
    • "Unrestricted Web Access"

変更履歴

    Android

    iOS


search