Как получить "хешированный идентификатор устройства" для тестирования admob на ios

При внедрении AdMob вы можете определить массив идентификаторов тестов, чтобы Google знал, что для показа тестовых объявлений на этих устройствах вместо реальных объявлений. Однако для этого требуются "хэшированные идентификаторы устройств". Это кажется мне немного расплывчатым. О каком ID они говорят и какой метод хэширования они ожидают от меня?

Я говорю о бит, который должен идти здесь:

request.testDevices = @[ @"hashed-device-id" ];

Ответ 1

Я понял, как создать идентификатор устройства AdMob: Просто вычислите MD5 идентификатора рекламы.

#import <AdSupport/ASIdentifierManager.h>
#include <CommonCrypto/CommonDigest.h>

- (NSString *) admobDeviceID
{
    NSUUID* adid = [[ASIdentifierManager sharedManager] advertisingIdentifier];
    const char *cStr = [adid.UUIDString UTF8String];
    unsigned char digest[16];
    CC_MD5( cStr, strlen(cStr), digest );

    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];

    return  output;

}

Ответ 2

Запустите приложение без установки тестовых устройств и посмотрите на вывод отладчика. Там вы найдете сообщение типа:

<Google> To get test ads on this device, call: request.testDevices = @[ @"49cd348fa9c01223dd293bcce92f1e08" ];

Я думаю, что сообщение самообучалось.

Ответ 3

Я получаю идентификатор устройства таким образом: Swift 3.0

Не забудьте добавить #import <CommonCrypto/CommonCrypto.h> в заголовок моста ObjC-Swift, который создает Xcode.

extension String
{
    var md5: String! {
        let str = self.cString(using: String.Encoding.utf8)
        let strLen = CC_LONG(self.lengthOfBytes(using: String.Encoding.utf8))
        let digestLen = Int(CC_MD5_DIGEST_LENGTH)
        let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)

        CC_MD5(str!, strLen, result)

        let hash = NSMutableString()
        for i in 0..<digestLen {
            hash.appendFormat("%02x", result[i])
        }

        result.deallocate(capacity: digestLen)

        return String(format: hash as String)
    }
}

import AdSupport
...
{
  var uuid: UUID = ASIdentifierManager.shared().advertisingIdentifier
  print("\(uuid.uuidString.md5)")
}

Расширение для класса String было взято здесь.

Ответ 4

Проверьте ASIdentifierManager. Он создан специально для доступа к уникальным идентификаторам устройств, которые будут использоваться для показа рекламы. Вы можете получить уникальный идентификатор для текущего устройства, например, так:

ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager];
NSString *uniqueDeviceId = [[manager advertisingIdentifier] UUIDString];

Альтернативный способ доступа к уникальному идентификатору для устройства:

NSString *uniqueDeviceId = [[UIDevice currentDevice] identifierForVendor];

Однако согласно документации Apple, identifierForVendor не предназначен для использования в рекламных целях.

Ответ 5

По какой-то причине я не видел "Получить тестовые объявления..." в консоли. В любом случае, вы можете захотеть, чтобы вашим бета-тестерам не приходилось копаться в темноте, чтобы найти это и отправить вам на жесткий код. Вот ответ феликса (правильный, очень большой) в версии Swift 3, используя код из http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/

Обратите внимание, что вам понадобится соединительный заголовок со следующим:

#import <CommonCrypto/CommonCrypto.h>

Здесь хеш-функция:

func md5(_ string: String) -> String {
    let context = UnsafeMutablePointer<CC_MD5_CTX>.allocate(capacity: 1)
    var digest = Array<UInt8>(repeating:0, count:Int(CC_MD5_DIGEST_LENGTH))
    CC_MD5_Init(context)
    CC_MD5_Update(context, string, CC_LONG(string.lengthOfBytes(using: String.Encoding.utf8)))
    CC_MD5_Final(&digest, context)
    context.deallocate(capacity: 1)
    var hexString = ""
    for byte in digest {
       hexString += String(format:"%02x", byte)
    }
    return hexString
}

И здесь он используется для примера кода Google:

func createAndLoadInterstitial() {
    interstitial = GADInterstitial(adUnitID: G.googleMobileTestAdsId)
    interstitial.delegate = self
    let request = GADRequest()

    // Here the magic.
    let id = ASIdentifierManager.shared().advertisingIdentifier!
    let md5id = md5(id.uuidString)

    // And now we use the magic.
    request.testDevices = [ kGADSimulatorID, md5id ]
    interstitial.load(request)
}

Ответ 6

найти какой-нибудь журнал, например, следующий

 <Google> To get test ads on this device, call: request.testDevices = @[ @"7505289546eeae64cd2fxxxxxa2b94" ];

или

Use AdRequest.Builder.addTestDevice("AEC1F310D326xxxxx37BC") to get test ads on this device.

Ответ 7

В Swift 2, Xcode 7.3 я сделал это, и рекламный баннер теперь показывает тестовое объявление, когда я запускаю в симуляторе:

    let request = GADRequest()
    request.testDevices = [kGADSimulatorID]
    bannerView.loadRequest(request)