文档章节

iOS开发之诱导用户为自己的App评论功能

 北方人在上海
发布于 2016/05/18 10:22
字数 1369
阅读 23
收藏 0
点赞 2
评论 0

"由于我自己的App下载量少,评论也少,出于App的aso优化,想尽办法,而评论是aso里边比较重视的一块,前面的版本都没有诱导用户评论的这一功能,导致有些被动。"

由此自己简单的封装了该功能,下面我们先看看效果图:

blob.png

弹出试图并没有做什么处理,就是系统的8.0以前用的UIAlertView8.0以上用的UIAlertController

具体的一些算法,都可以看代码,闲话不多说,直接贴码

新建一个NSObject的类命名为LBToAppStore 具体代码如下

.h文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#import #import @interface LBToAppStore : NSObject{

    #if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_8_0

 

    UIAlertView *alertViewTest;

 

    #else

 

    UIAlertController *alertController;

 

    #endif

 

}

 

@property (nonatomic,strong) NSString * myAppID;//appID

 

 

 

- (void)showGotoAppStore:(UIViewController *)VC;

 

@end

.m文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

#import "LBToAppStore.h"

 

@implementation LBToAppStore

 

 

- (void)showGotoAppStore:(UIViewController *)VC{

    //当前版本号

    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];

    float appVersion = [[infoDictionary objectForKey:@"CFBundleShortVersionString"] floatValue];

    //userDefaults里的天数

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    int udtheDays = [[userDefaults objectForKey:@"theDays"] intValue];

    //userDefaults里的版本号

    float udAppVersion = [[userDefaults objectForKey:@"appVersion"] intValue];

    //userDefaults里用户上次的选项

    int udUserChoose = [[userDefaults objectForKey:@"userOptChoose"] intValue];

    //时间戳的天数

    NSTimeInterval interval = [[NSDate date] timeIntervalSince1970];

    int daySeconds = 24 * 60 * 60;

    NSInteger theDays = interval / daySeconds;

 

    //版本升级之后的处理,全部规则清空,开始弹窗

    if (udAppVersion && appVersion>udAppVersion) {

        [userDefaults removeObjectForKey:@"theDays"];

        [userDefaults removeObjectForKey:@"appVersion"];

        [userDefaults removeObjectForKey:@"userOptChoose"];

        [self alertUserCommentView:VC];

    }

    //1,从来没弹出过的

    //2,用户选择????我要吐槽,7天之后再弹出

    //3,用户选择????残忍拒绝后,7天内,每过1天会弹一次

    //4,用户选择????残忍拒绝的30天后,才会弹出

    else if (!udUserChoose ||

    (udUserChoose==2 && theDays-udtheDays>7) ||

    (udUserChoose>=3 && theDays-udtheDaysudUserChoose-3) ||

    (udUserChoose>=3 && theDays-udtheDays>30))

    {

        [self alertUserCommentView:VC];

 

    }

 

}

 

