Skip to content

umeng/FeedbackiOSDemo

Repository files navigation

友盟用户反馈演示

友盟用户反馈主页: http://dev.umeng.com/feedback/ios/quick-start

介绍

友盟用户反馈组件让您及时而方便地获取用户的反馈信息。

本SDK版本为2.0,操作系统最低支持版本为iOS 5.0,用户反馈界面如下:

http://dev.umeng.com/files/download/FF12349C253116FA7E3F27C091AEE852.png

<<content-list>>内容清单:

文件(夹)名称介绍
开发指南.html本文档
更新日志.html更新日志
UMengFeedback_SDK_2.0/友盟用户反馈组件
UMengFeedback_Sdk_1.1.0/友盟消息推送组件
FeedbackDemo.xcodeproj演示工程(入口)
FeedbackDemoObjective-C演示工程
SwiftDemoSwift演示工程

基本功能集成指南

安装用户反馈SDK

自动安装

CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具。利用 CocoaPods,可以自动化安装第三方库。

建议使用 CocoaPods 来自动化安装:

在Podfile中增加一行,内容如下:

pod 'UMengFeedback', '~> 2.0'

然后执行安装:

pod install

手动安装

也可以使用传统集成方式:

下载 iOS SDK , 解压缩后得到 内容清单 所述文件,把 UMengFeedback_SDK_2.0 文件夹拖入Xcode项目工程中:

设置App Key相关

AppDelegate.m 文件中,导入SDK头文件

#import "UMFeedback.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中,设置App Key:

[UMFeedback setAppKey:@"5425495dfd98c594860045ed"];

显示反馈界面

在需要进入反馈界面的ViewController中,首先导入SDK头文件:

#import "UMFeedback.h"

在需要显示反馈界面的事件中调用如下代码来呼出反馈界面:

  • 以导航窗口显示(前提是当前ViewController是导航窗口):
[self.navigationController pushViewController:[UMFeedback feedbackViewController]
                                     animated:YES];
  • 以模态窗口显示:
[self presentModalViewController:[UMFeedback feedbackModalViewController]
                        animated:YES];

注意上述两者的区别在于获取用户反馈界面的ViewController的不同: 前者是 [UMFeedback feedbackViewController]

而后者是 [UMFeedback feedbackModalViewController]

开启消息推送功能

开启消息推送需要使用 友盟消息推送 组件,并配置好APNs服务。

集成友盟消息推送组件

使用CocoaPods来集成:

pod 'UMengMessage', '~> 1.1.0.1'

或者使用传统方式来集成:

下载 SDK最新版(含IDFA)SDK最新版(不含IDFA), 解压缩后把形如 UMessage_Sdk_x.x.x 的文件夹加入到工程中。具体参见 iOS 消息推送 (Message) SDK使用指南

添加消息推送代码

方便起见,先定义一些OS版本检测的宏:

#define IOS_7_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
#define IOS_8_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
  1. didFinishLaunchingWithOptions 函数中添加推送设置代码如下:
 if (IOS_8_OR_LATER) {
     //register remoteNotification types
     UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
     action1.identifier = @"action1_identifier";
     action1.title=@"Accept";
     action1.activationMode = UIUserNotificationActivationModeForeground;//当点击的时候启动程序
     
     UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];  //第二按钮
     action2.identifier = @"action2_identifier";
     action2.title=@"Reject";
     action2.activationMode = UIUserNotificationActivationModeBackground;//当点击的时候不启动程序,在后台处理
     action2.authenticationRequired = YES;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
     action2.destructive = YES;
     
     UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];
     categorys.identifier = @"category1";//这组动作的唯一标示
     [categorys setActions:@[action1,action2] forContext:(UIUserNotificationActionContextDefault)];
     
     UIUserNotificationSettings *userSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert
                                                                                  categories:[NSSet setWithObject:categorys]];

     [UMessage registerRemoteNotificationAndUserNotificationSettings:userSettings];
 } else {
     [UMessage registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge |
                                                  UIRemoteNotificationTypeSound |
                                                  UIRemoteNotificationTypeAlert];
 }
  [UMessage setLogEnabled:NO];

