iOS 集成廣點(diǎn)通(API上報(bào)方案/提審注意[OC+AFNetworking 3.0])

公司最近需要對(duì)APP進(jìn)行推廣,選擇廣點(diǎn)通增加下載量.需要在APP中增加相應(yīng)的代碼.
廣點(diǎn)通官網(wǎng)

官方文檔圖

源碼使用:OC+AFNetworking 3.0

一.關(guān)鍵參數(shù):
1.Apple ID: 在iTunesConnect中獲取
2.UID:廣點(diǎn)通后臺(tái)賬號(hào)ID


獲取UID

3.EncryptKey 和 SignKey:在廣點(diǎn)通后臺(tái)獲取


轉(zhuǎn)化跟蹤列表
創(chuàng)建轉(zhuǎn)換第一步
創(chuàng)建轉(zhuǎn)換第二步
創(chuàng)建轉(zhuǎn)換第第三步
啟動(dòng)

配置已結(jié)束,以下是相關(guān)代碼
YGGuangDianTong.h

#import <Foundation/Foundation.h>

@interface YGGuangDianTong : NSObject
+ (instancetype)shareGuangDianTong;
- (void)send;
@end

YGGuangDianTong.m

#import "YGGuangDianTong.h"
#import <AdSupport/ASIdentifierManager.h>
#import <AFNetworking/AFNetworking.h>
// github 上下載,三個(gè)文件且是MRC,需要配置
#import "GTMBase64.h" 

#define gdt_encrypt_key @"XXXXXX"
#define gdt_sign_key    @"XXXXXXX"
#define gdt_app_id      @"XXXXXX" // APPID
#define gdt_advertiser_id @"XXXXX" // 廣點(diǎn)通的賬戶 ID

#define CC_MD5_DIGEST_LENGTH 16
// 是否已經(jīng)上報(bào)廣點(diǎn)通
#define kIsReportGuangDianTongKey @"kIsReportGuangDianTongKey"

static id _guangDianTong = nil;

@implementation YGGuangDianTong

+ (instancetype)shareGuangDianTong {
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _guangDianTong = [[self alloc] init];
    });
    return _guangDianTong;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _guangDianTong = [super allocWithZone:zone];
    });
    return _guangDianTong;
}
- (id)copyWithZone:(NSZone *)zone
{
    return _guangDianTong;
}

#pragma IDFA
- (NSString *)GetIDFA{
    return [ASIdentifierManager sharedManager].advertisingIdentifier.UUIDString;
}

//激活發(fā)送
- (void)send {
    
    //只有第一次才發(fā)送
    if([[[NSUserDefaults standardUserDefaults] objectForKey:kIsReportGuangDianTongKey] boolValue]){
        DLog(@"已經(jīng)上報(bào)廣點(diǎn)通")
        return;
    }
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
 
    // @"application/x-javascript" 添加類型,否則報(bào)錯(cuò)
    manager.responseSerializer.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", @"text/html",@"application/x-javascript", nil];
    
    [manager GET:[self generateUrl] parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
        DLog(@"JSON: %@", responseObject);
        NSMutableString *message = [NSMutableString stringWithString:@"廣點(diǎn)通上報(bào):"];
        switch ([responseObject[@"ret"] integerValue]) {
            case 0:
                [message appendString:@"成功"];
                [[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:kIsReportGuangDianTongKey];
                [[NSUserDefaults standardUserDefaults] synchronize];
                break;
            case -1:
                [message appendString:@"請(qǐng)求非法參數(shù)"];
                break;
            case -2:
                [message appendString:@"參數(shù)解析失敗"];
                break;
            case -3:
                [message appendString:@"參數(shù)解碼失敗"];
                break;
            case -12:
                [message appendString:@"獲取密鑰失敗"];
                break;
            case -13:
                [message appendString:@"非法的應(yīng)用類型"];
                break;
            case -14:
                [message appendString:@"非法的轉(zhuǎn)化時(shí)間"];
                break;
            case -15:
                [message appendString:@"非法的廣點(diǎn)通移勱設(shè)備標(biāo)識(shí)"];
                break;
            case -17:
                [message appendString:@"獲取轉(zhuǎn)化規(guī)則失敗"];
                break;
            default:
                break;
        }
        DLog(@"%@", message);
    } failure:^(NSURLSessionTask *operation, NSError *error) {
        DLog(@"Error: %@",  error);
    }];
    
}

