短くてシンプルなので、個人的にはミックの答えが好きです。
Greg の応答は無効です -- Mick のコードは、アプリがその URL を開くことができるかどうかのみをチェックするため、クラッシュする可能性はありません。
アプリが暗号化されているかどうかをより厳密にチェックする前に、自分のアプリの 1 つに以下を実装しました。暗号化されていない場合は、おそらくクラックされたアプリです。
分析によると、この方法で何千人もの海賊版ユーザーを防いでおり、実装に 5 分ほどかかったので、コストはほとんどかかりませんでした。とにかく行くつもりはありません-それは、人々が私のハードワークからたむろしていることを望んでいないということです)。さらに、私のアプリのコンテンツの多くは、アプリが海賊版であるかどうかを判断した後に情報をフィードし、海賊版である場合はジャンク データを返します。
main.m で
#import <dlfcn.h>
#import <mach-o/dyld.h>
#import <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR && !defined(LC_ENCRYPTION_INFO)
#define LC_ENCRYPTION_INFO 0x21
struct encryption_info_command {
uint32_t cmd;
uint32_t cmdsize;
uint32_t cryptoff;
uint32_t cryptsize;
uint32_t cryptid;
};
#endif
static BOOL isEncrypted();
static BOOL isEncrypted () {
const struct mach_header *header;
Dl_info dlinfo;
/* Fetch the dlinfo for main() */
if (dladdr(main, &dlinfo) == 0 || dlinfo.dli_fbase == NULL) {
//NSLog(@"Could not find main() symbol (very odd)");
return NO;
}
header = dlinfo.dli_fbase;
/* Compute the image size and search for a UUID */
struct load_command *cmd = (struct load_command *) (header+1);
for (uint32_t i = 0; cmd != NULL && i < header->ncmds; i++) {
/* Encryption info segment */
if (cmd->cmd == LC_ENCRYPTION_INFO) {
struct encryption_info_command *crypt_cmd = (struct encryption_info_command *) cmd;
/* Check if binary encryption is enabled */
if (crypt_cmd->cryptid < 1) {
/* Disabled, probably pirated */
return NO;
}
/* Probably not pirated <-- can't say for certain, maybe theres a way around it */
return YES;
}
cmd = (struct load_command *) ((uint8_t *) cmd + cmd->cmdsize);
}
/* Encryption info not found */
return NO;
}