web-dev-qa-db-ja.com

AdvertisingIdentifierとidentifierForVendorは「00000000-0000-0000-0000-000000000000」を返します

advertisingIdentifieridentifierForVendorを取得するためにこのメソッドを実装しました。

- (NSString *) advertisingIdentifier
{
    if (!NSClassFromString(@"ASIdentifierManager")) {
        return [OpenUDID value];
    }
    return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}

- (NSString *) identifierForVendor
{
    if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) {
        return [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    }
    return @"";
}

- (BOOL)isAdvertisingTrackingEnabled
{
    if (NSClassFromString(@"ASIdentifierManager") && ![[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
        return NO;
    }
    return YES;
}

シミュレーターでは、すべてが正常に機能しており、2つの文字列ID表現を取得できます。

しかし iOS 6.0(10A403)を搭載したiPhone 3GSから実行すると、これら2つのメソッドは識別子として「00000000-0000-0000-0000-000000000000」を返します。すでに完了:

  • デバイスを再起動しました
  • アプリを削除して再インストールしました
  • 作成およびアドホックビルド、インストール、削除、および再インストール
  • 別のアプリからこのコードを実行する
  • IOS 6.0(10A403)を搭載したiPad 2でテストし、すべてがうまくいきましたわかりました(正しい識別子があります)
25
J. Costa

IOSのバグのようです。無線でアップグレードされたデバイスでも同じ問題が発生しますが、XcodeまたはiTunesでアップグレードされたデバイスは、ゼロなしで期待どおりに機能します。

あなたと同様の手順を試しましたが、共通のテーマは無線(悪い)とテザーアップグレード(良い)だけでした。

更新: iOS 5.1から6.1の無線に直接移行するユーザーは、異なる動作を経験します。アプリを完全に閉じて再起動するたびに、identifierForVendorによって新しい値が返されます。これは、アプリがアンインストールおよび再インストールされている場合に予想されますが、そうではありません。

24
MattP

Appleは、テクニカルサポートインシデントのリクエストに応じて、システムのこのバグを確認しました。彼らは、identifierForVendoradvertisingIdentifierが時々すべてゼロを返すことは、開発ビルドとAppStoreから無線でダウンロードされたアプリの両方で見られると言いました。彼らには回避策がなく、問題がいつ修正されるかを言うことができません。

8
Peter B. Kramer

デバイスの復元後のように、APIがIDに対して空の応答を返す場合があります。

IDの取得を延期することをお勧めします。これにより、次のようにsometginhを呼び出すことができます。

-(void)retrieveID
{
    if (<check fails>)
        [self performSelector:@"retrieveID" withObject:nil afterDelay:1.0];
}

後でIDを取得します。

0
vedrano