- (NSString *)generateUrl{
    NSString *result = @"";
    
    NSString *encrypt_key = gdt_encrypt_key;
    NSString *sign_key = gdt_sign_key;
    NSString *app_id = gdt_app_id;
    NSString *idfa = [self GetIDFA];
    NSString *conv_type = @"MOBILEAPP_ACTIVITE";
    NSString *app_type = @"IOS";
    NSString *advertiser_id = gdt_advertiser_id;
    
    NSString *conv_time = [NSString stringWithFormat:@"%.0lf", [NSDate date].timeIntervalSince1970];
    
    NSString *muid = [self generateMuid:idfa];
    NSString *query_string = [NSString stringWithFormat:@"muid=%@&conv_time=%@", muid, conv_time];
    
    NSString *encode_page = [NSString stringWithFormat:@"http://t.gdt.qq.com/conv/app/%@/conv?%@", app_id, query_string];
    NSString *temp = [NSString stringWithFormat:@"%@&GET&%@", sign_key, [self encodeToPercentEscapeString:encode_page]];
    NSString *signature = [self getMd5_32Bit_String:temp];
    NSString* base_data = [query_string stringByAppendingFormat:@"&sign=%@", signature];
    
    NSString* v_data = [self encodeToPercentEscapeString:[GTMBase64 stringByEncodingData:[self simpleXor:base_data key:encrypt_key]]];
    
    NSLog(@"query_string: %@", query_string);
    NSLog(@"v_data: %@", v_data);
    
    result = [NSString stringWithFormat:@"http://t.gdt.qq.com/conv/app/%@/conv?v=%@&conv_type=%@&app_type=%@&advertiser_id=%@", app_id, v_data, conv_type, app_type, advertiser_id];
    NSLog(@"\n%@", result);
    return result;
}


//生成muid
- (NSString *)generateMuid:(NSString *)idfa {
    idfa = [idfa uppercaseString];
    NSString* result = [self getMd5_32Bit_String:idfa];
    NSLog(@"muid--%@", result);
    return result;
}
//urlEncode
- (NSString *)encodeToPercentEscapeString: (NSString *) input
{
    NSString *outputStr = (NSString *)
    CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                              (CFStringRef)input,
                                                              NULL,
                                                              (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                              kCFStringEncodingUTF8));
    return outputStr;
}
//異或操作
- (NSData *)simpleXor:(NSString *)info key:(NSString *)key {
    
    const   char *infoBytes = [info UTF8String];
    const   char *keyBytes = [key UTF8String];
    
    int i = 0, j = 0;
    char *bytes = malloc(strlen(infoBytes));
    for (i = 0; i < strlen(infoBytes); i++) {
        bytes[i] = (char)(infoBytes[i]^keyBytes[j]);
        
        j++;
        j = j%(key.length);
    }
    NSData *data = [NSData dataWithBytes:bytes length:strlen(infoBytes)];
    return data;
}

- (NSString *)getMd5_32Bit_String:(NSString *)srcString{
    const char *cstr = [srcString UTF8String];
    uint8_t digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5(cstr, (int)strlen(cstr), digest);
    NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [result appendFormat:@"%02x",digest[i]];
    }
    return [result lowercaseString];
}

@end

調(diào)用:
AppDelegate.m

// 引入頭文件
#import "YGGuangDianTong.h" 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 廣點(diǎn)通接入
    [[YGGuangDianTong shareGuangDianTong] send];
    return YES;
}

二.提審注意:
由于使用了IDFA,提審需要相應(yīng)選擇,以免被拒.

提審勾選

[完]如有漏洞,請(qǐng)留言!!!

相關(guān)教程:
iOS 集成廣點(diǎn)通移動(dòng) App 激活數(shù)據(jù)統(tǒng)計(jì) API 上報(bào)方案
騰訊-----廣點(diǎn)通iOS端接入實(shí)現(xiàn)
如何防止應(yīng)用因獲取IDFA被AppStore拒絕

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜓氨,一起剝皮案震驚了整個(gè)濱河市棕叫,隨后出現(xiàn)的幾起案子谬擦,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涯捻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)望迎,“玉大人障癌,你說(shuō)我怎么就攤上這事”缱穑” “怎么了涛浙?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)对省。 經(jīng)常有香客問我蝗拿,道長(zhǎng),這世上最難降的妖魔是什么蒿涎? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任哀托,我火速辦了婚禮,結(jié)果婚禮上劳秋,老公的妹妹穿的比我還像新娘仓手。我一直安慰自己胖齐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布嗽冒。 她就那樣靜靜地躺著呀伙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪添坊。 梳的紋絲不亂的頭發(fā)上剿另,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音贬蛙,去河邊找鬼雨女。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阳准,可吹牛的內(nèi)容都是我干的氛堕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼野蝇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讼稚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绕沈,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锐想,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后乍狐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痛倚,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年澜躺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抒蚜。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掘鄙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗡髓,到底是詐尸還是另有隱情操漠,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布饿这,位于F島的核電站浊伙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏长捧。R本人自食惡果不足惜嚣鄙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望串结。 院中可真熱鬧哑子,春花似錦舅列、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至弥奸,卻和暖如春榨惠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盛霎。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工赠橙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摩渺。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓简烤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親摇幻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子横侦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容