アプリ内イベント

iOS SDKでアプリ内イベントを設定する方法を説明します。

概要

本ドキュメントは、iOS SDKでアプリ内イベントを実装するためのガイドです。開発者向けのアプリ内イベントについての概要については、 アプリ内イベント をご覧ください。

始める前に

SDKを実装する必要があります。

アプリ内イベントの記録

SDKでは、アプリで発生したユーザーアクションを記録できます。これは、一般的にアプリ内イベントと呼ばれます。

The logEvent method

logEvent メソッドを使用すると、アプリ内イベントをログに記録し、AppsFlyerに送信して処理することができます。

AppsFlyerLib は、logEvent、既定のイベント名、および既定のイベントパラメーターを公開します。

logEvent は3つの引数を取ります。

- (void)logEventWithEventName:(NSString *)eventName
        eventValues:(NSDictionary<NSString * , id> * _Nullable)eventValues
        completionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler;
  • 第1引数(eventName)はイベント名です。
  • 第2引数(eventValues)は、イベントパラメーターのNSDictionaryです。
  • 第3引数(completionHandler)は、オプションの完了ハンドラ(イベント送信の成功/失敗の処理に有効)です。

📘

注意

eventValues (第2引数)は、有効な NSDictionary でなければなりません。詳細は、Foundation JSONSerialization を参照してください。

Example: Send "add to wishlist" event

例えば、ユーザーが商品をウィッシュリストに追加したことを記録する方法は次のとおりです:

[[AppsFlyerLib shared]  logEvent: AFEventAddToWishlist withValues: @{
    AFEventParamPrice: @20,
    AFEventParamContentId: @"123456"
}]
AppsFlyerLib.shared().logEvent(AFEventAddToWishlist,
  withValues: [
     AFEventParamPrice: 20,
     AFEventParamContentId: "123456"
]);

上記の logEvent 呼び出しでは:

Implementing in-app event definitions

イベント構成の定義にて提供されている定義の例に基づいて、イベントは次のように実装する必要があります。

[[AppsFlyerLib shared]  logEvent: AFEventContentView withValues: @{
    AFEventParamContentId: <ITEM_SKU>,
    AFEventParamContentType: <ITEM_TYPE>,
    AFEventParamPrice: <ITEM_PRICE>
}]
AppsFlyerLib.shared().logEvent(AFEventAddToCart,
  withValues: [
    AFEventParamContent: <ITEM_NAME>
    AFEventParamContentId: <ITEM_SKU>
    AFEventParamPrice: <ITEM_PRICE>
]);

Handling event submission success and failure

アプリ内イベントを記録する際に completionHandlerlogEvent に渡すことができます。このハンドラーを使用すると、次の2つのシナリオのロジックを定義できます。

  • アプリ内イベントが正常に記録された
  • アプリ内イベントの記録中にエラーが発生しました
[[AppsFlyerLib shared] logEventWithEventName:AFEventPurchase
        eventValues: @{
          AFEventParamRevenue: @200,
          AFEventParamCurrency: @"USD",
          AFEventParamQuantity: @2,
          AFEventParamContentId: @"092",
          AFEventParamReceiptId: @"9277"
        }
        completionHandler:^(NSDictionary<NSString *,id> * _Nullable dictionary, NSError * _Nullable error){
            if(dictionary != nil) {
                NSLog(@"In app callback success:");
                for(id key in dictionary){
                    NSLog(@"Callback response: key=%@ value=%@", key, [dictionary objectForKey:key]);
                }
            }
            if(error != nil) {
                NSLog(@"In app callback error:", error);
            }
    }];
AppsFlyerLib.shared().logEvent(name: "In app event name", values: ["id": 12345, "name": "John doe"], completionHandler: { (response: [String : Any]?, error: Error?) in
             if let response = response {
               print("In app event callback Success: ", response)
             }
             if let error = error {
               print("In app event callback ERROR:", error)
             }
           })
        }

アプリ内イベントの記録時にエラーが発生した場合には、次の表のようにエラーコードと文字列での説明が提供されます。

エラーコード説明 (NSError)
10"Event timeout. Check 'minTimeBetweenSessions' param"
11"Skipping event because 'isStopTracking' enabled"
40ネットワークエラー:Android経由のエラーの説明
41"No dev key"
50"Status code failure" + サーバーからの実際のエラーコード