-(void)alertUserCommentView:(UIViewController *)VC{

 

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {

 

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    //当前时间戳的天数

    NSTimeInterval interval = [[NSDate date] timeIntervalSince1970];

    int daySeconds = 24 * 60 * 60;

    NSInteger theDays = interval / daySeconds;

    //当前版本号

    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];

    float appVersion = [[infoDictionary objectForKey:@"CFBundleShortVersionString"] floatValue];

    //userDefaults里版本号

    float udAppVersion = [[userDefaults objectForKey:@"appVersion"] intValue];

    //userDefaults里用户选择项目

    int udUserChoose = [[userDefaults objectForKey:@"userOptChoose"] intValue];

    //userDefaults里用户天数

    int udtheDays = [[userDefaults objectForKey:@"theDays"] intValue];

 

    //当前版本比userDefaults里版本号高

    if (appVersion>udAppVersion) {

        [userDefaults setObject:[NSString stringWithFormat:@"%f",appVersion] forKey:@"appVersion"];

    }

 

    alertController = [UIAlertController alertControllerWithTitle:@"致开发者的一封信" message:@"有了您的支持才能更好的为您服务,提供更加优质的,更加适合您的App,当然您也可以直接反馈问题给到我们" preferredStyle:(UIAlertControllerStyleAlert)];

 

    UIAlertAction *refuseAction = [UIAlertAction actionWithTitle:@"????残忍拒绝" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {

 

    [userDefaults setObject:@"1" forKey:@"userOptChoose"];

    [userDefaults setObject:[NSString stringWithFormat:@"%d",(int)theDays] forKey:@"theDays"];

    }];

 

    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"????好评赞赏" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {

 

    [userDefaults setObject:@"2" forKey:@"userOptChoose"];

    [userDefaults setObject:[NSString stringWithFormat:@"%d",(int)theDays] forKey:@"theDays"];

 

    NSString *str = [NSString stringWithFormat:

    @"https://itunes.apple.com/cn/app/id%@?mt=8",

    self.myAppID ];

 

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];

 

    }];

 

    UIAlertAction *showAction = [UIAlertAction actionWithTitle:@"????我要吐槽" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {

 

    if (udUserChoose30) {

    [userDefaults setObject:@"3" forKey:@"userOptChoose"];

    [userDefaults setObject:[NSString stringWithFormat:@"%d",(int)theDays] forKey:@"theDays"];

    }else{

    [userDefaults setObject:[NSString stringWithFormat:@"%d",(int)(theDays-udtheDays+3)] forKey:@"userOptChoose"];

    }

    NSString *str = [NSString stringWithFormat:

    @"https://itunes.apple.com/cn/app/id%@?mt=8",

    self.myAppID ];

 

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];

    }];

 

 

    [alertController addAction:refuseAction];

    [alertController addAction:okAction];

    [alertController addAction:showAction];

 

    //        NSLog(@"%@",[userDefaults objectForKey:@"appVersion"]);

    //        NSLog(@"%@",[userDefaults objectForKey:@"userOptChoose"]);

    //        NSLog(@"%@",[userDefaults objectForKey:@"theDays"]);

 

    [VC presentViewController:alertController animated:YES completion:nil];

 

    }else{

        #if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_8_0

        alertViewTest = [[UIAlertView alloc] initWithTitle:@"致开发者的一封信" message:@"有了您的支持才能更好的为您服务,提供更加优质的,更加适合您的App,当然您也可以直接反馈问题给到我们" delegate:self cancelButtonTitle:@"????残忍拒绝" otherButtonTitles:@"????好评赞赏",@"????我要吐槽", nil];

        [alertViewTest show];

        #endif

    }

 

}

 

