iOS被拒条目 - passiony/gillar_wiki GitHub Wiki

iOS被拒条目

1.使用了非公开url,而被拒。

  • 问题描述:

Your app uses the "prefs:root=" non-public URL scheme...

  • 解决方案:
NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"prefs:root=%@",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]]];
[[UIApplication sharedApplication]openURL:url];

替换为

NSURL* url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {}];

2.获取idfa权限申请

  • 问题描述:

    iOS14以上和iOS以下对于idfa的权限申请测略不一样。

    13以下,因为默认是开启的,不需要添加权限,不做处理

    14以上,默认是关闭的,需要添加申请权限和提示语。

    首次使用权限不需要新加oc代码弹出请求获取权限提示,如果用户关闭,再次申请打开,需要新加代码调用获取权限提示语

* 解决方案

  • 1.添加framework:AppTrackingTransparency.framework

  • 2.info.plist提示语

    //获取广告追踪idfa权限
    <key>NSUserTrackingUsageDescription</key>
    <string>"WordScent" Would Like to Accesss Your Identity for Advertisers To Track the Ads</string>

    其它权限提示语参考

    //获取相机权限
    <key>NSCameraUsageDescription</key>
    <string>"WordScent" Would Like to Accesss the Camera This will let you take photos and record video.</string>
    //获取定位权限
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>"WordScent" Would Like to Access Your Location</string>
    //获取麦克风权限
    <key>NSMicrophoneUsageDescription</key>
    <string>"WordScent" Would Like to Access Your Microphone</string>
  • 3.添加弹出框代码

    //引入头文件 
    #import <AppTrackingTransparency/AppTrackingTransparency.h> 
    #import <AdSupport/ASIdentifierManager.h> 
    @implementation UnityAppController 
        
    - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {    //******************    
        UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath] UTF8String]);    
        //------------------
        if (@available(iOS 14, *)) {   
            // iOS14及以上版本需要先请求权限    
            [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {        // 获取到权限后,依然使用老方法获取idfa        
                if (status == ATTrackingManagerAuthorizationStatusAuthorized) {            
                    NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];            NSLog(@"%@",idfa);        
                } else {            
                    NSLog(@"请在设置-隐私-跟踪中允许App请求跟踪");            
                    //可选:跳转到setting        
                }   
            }]; 
        } else {    
                    // iOS14以下版本依然使用老方法    
            // 判断在设置-隐私里用户是否打开了广告跟踪    
            if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
                NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];    
                NSLog(@"%@",idfa);  
            } else {      
                NSLog(@"请在设置-隐私-广告中打开广告跟踪功能");     
                //可选:跳转到setting   
            }
        } 
                //------------------ 
        [self selectRenderingAPI]; 
        //******************}
    end

3.苹果登录按钮

  • 问题描述:

    如果添加了fb或者gp等第三方登录,则必须添加苹果登录功能

  • 解决方案

    • 1.打开苹果开发者后台 developer.apple.com,进入页签Certificates,Identifiers&Profiles,在Identifiers栏目中选择当前项目,添加权限Sign In with App,点击保存
    • 2.依次生成三种描述文件(development、adhoc、appleStore),下载后双击导入到XCode工程中
    • 3.XCode 工程引入AuthenticationServices.framework
    • 4.Unity项目内集成SignInWithApp插件,导入插件,下载地址:
    • 5.Unity调用指定接口进行apple登陆
-- 登陆苹果服务器
SignInWithApple.Instance.Login(OnLogin);

-- 验证当前用户身份的状态credentialState,根据返回状态进行界面显示处理
SignInWithApple.Instance.GetCredentialState(appleUserId, OnCredentialState);

-- 当credentialState == UserCredentialState.Authorized-代表当前登陆状态有效
if(credentialState == UserCredentialState.Authorized){
	
}

4.获取通知权限

  • 问题描述: 如果添加了推送功能,证书中必须添加推送
  • 解决方案:
    • 1.添加Capability:Push Notifications,Background Modes(并勾选Remote notifications)
    • 2.请求系统打开通知权限,在App安装后只会出现一次,此次弹出窗口后,无论用户选择什么选项都会在App设置中出现通知开关UI;
    • 3.获取当前App通知权限时候开启(若未出现系统打开通知权限,此时通知权限为未开启状态);
    • 4.若用户关闭通知权限,此次引导用户打开通知权限,只需打开设置即可;
/**是否开启推送*/
- (BOOL)isSwitchAppNotification {
    if (@available(iOS 10 , *)) {
        __block BOOL result = NO;
        //异步线程中操作是否完成
        __block BOOL inThreadOperationComplete = NO;
        [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
            if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
                result = NO;
            }else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
                result = NO;
            }else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized) {
                result = YES;
            }else {
                result = NO;
            }
            inThreadOperationComplete = YES;
        }];

        while (!inThreadOperationComplete) {
            [NSThread sleepForTimeInterval:0];
        }
        return result;
    }
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    else if (@available(iOS 8 , *))
    {
        UIUserNotificationSettings *setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
        if (UIUserNotificationTypeNone != setting.types) {
            return YES;
        }else {
            return NO;
        }

    }else
    {
        UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
        if(UIRemoteNotificationTypeNone != type) {
            return YES;
        }else {
            return NO;
        }
    }
#pragma clang diagnostic pop
}

5.获取相册权限


6.内购初始化

  • 1.内购初始化时机错误被拒

    原因:内购功能初始化是异步操作,在打开商城(内购商品相关功能界面)之前,需要判断内购功能是否初始化成功,未完成,则根据具体业务需要与否弹出提示界面。(boggle处理方式为若内购条目未初始化完毕 做图片遮罩(转圈)屏蔽,等到内购初始化完毕后才可点击)

7.Xcode升级

  • 1.比较大的Xcode版本(比如ios14的版本)必须升级后再打包,否则新版本的苹果手机 不能正常打开项目
⚠️ **GitHub.com Fallback** ⚠️