Recording offline events

SDKはインターネットに接続されていないときに発生するイベントを記録することができます。詳細はオフライン時のアプリ内イベントを参照してください。

Logging events before calling start

SDKを初期化したが、start を呼び出さなかった場合、SDKは start が呼び出されるまでアプリ内イベントをキャッシュします。

キャッシュに複数のイベントがある場合は、それらは次々とサーバーに送信されます(非バッチ、イベント毎に1つのネットワークリエスト)。

📘

注意

SDKが初期化されると、logEvent 呼び出しは、startが呼び出されていなくても、または、isStoppedtrue に(SDKとS2Sモードの両方で)設定されていても、SKAdNetworkの updateConversionValue を呼び出します。

収益の記録

af_revenueは、AppsFlyerが管理画面とレポートで実際の収益としてカウントする唯一のイベントパラメーターです。
収益の情報は、どのアプリ内イベントでも送信できます。AFEventParameterRevenue 定数を使用して、アプリ内イベントの収益を含めてください。正負を問わず、あらゆる数値を入力できます。

コンマの値区切り、通貨記号、テキストなどは収益の値に含めないでください。たとえば、収益の値は「1234.56」のように設定してください。

Example: Purchase event with revenue

[[AppsFlyerLib shared] logEvent: AFEventPurchase 
withValues:@{
    AFEventParamContentId:@"1234567",
    AFEventParamContentType : @"category_a",
    AFEventParamRevenue: @200,
    AFEventParamCurrency:@"USD"
}];
AppsFlyerLib.shared().logEvent(AFEventPurchase, 
withValues: [
    AFEventParamContentId:"1234567",
    AFEventParamContentType : "category_a",
    AFEventParamRevenue: 200,
    AFEventParamCurrency:"USD"
]);

📘

注意

収益値に通貨記号を含めないでください。

Configuring revenue currency

af_currencyという既定のイベントパラメーターを使用して、イベントの収益に対する通貨コードを設定できます。

[[AppsFlyerLib shared] logEvent: AFEventPurchase
withValues:@{
    AFEventParamRevenue: @200,
    AFEventParamCurrency:@"USD"
}];
AppsFlyerLib.shared().logEvent(AFEventPurchase, 
withValues: [
    AFEventParamRevenue: 200,
    AFEventParamCurrency:"USD"
]);
  • 通貨コードは3桁のISO 4217コードを使用してください。
  • デフォルトの通貨はUSDです

通貨単位の設定、管理画面上での表示、通貨換算については、収益通貨に関するガイドをご覧ください。

Logging negative revenue

稀に、マイナスの収益を計測したいケースがあるかと思います。たとえば、ユーザーは払い戻しを受け取ったり、サブスクリプションをキャンセルしたときです。

マイナスの収益を記録する方法:

[[AppsFlyerLib shared] logEvent: @"cancel_purchase" 
withValues:@{
    AFEventParamContentId:@"1234567",
    AFEventParamContentType : @"category_a",
    AFEventParamRevenue: @-1.99,
    AFEventParamCurrency:@"USD"
}];
AppsFlyerLib.shared().logEvent("cancel_purchase", 
withValues: [
    AFEventParamContentId:"1234567",
    AFEventParamContentType : "category_a",
    AFEventParamRevenue: -1.99,
    AFEventParamCurrency:"USD"
]);

上記のコードについて次のことに注意してください。

  • 収益値の前にはマイナス記号が追加されています
  • イベント名は、cancel_purchase というカスタムイベントです。こうすることで、管理画面やローデータレポートで、マイナスの収益イベントを確認することができます。

購入の検証

AppsFlyerは、アプリ内購入をサーバーにて検証できます。validateAndLogInAppPurchase メソッドは購入イベントの検証とログを行います。

Purchase validation using validateAndLogInAppPurchase

validateAndLoginInAppPurchase はこれらの引数を取ります:

- (void) validateAndLogInAppPurchase:(NSString *) productIdentifier,
                  price:(NSString *) price
                  currency:(NSString *) currency
                  transactionId:(NSString *) tranactionId
                  additionalParameters:(NSDictionary *) params
                  success:(void (^)(NSDictionary *response)) successBlock
                  failure:(void (^)(NSError *error, id reponse)) failedBlock;