#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_8_0

 

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

 

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    //当前时间戳的天数

    NSTimeInterval interval = [[NSDate date] timeIntervalSince1970];

    int daySeconds = 24 * 60 * 60;

    NSInteger theDays = interval / daySeconds;

    //当前版本号

    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];

    float appVersion = [[infoDictionary objectForKey:@"CFBundleShortVersionString"] floatValue];

    //userDefaults里版本号

    float udAppVersion = [[userDefaults objectForKey:@"appVersion"] intValue];

    //userDefaults里用户选择项目

    int udUserChoose = [[userDefaults objectForKey:@"userOptChoose"] intValue];

    //userDefaults里用户天数

    int udtheDays = [[userDefaults objectForKey:@"theDays"] intValue];

 

    //当前版本比userDefaults里版本号高

    if (appVersion>udAppVersion) {

        [userDefaults setObject:[NSString stringWithFormat:@"%f",appVersion] forKey:@"appVersion"];

    }

 

    switch (buttonIndex) {

        case 0: //残忍的拒绝

        if (udUserChoose30) {

            [userDefaults setObject:@"3" forKey:@"userOptChoose"];

            [userDefaults setObject:[NSString stringWithFormat:@"%d",(int)theDays] forKey:@"theDays"];

        }else{

            [userDefaults setObject:[NSString stringWithFormat:@"%d",(int)(theDays-udtheDays+3)] forKey:@"userOptChoose"];

        }

        break;

        case 1:{ //好评

            [userDefaults setObject:@"1" forKey:@"userOptChoose"];

            [userDefaults setObject:[NSString stringWithFormat:@"%d",(int)theDays] forKey:@"theDays"];

            NSString *str = [NSString stringWithFormat:

            @"https://itunes.apple.com/cn/app/id%@?mt=8",

            self.myAppID ];

 

            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];

        }

        break;

        case 2:{ //不好用,我要提意见

            [userDefaults setObject:@"2" forKey:@"userOptChoose"];

            [userDefaults setObject:[NSString stringWithFormat:@"%d",(int)theDays] forKey:@"theDays"];

            NSString *str = [NSString stringWithFormat:

            @"https://itunes.apple.com/cn/app/id%@?mt=8",

            self.myAppID ];

 

            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];

        }

        break;

 

        default:

        break;

        }

    //    NSLog(@"%@",[userDefaults objectForKey:@"appVersion"]);

    //    NSLog(@"%@",[userDefaults objectForKey:@"userOptChoose"]);

    //    NSLog(@"%@",[userDefaults objectForKey:@"theDays"]);

 

}

 

#endif

 

 

@end

具体使用方法如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#import "ViewController.h"

#import "LBToAppStore.h"

@interface ViewController ()

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

}

 

-(void)viewDidAppear:(BOOL)animated{

 

    //用户好评系统

    LBToAppStore *toAppStore = [[LBToAppStore alloc]init];

    toAppStore.myAppID = @"1067787090";

    [toAppStore showGotoAppStore:self];

 

}

 

 

@end

© 著作权归作者所有

共有 人打赏支持
粉丝 22
博文 187
码字总数 265578
作品 0
浦东
挖掘安卓宝藏,EMUI会让手机进入“量心定制”时代吗?

如果把移动终端的发展历程看做一部戏剧,那么Android和iOS两种操作系统生态之间的竞争一定是最精彩的一折。 从市场占有率来看,2017年Android手机在全球售出的手机中占据了85.9%份额,其中自...

脑极体 ⋅ 04/17 ⋅ 0

iOS ZipperDown 漏洞来袭,我们该如何应对?

  昨天傍晚盘古实验室负责任的披露了针对 iOS 应用的 ZipperDown 漏洞,并提供了检索、查询受影响应用的平台: zipperdown.com。基于目前公开的信息,该漏洞的影响面比较大,15000 多个应用...

FreeBuf ⋅ 05/16 ⋅ 0

iOS三维菜单、调试工具、封装通讯录、网络框架、多种控件和动画等源码