//关闭状态时点击反馈消息进入反馈页
 NSDictionary *notificationDict = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
 [UMFeedback didReceiveRemoteNotification:notificationDict];
  1. didRegisterForRemoteNotificationsWithDeviceToken 中设置umeng_feedback alias:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [UMessage registerDeviceToken:deviceToken];
    NSLog(@"umeng message alias is: %@", [UMFeedback uuid]);
    [UMessage addAlias:[UMFeedback uuid] type:@"umeng_feedback" response:^(id responseObject, NSError *error) {
        if (error != nil) {
            NSLog(@"%@", error);
            NSLog(@"%@", responseObject);
        }
    }];
}
  1. didReceiveRemoteNotification 中处理消息(默认动作:点击进入消息详情页)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
//    [UMessage didReceiveRemoteNotification:userInfo];
    [UMFeedback didReceiveRemoteNotification:userInfo];
}

使用自定义反馈界面

@property (strong, nonatomic) UMFeedback *feedback;

self.feedback = [UMFeedback sharedInstance];
self.feedback.delegate = self;
[self.feedback get];

数据接口有2个: get,post: 用于完成收取、发送。

-(void)get

get 方法获取最新的用户反馈数据,异步方法,需要实现 getFinishedWithError: delegate来完成回调。

如果 errornil 表示 get 正确完成,取实例的 topicAndReplies 属性即可获取最新的用户反馈数据。 常见的场景是当error 为nil时刷新UITableView。

topicAndReplies 为NSMutableArray,第一项为 topic,既用户发表的第一条主题,其余项为Replies,包括开发者回复的和用户回复的。两者的区别在type字段。

if ([reply[@"type"] isEqualToString:@"dev_reply"]){
    NSLog(@"开发者回复");
}else{
    NSLog(@"用户回复");
}

-(void)post:

post 方法发布用户反馈,异步方法,需要实现postFinishedWithError: delegate来完成回调。 用户发第一条主题和以后的回复都是使用post方法。

如果error 为nil表示post正确完成。

常见的场景是当error 为nil时告知用户发送成功。

post参数为NSDictionary *类型,其中可以包含的字段和说明见下面描述,其中contact和remark字段为自定义字段,用户可以传递自定义的内容。

feedback_dictionary 包含的有效key、含义、类型、取值如下:

键名含义类型取值说明
gender性别NSString“1”或”male”为男 “0”或”female” 为女
age_group年龄段NSString“1”…”8”,对应表如下
content反馈内容NSString长度不应超过255个字符
remark备注NSDictionary可以存放自定义的内容,比如评分等
contact联系方式NSDictionary可以存放和用户信息相关的内容,比如用户名等

“remark”和”contact”两个字段可供开发者传入自定义内容,这些内容会在网页上展现.

“age_group” 取值和年龄段对照表

“1”小于18岁
“2”18~24岁
“3”25~30岁
“4”31~35岁
“5”36~40岁
“6”41~50岁
“7”51~59岁
“8”大于60岁

相比旧版本的变化

  • 内置反馈界面由HTML变为Native,删除umFeedback.bundle资源文件
  • 老用户仍可继续使用但不建议使用的函数有:
+ (void)showFeedback:(UIViewController *)viewController withAppkey:(NSString *)appKey;
+ (void)showFeedback:(UIViewController *)viewController withAppkey:(NSString *)appKey dictionary:(NSDictionary *)dictionary;
+ (void)checkWithAppkey:(NSString *)appkey;
- (void)setAppkey:(NSString *)appKey delegate:(id<UMFeedbackDataDelegate>)newDelegate;

技术支持

为了能够尽快响应您的反馈,请提供您的appkey及logcat中的详细出错日志,您所提供的内容越详细越有助于我们帮您解决问题。