validateAndLog(inAppPurchase: String?,
               price: String?,
               currency: String?,
               transactionId: String?,
               additionalParameters: [AnyHashable : Any]?,
               success: ([AnyHashable : Any]) -> Void)?,
               failure: ((Error?, Any?) -> Void)?)

検証が成功した場合、レシート検証データ共に NSDictionary が返されます(Appleサーバーより提供)。

📘

注意

Calling validateAndLogInAppPurchase generates an af_purchase in-app event upon successful validation. Sending this event yourself creates duplicate event reporting.

Example: Validate in-app purchase

[[AppsFlyerLib shared] validateAndLogInAppPurchase:@"ProductIdentifier" price:@"price"
    currency:@"USD"
    transactionId:@"transactionID"
    additionalParameters:@{@"test": @"val" , @"test1" : @"val 1"}
    success:^(NSDictionary *result){
      NSLog(@"Purchase succeeded And verified! response: %@", result[@"receipt"]);
    } failure:^(NSError *error, id response) {
      NSLog(@"response = %@", response);
      if([response isKindOfClass:[NSDictionary class]]) {
        if([response[@"status"] isEqualToString:@"in_app_arr_empty"]){
          // retry with 'SKReceiptRefreshRequest' because
          // Apple has returned an empty response
          // <YOUR CODE HERE>
        }

      } else {
        //handle other errors
        return;
      }
  }];
AppsFlyerLib.shared().validateAndLogInAppPurchase (
  inAppPurchase: "productIdentifier",
  price: "price",
  currency: "currency",
  transactionId: "transactionId",
  additionalParameters: [:],
  success: {
      guard let dictionary = $0 as? [String:Any] else { return }
      dump(dictionary)
    }, 
  failure: { error, result in
      guard let emptyInApp = result as? [String:Any],
      let status = emptyInApp["status"] as? String,
      status == "in_app_arr_empty" else {
      // Try to handle other errors
      return
    }     
    })

サンドボックスモードでの購入検証テスト

サンドボックス環境で購入検証を行うには、以下のコードを追加してください:

[AppsFlyerLib shared].useReceiptValidationSandbox = YES;
AppsFlyerLib.shared().useReceiptValidationSandbox = true

📘

注意

このコードは、本番環境のビルドから削除する必要があります。

アプリ内購入の検証は、アプリ内購入イベントを自動的に生成し、AppsFlyerに送信します。eventValues は次のとおりです:

{
   "some_parameter": "some_value", // from additional_event_values
   "af_currency": "USD", // from currency
   "af_content_id" :"test_id", // from purchase
   "af_revenue": "10", // from revenue
   "af_quantity": "1", // from purchase
   "af_validated": true // flag that AF verified the purchase
}

イベント定数

Predefined event names

既定のイベント名の定数は、AFEventEventName の命名規則に従います。例:AFEventAddToCart

イベント名iOS 定数名
"af_level_achieved"
AFEventLevelAchieved
"af_add_payment_info"
AFEventAddPaymentInfo
"af_add_to_cart"
AFEventAddToCart
"af_add_to_wishlist"
AFEventAddToWishlist
"af_complete_registration"
AFEventCompleteRegistration
"af_tutorial_completion"
AFEventTutorial_completion
"af_initiated_checkout"
AFEventInitiatedCheckout
"af_purchase"
AFEventPurchase
"af_rate"
AFEventRate
AFEventSearch
"af_spent_credits"
AFEventSpentCredits
"af_achievement_unlocked"
AFEventAchievementUnlocked
"af_content_view"
AFEventContentView
"af_list_view"
AFEventListView
"af_travel_booking"
AFEventTravelBooking
"af_share"
AFEventShare
"af_invite"
AFEventInvite
"af_login"
AFEventLogin
"af_re_engage"
AFEventReEngage
"af_update"
AFEventUpdate
"af_opened_from_push_notification"
AFEventOpenedFromPushNotification
"af_location_coordinates"
AFEventLocation
"af_customer_segment"
AFEventCustomerSegment
"af_subscribe"
AFEventSubscribe
"af_start_trial"
AFEventStartTrial
"af_ad_click"
AFEventAdClick
"af_ad_view"
AFEventAdView

Predefined event parameters

