Куча левых скачиваний

Тема в разделе "Реклама и продвижение мобильных приложений", создана пользователем Tomat, 5 июн 2015.

  1. Tomat

    Tomat Новичок

    Регистрация:
    28 май 2015
    Сообщения:
    18
    Сказали спасибо:
    1
    Репутация:
    0
    Всем доброго времени суток!

    С неделю назад заметила резкое увеличение странных скачиваний моего приложения. Траф с тех пор и по настоящий момент прёт из Юго-Восточной Азии (Вьетнам, Индия, Бангладеш), причем в iTunes Connect скачки не отображаются. :confused:

    Что за чертовщина происходит? У кого-нибудь что-нибудь похожее наблюдается в последнее время? Спасибо!
     
  2. Чёрный

    Чёрный Модератор Команда форума

    Регистрация:
    4 июн 2015
    Сообщения:
    28
    Сказали спасибо:
    8
    Репутация:
    50
    Сталкивался с подобным. Скорее всего, ваше приложении нагло спиратили. Если хотите с этим бороться (лично я для большинства своих проектов оставил пиратов в покое – тоже ведь маркетинг, пусть и своеобразный), то проще всего использовать следующее решение, которое я в своё время подсмотрел.

    Суть такова: пишем код, благодаря которому каждый раз при открытии нашего приложения юзером на наш сервер будет отправляться бинарный хеш, где он будет сравниваться с "хеш-ключом". Если они не совпадут, то пользовательская копия приложения – пиратская. Элементарно и эффективно!

    1. Генерируем BinaryHash:
    Код:
        + (NSString*) binaryMD5Hash {
            NSString *result = nil;
            NSString *executablePath = [[NSBundle mainBundle] executablePath];
            CFStringRef executableFileMD5Hash =  FileMD5HashCreateWithPath((CFStringRef)executablePath,  FileHashDefaultChunkSizeForReadingData);
          
            if (executableFileMD5Hash) {
                result = [NSString stringWithFormat:@"%@", (NSString *)executableFileMD5Hash];
                CFRelease(executableFileMD5Hash);
            }
          
            return result;
        }
    2. FileMD5Hash.h
    Код:
        #ifndef FILEMD5HASH_H
        #define FILEMD5HASH_H
       
        #include <CoreFoundation/CoreFoundation.h>
       
        #define FileHashDefaultChunkSizeForReadingData 4096
       
        FILEMD5HASH_EXTERN CFStringRef FileMD5HashCreateWithPath(CFStringRef filePath, size_t chunkSizeForReadingData);
       
        #endif
    3. FileMD5Hash.m
    Код:
        #include "FileMD5Hash.h"
        #include <stdint.h>
        #include <stdio.h>
        #include <CoreFoundation/CoreFoundation.h>
        #include <CommonCrypto/CommonDigest.h>
       
        CFStringRef FileMD5HashCreateWithPath(CFStringRef filePath,  size_t chunkSizeForReadingData) {
            CFStringRef result = NULL;
            CFReadStreamRef readStream = NULL;
          
            // Get the file URL
            CFURLRef fileURL =
            CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
                                          (CFStringRef)filePath,
                                          kCFURLPOSIXPathStyle,
                                          (Boolean)false);
            if (!fileURL) goto done;
          
            // Create and open the read stream
            readStream = CFReadStreamCreateWithFile(kCFAllocatorDefault, (CFURLRef)fileURL);
            if (!readStream) goto done;
            bool didSucceed = (bool)CFReadStreamOpen(readStream);
            if (!didSucceed) goto done;
          
            // Initialize the hash object
            CC_MD5_CTX hashObject;
            CC_MD5_Init(&hashObject);
          
            // Make sure chunkSizeForReadingData is valid
            if (!chunkSizeForReadingData) {
                chunkSizeForReadingData = FileHashDefaultChunkSizeForReadingData;
            }
          
            // Feed the data to the hash object
            bool hasMoreData = true;
            while (hasMoreData) {
                uint8_t buffer[chunkSizeForReadingData];
                CFIndex readBytesCount = CFReadStreamRead(readStream,
                                                          (UInt8 *)buffer,
                                                          (CFIndex)sizeof(buffer));
                if (readBytesCount == -1) break;
                if (readBytesCount == 0) {
                    hasMoreData = false;
                    continue;
                }
                CC_MD5_Update(&hashObject, (const void *)buffer, (CC_LONG)readBytesCount);
            }
          
            // Check if the read operation succeeded
            didSucceed = !hasMoreData;
          
            // Compute the hash digest
            unsigned char digest[CC_MD5_DIGEST_LENGTH];
            CC_MD5_Final(digest, &hashObject);
          
            // Abort if the read operation failed
            if (!didSucceed) goto done;
          
            // Compute the string result
            char hash[2 * sizeof(digest) + 1];
            for (size_t i = 0; i < sizeof(digest); ++i) {
                snprintf(hash + (2 * i), 3, "%02x", (int)(digest[i]));
            }
            result = CFStringCreateWithCString(kCFAllocatorDefault, (const char *)hash, kCFStringEncodingUTF8);
          
        done:
          
            if (readStream) {
                CFReadStreamClose(readStream);
                CFRelease(readStream);
            }
          
            if (fileURL) {
                CFRelease(fileURL);
            }
          
            return result;
        }
     
    Tomat, InstallMaker и Gilfoyle сказали спасибо.
  3. Gilfoyle

    Gilfoyle Местный

    Регистрация:
    25 май 2015
    Сообщения:
    109
    Сказали спасибо:
    47
    Репутация:
    20
    Код-то рабочий, только что если у пользователя нет доступа к сети? Можно же и разовую аутентификацию сделать, один раз прошел процедуру и готово - девайс не сдрюченный, можно работать. Или, к примеру, на случай "Без сети" систему "экстренных подключений" ввести: выдать пользователям N попыток использования приложения, прежде чем им снова потребуется доступ к серверу, и чтоб это число N им было видно. Как вариант?
     
  4. InstallMaker

    InstallMaker Новичок

    Регистрация:
    10 июн 2015
    Сообщения:
    12
    Сказали спасибо:
    1
    Репутация:
    0
    Код, получается, предотвращает запуск программы на джейлбрейкнутом устройстве, так?
     
  5. Tomat

    Tomat Новичок

    Регистрация:
    28 май 2015
    Сообщения:
    18
    Сказали спасибо:
    1
    Репутация:
    0
    Чёрный, спасибо большое! Буду пробовать :rolleyes:
     

Поделиться этой страницей