iOS精选源码 一个调用系统通讯录和获取通讯录所有联系人的封装(http://www.code4app.com/thread-29726-1-1.html) ios scrollview嵌套tableview同向滑动(初级、进阶), 支持OC / Swift(http...

sunnyaigd ⋅ 05/15 ⋅ 0

ZipperDown漏洞来了!微博、陌陌、快手等常用 iOS 应用恐要中招

雷锋网(公众号:雷锋网)消息,5月15日,盘古实验室对外宣布,他们在针对不同客户的 iOS 应用安全审计过程中,发现了一类通用的安全漏洞---ZipperDown漏洞。 10%的iOS应用可能受ZipperDow...

郭佳 ⋅ 05/15 ⋅ 0

一样的iOS开发程序员为什么有人4k有人40k?

前言 移动开发真正火起来其实就是最近这几年,iOS 开发技术因为发展也就才这么几年,所以值得做的事情还有很多,这就造成了每年苹果的 WWDC 都会推出一堆新的特性和 API。整体上来说,这对业...

原来是泽镜啊 ⋅ 05/16 ⋅ 0

转:一套代码iOS、Android两端运行,Google Flutter意味着什么?

原文:https://www.toutiao.com/a6569388465538990600/?ttfrom=weixin&utmcampaign=clientshare×tamp=1529580533&app=newsarticle&utmsource=weixin&iid=35476649324&utmmedium=toutiao......

鸿蒙无上至尊 ⋅ 昨天 ⋅ 0

苹果在研发集AR/VR于一体的头显:8K显示屏无线连接

苹果在研发集AR/VR于一体的头显:8K显示屏无线连接 2018-04-28 10:52编辑: 游星啊分类:业界动态来源:苹果汇 苹果AR头显 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师 京东...

游星啊 ⋅ 04/28 ⋅ 0

iOS逆向工程- 学习整理(工具详解)

前言 一、逆向工程的要求 具备丰富的 iOS 开发经验 最好能非常熟悉 iOS 设备的硬件构成,iOS 系统的运行原理。 拿到任意一个 App 之后能够大致推断出它的项目规模和使用的技术,比如它的MVC模...

_小迷糊 ⋅ 05/11 ⋅ 0

如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

iOS曝ZipperDown漏洞 快手、陌陌等均受影响

  【IT168 评论】智能手机作为大家日常生活中越来越不可分割的一部分,往往储存有用户的大量个人信息,一旦手机出现漏洞被黑客利用,那对于受害用户来讲将造成相当大的影响。   有些用户...

it168网站 ⋅ 05/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 32分钟前 ⋅ 0

vim使用手册--配对括号的查找

1、把光标放在标记有(、[或{处。 2、按%字符 3、此时光标的位置应当在配对的括号处 4、再次按%就可以跳回配对的第一个括号处。

dragon_tech ⋅ 36分钟前 ⋅ 0

c++ 、object-c printf,%02X和%x有什么区别 ?

%x即按十六进制输出,英文字母小写,右对齐。 %02X有以下变化:英文字母变大写,如果输出字符不足两位的,输出两位宽度,右对齐,空的一位补0。超过两位的,全部输出。 如果不用 %02x 会出现...

yizhichao ⋅ 41分钟前 ⋅ 0

Spring源码解析(七)——实例创建(中)

前言 上一节讲到了,Spring 会根据实例的作用域执行不同的创建逻辑,分别是 Singleton、Prototype、其他 Scope,其中 Singleton 会调用 getSingleton 从缓存中获取,缓存中没有才会创建实例;...

MarvelCode ⋅ 41分钟前 ⋅ 0

Thrift RPC实战(六) spring集成thrift

1.服务端设置 对泛型Thrift Service的支持, 通过采用spring配置以及反射的方式来实现.对于一个服务提供者来说,需要提供端口,接口以及接口实现类,因此在接口中spring配置文件中配置如下 <!...

lemonLove ⋅ 43分钟前 ⋅ 0

oracle11g自动分区使用

为什么使用自动分区? 在oracle11g之前,oracle是不支持自动分区功能的,这就可能导致我们系统在运行一段时间之后,就需要看看分区是否创建或者写触发器进行创建分区,否则就会导致数据无法入...

strict_nerd ⋅ 55分钟前 ⋅ 0

Spring mvc ViewResolver视图解析器实现机制

概要 我们在controller里面经常这样return一个ModelAndView。 return new ModelAndView("userList", "users", userList); DispatcherServlet 靠 ViewResolver 把 userList 解析为 /WEB-INF......

轨迹_ ⋅ 今天 ⋅ 0

策略模式

1.策略模式 策略模式是同一个行为的不同处理办法。策略模式和简单工厂模式的区别:1.策略模式主要是方法的执行方式,工厂模式要获取的对象。两者的侧重点不同。 ...

Cobbage ⋅ 今天 ⋅ 0

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 今天 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部