How to detect that a provisioning profile is for development or distribution, programmatically

后端 未结 4 2159
庸人自扰
庸人自扰 2020-12-08 14:41

I would like to detect if a given provisioning profile is a development profile or a distribution (adhoc or app store) profile. I need to do this purely programmatically.

4条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-08 14:55

    Based on Bryan Musial great answer I wrote some code that allow you to check "get-task-allow" directly from application at runtime. In my case I'm using this boolean to only log in debug apps :

    + (BOOL)isDevelopmentApp
    {
        // Special case of simulator
        if (isSimulator)
        {
            return YES;
        }
    
        // There is no provisioning profile in AppStore Apps
        NSString *profilePath = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"];
    
        // Check provisioning profile existence
        if (profilePath)
        {
            // Get hex representation
            NSData *profileData = [NSData dataWithContentsOfFile:profilePath];
            NSString *profileString = [NSString stringWithFormat:@"%@", profileData];
    
            // Remove brackets at beginning and end
            profileString = [profileString stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:@""];
            profileString = [profileString stringByReplacingCharactersInRange:NSMakeRange(profileString.length - 1, 1) withString:@""];
    
            // Remove spaces
            profileString = [profileString stringByReplacingOccurrencesOfString:@" " withString:@""];
    
            // Convert hex values to readable characters
            NSMutableString *profileText = [NSMutableString new];
            for (int i = 0; i < profileString.length; i += 2)
            {
                NSString *hexChar = [profileString substringWithRange:NSMakeRange(i, 2)];
                int value = 0;
                sscanf([hexChar cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value);
                [profileText appendFormat:@"%c", (char)value];
            }
    
            // Remove whitespaces and new lines characters
            NSArray *profileWords = [profileText componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            NSString *profileClearText = [profileWords componentsJoinedByString:@""];
    
            // Look for debug value
            NSRange debugRange = [profileClearText rangeOfString:@"get-task-allow"];
            if (debugRange.location != NSNotFound)
            {
                return YES;
            }
        }
    
        // Return NO by default to avoid security leaks
        return NO;
    }
    

提交回复
热议问题