既定のイベントパラメーターの定数は、AFEventParamParameterName の命名規則に従います。例:AFEventParamRevenue

イベントパラメーター名iOS 定数名
"af_content"
AFEventParamContent
"af_achievement_id"
AFEventParamAchievementId
"af_level"
AFEventParamLevel
"af_score"
AFEventParamScore
"af_success"
AFEventParamSuccess
"af_price"
AFEventParamPrice
"af_content_type"
AFEventParamContentType
"af_content_id"
AFEventParamContentId
"af_content_list"
AFEventParamContentList
"af_currency"
AFEventParamCurrency
"af_quantity"
AFEventParamQuantity
"af_registration_method"
AFEventParamRegistrationMethod
"af_payment_info_available"
AFEventParamPaymentInfoAvailable
"af_max_rating_value"
AFEventParamMaxRatingValue
"af_rating_value"
AFEventParamRatingValue
"af_search_string"
AFEventParamSearchString
"af_date_a"
AFEventParamDateA
"af_date_b"
AFEventParamDateB
"af_destination_a"
AFEventParamDestinationA
"af_destination_b"
AFEventParamDestinationB
"af_description"
AFEventParamDescription
"af_class"
AFEventParamClass
"af_event_start"
AFEventParamEventStart
"af_event_end"
AFEventParamEventEnd
"af_lat"
AFEventParamLat
"af_long"
AFEventParamLong
"af_customer_user_id"
AFEventParamCustomerUserId
"af_validated"
AFEventParamValidated
"af_revenue"
AFEventParamRevenue
"af_projected_revenue"
AFEventProjectedParamRevenue
"af_receipt_id"
AFEventParamReceiptId
"af_tutorial_id"
AFEventParamTutorialId
"af_virtual_currency_name"
AFEventParamVirtualCurrencyName
AFEventParamDeepLink
"af_old_version"
AFEventParamOldVersion
"af_new_version"
AFEventParamNewVersion
"af_review_text"
AFEventParamReviewText
"af_coupon_code"
AFEventParamCouponCode
"af_order_id"
AFEventParamOrderId
"af_param_1"
AFEventParam1
"af_param_2"
AFEventParam2
"af_param_3"
AFEventParam3
"af_param_4"
AFEventParam4
"af_param_5"
AFEventParam5
"af_param_6"
AFEventParam6
"af_param_7"
AFEventParam7
"af_param_8"
AFEventParam8
"af_param_9"
AFEventParam9
"af_param_10"
AFEventParam10
"af_departing_departure_date"
AFEventParamDepartingDepartureDate
"af_returning_departure_date"
AFEventParamReturningDepartureDate
"af_destination_list"
AFEventParamDestinationList //array of string
"af_city"
AFEventParamCity
"af_region"
AFEventParamRegion
"af_country"
AFEventParamCountry
"af_departing_arrival_date"
AFEventParamDepartingArrivalDate
"af_returning_arrival_date"
AFEventParamReturningArrivalDate
"af_suggested_destinations"
AFEventParamSuggestedDestinations //array of string
"af_travel_start"
AFEventParamTravelStart
"af_travel_end"
AFEventParamTravelEnd
"af_num_adults"
AFEventParamNumAdults
"af_num_children"
AFEventParamNumChildren
"af_num_infants"
AFEventParamNumInfants
"af_suggested_hotels"
AFEventParamSuggestedHotels //array of string
"af_user_score"
AFEventParamUserScore
"af_hotel_score"
AFEventParamHotelScore
"af_purchase_currency"
AFEventParamPurchaseCurrency
"af_preferred_star_ratings"
AFEventParamPreferredStarRatings //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values"
"af_preferred_price_range"
AFEventParamPreferredPriceRange //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values"
"af_preferred_neighborhoods"
AFEventParamPreferredNeighborhoods //array of string
"af_preferred_num_stops"
AFEventParamPreferredNumStops
"af_adrev_ad_type"
AFEventParamAdRevenueAdType
"af_adrev_network_name"
AFEventParamAdRevenueNetworkName
"af_adrev_placement_id"
AFEventParamAdRevenuePlacementId
"af_adrev_ad_size"
AFEventParamAdRevenueAdSize
"af_adrev_mediated_network_name"
AFEventParamAdRevenueMediatedNetworkName

このページは役に立ちましたか?