Przeglądaj źródła

离线消息不处理

Steven 4 lat temu
rodzic
commit
338cc99b92

+ 24 - 18
MusicGradeExam/MusicGradeExam.xcodeproj/project.pbxproj

@@ -41,6 +41,7 @@
 		273EFB6724DD36420069DB4D /* RongCloud.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 273EFB5A24DD36410069DB4D /* RongCloud.bundle */; };
 		273EFB6824DD36420069DB4D /* RongSight.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 273EFB5C24DD36410069DB4D /* RongSight.framework */; };
 		273EFB6924DD36420069DB4D /* RongRTCLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 273EFB5D24DD36420069DB4D /* RongRTCLib.framework */; };
+		273EFB7024E672850069DB4D /* TicketRefreshModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 273EFB6F24E672830069DB4D /* TicketRefreshModel.m */; };
 		27476F4824BBFB5900181362 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 27476F4724BBFB5900181362 /* AppDelegate.m */; };
 		27476F4E24BBFB5900181362 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27476F4D24BBFB5900181362 /* ViewController.m */; };
 		27476F5124BBFB5900181362 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 27476F4F24BBFB5900181362 /* Main.storyboard */; };
@@ -449,6 +450,8 @@
 		273EFB5A24DD36410069DB4D /* RongCloud.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = RongCloud.bundle; sourceTree = "<group>"; };
 		273EFB5C24DD36410069DB4D /* RongSight.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RongSight.framework; sourceTree = "<group>"; };
 		273EFB5D24DD36420069DB4D /* RongRTCLib.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RongRTCLib.framework; sourceTree = "<group>"; };
+		273EFB6E24E672830069DB4D /* TicketRefreshModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TicketRefreshModel.h; sourceTree = "<group>"; };
+		273EFB6F24E672830069DB4D /* TicketRefreshModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TicketRefreshModel.m; sourceTree = "<group>"; };
 		27476F4324BBFB5900181362 /* 酷乐秀.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "酷乐秀.app"; sourceTree = BUILT_PRODUCTS_DIR; };
 		27476F4624BBFB5900181362 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
 		27476F4724BBFB5900181362 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
@@ -1719,32 +1722,32 @@
 		2747702E24BC0C0100181362 /* Message */ = {
 			isa = PBXGroup;
 			children = (
-				2747702F24BC0C0100181362 /* RoleChangedMessage.h */,
-				2747703024BC0C0100181362 /* AssistantTransferMessage.h */,
-				2747703124BC0C0100181362 /* InviteUpgradeMessage.h */,
+				2747704424BC0C0100181362 /* ApplySpeechMessage.h */,
 				2747703224BC0C0100181362 /* ApplySpeechMessage.m */,
 				2747703324BC0C0100181362 /* ApplySpeechResultMessage.h */,
-				2747703424BC0C0100181362 /* DisplayCommandMessage.m */,
-				2747703524BC0C0100181362 /* MemberChangeMessage.h */,
-				2747703624BC0C0100181362 /* DeviceMessage.h */,
-				2747703724BC0C0100181362 /* ControlDeviceNotifyMessage.m */,
-				2747703824BC0C0100181362 /* TicketExpiredMessage.m */,
-				2747703924BC0C0100181362 /* NodePlayMessage.h */,
-				2747703A24BC0C0100181362 /* TurnPageMessage.h */,
-				2747703B24BC0C0100181362 /* WhiteboardMessage.m */,
+				2747704324BC0C0100181362 /* ApplySpeechResultMessage.m */,
+				2747703024BC0C0100181362 /* AssistantTransferMessage.h */,
 				2747703C24BC0C0100181362 /* AssistantTransferMessage.m */,
-				2747703D24BC0C0100181362 /* RoleChangedMessage.m */,
-				2747703E24BC0C0100181362 /* InviteUpgradeMessage.m */,
 				2747703F24BC0C0100181362 /* ControlDeviceNotifyMessage.h */,
+				2747703724BC0C0100181362 /* ControlDeviceNotifyMessage.m */,
+				2747703624BC0C0100181362 /* DeviceMessage.h */,
 				2747704024BC0C0100181362 /* DeviceMessage.m */,
-				2747704124BC0C0100181362 /* MemberChangeMessage.m */,
 				2747704224BC0C0100181362 /* DisplayCommandMessage.h */,
-				2747704324BC0C0100181362 /* ApplySpeechResultMessage.m */,
-				2747704424BC0C0100181362 /* ApplySpeechMessage.h */,
-				2747704524BC0C0100181362 /* WhiteboardMessage.h */,
-				2747704624BC0C0100181362 /* TurnPageMessage.m */,
+				2747703424BC0C0100181362 /* DisplayCommandMessage.m */,
+				2747703124BC0C0100181362 /* InviteUpgradeMessage.h */,
+				2747703E24BC0C0100181362 /* InviteUpgradeMessage.m */,
+				2747703524BC0C0100181362 /* MemberChangeMessage.h */,
+				2747704124BC0C0100181362 /* MemberChangeMessage.m */,
+				2747703924BC0C0100181362 /* NodePlayMessage.h */,
 				2747704724BC0C0100181362 /* NodePlayMessage.m */,
+				2747702F24BC0C0100181362 /* RoleChangedMessage.h */,
+				2747703D24BC0C0100181362 /* RoleChangedMessage.m */,
 				2747704824BC0C0100181362 /* TicketExpiredMessage.h */,
+				2747703824BC0C0100181362 /* TicketExpiredMessage.m */,
+				2747703A24BC0C0100181362 /* TurnPageMessage.h */,
+				2747704624BC0C0100181362 /* TurnPageMessage.m */,
+				2747704524BC0C0100181362 /* WhiteboardMessage.h */,
+				2747703B24BC0C0100181362 /* WhiteboardMessage.m */,
 			);
 			path = Message;
 			sourceTree = "<group>";
@@ -1801,6 +1804,8 @@
 				27EF3F0224BF0F12002068A2 /* TicketListModel.m */,
 				27EF3F0524BFF8A1002068A2 /* TicketDetailModel.h */,
 				27EF3F0424BFF8A0002068A2 /* TicketDetailModel.m */,
+				273EFB6E24E672830069DB4D /* TicketRefreshModel.h */,
+				273EFB6F24E672830069DB4D /* TicketRefreshModel.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -3150,6 +3155,7 @@
 				2747722B24BC0C0500181362 /* KSAudioRecordFileManager.m in Sources */,
 				27A008D424BDA67F0002452B /* ModifyPhoneCheckController.m in Sources */,
 				2747726224BC0C0500181362 /* LLImageCache.m in Sources */,
+				273EFB7024E672850069DB4D /* TicketRefreshModel.m in Sources */,
 				274771E724BC0C0500181362 /* RegisterViewController.m in Sources */,
 				274771F824BC0C0500181362 /* NSDictionary+KSSafe.m in Sources */,
 				274771BD24BC0C0500181362 /* ALCalendarHelper.m in Sources */,

+ 2 - 0
MusicGradeExam/MusicGradeExam/AppDelegate.h

@@ -16,6 +16,8 @@
 
 @property (nonatomic, strong) KSTabBarController *tabBarController;
 
+@property (nonatomic, strong) NSString *examRoomId;
+
 //记录当前界面是否支持横竖屏旋转
 @property (assign, nonatomic)BOOL allowAutoRotate;
 

+ 10 - 1
MusicGradeExam/MusicGradeExam/AppDelegate.m

@@ -482,7 +482,16 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
 
 - (void)onRCIMReceiveMessage:(RCMessage *)message left:(int)left {
     NSLog(@"conversationType----%lu",(unsigned long)message.conversationType);
-    [[KSIMService sharedService] ksOnReceived:message left:left object:@""];
+    // 离线消息不处理
+    if (message.isOffLine == NO) {
+        // 判断是否拦截 不同考场的消息
+        if ([self.examRoomId isEqualToString:message.targetId]) {
+            NSLog(@"conversationType -- reveice Room message %@", message.targetId);
+            [[KSIMService sharedService] ksOnReceived:message left:left object:@""];
+        }
+        
+    }
+    
 }
 
 

+ 10 - 10
MusicGradeExam/MusicGradeExam/Define/PrefixHeader.pch

@@ -85,11 +85,11 @@
 
 //#ifdef DEBUG
 
-#define hostURL (@"https://test.kj.colexiu.com")
-#define SEALCLASSHOST (@"https://test.kj.colexiu.com/api-im")
-#define WEBHOST (@"https://test.m.kj.colexiu.com")
-#define JSPUSH_ENVIRONMENT (NO)
-#define RCIM_KEY (@"8luwapkv84g3l")
+//#define hostURL (@"https://test.kj.colexiu.com")
+//#define SEALCLASSHOST (@"https://test.kj.colexiu.com/api-im")
+//#define WEBHOST (@"https://test.m.kj.colexiu.com")
+//#define JSPUSH_ENVIRONMENT (NO)
+//#define RCIM_KEY (@"8luwapkv84g3l")
 
 //#define hostURL (@"http://192.168.3.28:8000")
 //#define SEALCLASSHOST (@"http://192.168.3.28:8000/api-im")
@@ -98,11 +98,11 @@
 //#define RCIM_KEY (@"8luwapkv84g3l")
 //#else    // 线上
 
-//#define hostURL (@"https://kj.colexiu.com")
-//#define SEALCLASSHOST (@"https://kj.colexiu.com/api-im")
-//#define WEBHOST (@"https://m.kj.colexiu.com.com")
-//#define JSPUSH_ENVIRONMENT (YES)
-//#define RCIM_KEY (@"6tnym1br6pv07")
+#define hostURL (@"https://kj.colexiu.com")
+#define SEALCLASSHOST (@"https://kj.colexiu.com/api-im")
+#define WEBHOST (@"https://m.kj.colexiu.com")
+#define JSPUSH_ENVIRONMENT (YES)
+#define RCIM_KEY (@"8luwapkv84g3l")
 
 //#endif
 

+ 3 - 3
MusicGradeExam/MusicGradeExam/UI/Classroom/Service/Classroom/ClassroomService.m

@@ -719,12 +719,12 @@
                 [self.classroomDelegate memberRecordAction:mem];
             }
             else {
-               [[NSNotificationCenter defaultCenter] postNotificationName:RefreshWaitListNotification object:nil];
+               [[NSNotificationCenter defaultCenter] postNotificationName:RefreshWaitListNotification object:nil userInfo:@{@"refresh":@"refresh"}];
             }
         }
         else if (msg.action == MemberChangeActionRefresh) { // 刷新列表
-            
-            [[NSNotificationCenter defaultCenter] postNotificationName:RefreshWaitListNotification object:nil];
+            NSArray *memberJson = msg.appParamJson;
+            [[NSNotificationCenter defaultCenter] postNotificationName:RefreshWaitListNotification object:nil userInfo:@{@"memberJson":memberJson}];
         }
         else if (msg.action == MemberChangeActionIgnore) { // 屏蔽声音列表
             RoomMember *mem = [self.currentRoom getMember:msg.userId];

+ 2 - 0
MusicGradeExam/MusicGradeExam/UI/Classroom/Service/Classroom/Message/MemberChangeMessage.h

@@ -38,5 +38,7 @@ typedef NS_ENUM(NSUInteger, MemberChangeAction) {
 @property (nonatomic, assign) MemberChangeAction action;
 @property (nonatomic, assign) int role;
 @property (nonatomic, assign) long timestamp;
+
+@property (nonatomic, strong) NSArray *appParamJson;
 @end
 

+ 1 - 0
MusicGradeExam/MusicGradeExam/UI/Classroom/Service/Classroom/Message/MemberChangeMessage.m

@@ -22,6 +22,7 @@
         self.role = [dic[@"role"] intValue];
         self.action = [dic[@"action"] integerValue];
         self.timestamp = [dic[@"timestamp"] longValue];
+        self.appParamJson = [dic arrayValueForKey:@"appParamJson"];
     }
 }
 + (NSString *)getObjectName {

+ 48 - 8
MusicGradeExam/MusicGradeExam/UI/Exam/Controller/WaitExamViewController.m

@@ -15,6 +15,9 @@
 #import "KSGuideMaskView.h"
 #import "UserInfoManager.h"
 #import "WaitExamBottomView.h"
+#import "TicketRefreshModel.h"
+#import "AppDelegate.h"
+
 #define  BOTTOMVIEW_HEIGHT (150)
 
 @interface WaitExamViewController ()<UIScrollViewDelegate>
@@ -40,7 +43,7 @@
     self.view.backgroundColor = HexRGB(0xf3f4f8);
     [self configUI];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backLoginView) name:@"backLoginView" object:nil];
-    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshWaitList) name:RefreshWaitListNotification object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshWaitList:) name:RefreshWaitListNotification object:nil];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toRecordExam) name:RecordExamNotification object:nil];
 }
 
@@ -56,8 +59,37 @@
 }
 
 
-- (void)refreshWaitList {
-    [self requestDataWithHub:NO];
+- (void)refreshWaitList:(NSNotification *)notifer {
+    NSString *refresh = [notifer.userInfo stringValueForKey:@"refresh"];
+    
+    NSArray *memberArray = [notifer.userInfo arrayValueForKey:@"memberJson"];
+    if (![NSString isEmptyString:refresh]) {
+        if (self.sourceModel && self.sourceModel.finishedExam != 3) {
+            [self requestDataWithHub:NO];
+        }
+    }
+    else if (memberArray.count) {
+        NSMutableArray *countArray = [NSMutableArray array];
+        
+        countArray = [TicketRefreshModel mj_objectArrayWithKeyValuesArray:memberArray];
+        for (NSInteger i = 0; i < countArray.count; i++) {
+            TicketRefreshModel *model = countArray[i];
+            NSString *userId = [NSString stringWithFormat:@"%.0f", model.studentId];
+            if ([userId isEqualToString:[NSString stringWithFormat:@"%.0f",USER_MANAGER.userInfo.userId]]) {
+                self.sourceModel.openFlag = model.openFlag;
+                self.sourceModel.classroomSwitch = model.classroomSwitch;
+                self.sourceModel.recordFlag = model.recordFlag;
+                self.sourceModel.finishedExam = model.finishedExam;
+                self.sourceModel.waitNum = i;
+                
+                [self evaluateSource];
+                break;
+            }
+        }
+    }
+    else {
+        [self requestDataWithHub:NO];
+    }
 }
 
 // 试听课被挤掉
@@ -154,9 +186,7 @@
             self.sourceModel = [[TicketDetailModel alloc] initWithDictionary:[dic dictionaryValueForKey:@"data"]];
             
             self.sourceModel.desc = [self.sourceModel.desc replaceAll:@"\\n" WithString:@"\n"];
-            [self.bodyView configMessageSource:self.sourceModel];
-            [self.bottomView configMessageSource:self.sourceModel];
-            [self configViewHeight];
+            [self evaluateSource];
         }
         else {
             [self MBPShow:MESSAGEKEY];
@@ -168,6 +198,18 @@
     }];
 }
 
+- (void)configExamRoomMessage {
+    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
+    appDelegate.examRoomId = [NSString stringWithFormat:@"%.0f", self.sourceModel.examRoomId];
+}
+
+- (void)evaluateSource {
+    [self.bodyView configMessageSource:self.sourceModel];
+    [self.bottomView configMessageSource:self.sourceModel];
+    [self configViewHeight];
+    [self configExamRoomMessage];
+}
+
 - (void)configViewHeight {
     CGFloat tipsHeight = [self.bodyView configTipsHeight:self.sourceModel.desc];
     CGFloat viewHeight = 206 + 200 + 19 + tipsHeight + 15;
@@ -255,8 +297,6 @@
             [self MBPShow:@"签到成功"];
             // 滑动到底部
             [self scrollToBottom];
-            // 判断是否能进入考场
-            [self requestDataWithHub:NO];
         }
         else {
             [self MBPShow:MESSAGEKEY];

+ 23 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/Model/TicketRefreshModel.h

@@ -0,0 +1,23 @@
+//
+//  TicketRefreshModel.h
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/8/14.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TicketRefreshModel : NSObject
+
+@property (nonatomic, assign) double openFlag;
+@property (nonatomic, assign) double recordFlag;
+@property (nonatomic, assign) double classroomSwitch;
+@property (nonatomic, assign) double studentId;
+@property (nonatomic, assign) double finishedExam;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 13 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/Model/TicketRefreshModel.m

@@ -0,0 +1,13 @@
+//
+//  TicketRefreshModel.m
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/8/14.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "TicketRefreshModel.h"
+
+@implementation TicketRefreshModel
+
+@end

+ 1 - 1
MusicGradeExam/MusicGradeExam/UI/Exam/View/WaitExamBodyView.m

@@ -52,7 +52,7 @@ typedef NS_ENUM(NSInteger,EXAMSTATUS) {
 
 - (void)configMessageSource:(TicketDetailModel *)source {
     self.sourceModel = source;
-    if ([NSString isEmptyString:source.signInTime]) {
+    if (source.finishedExam == 3) { // 未签到
         if (source.openFlag == 0) { // 考场未开启
             self.status = EXAMSTATUS_NOSTART;
         }

+ 35 - 5
MusicGradeExam/MusicGradeExam/UI/Exam/View/WaitExamBottomView.m

@@ -45,7 +45,8 @@ typedef NS_ENUM(NSInteger,EXAMSTATUS) {
 
 - (void)configMessageSource:(TicketDetailModel *)source {
     self.sourceModel = source;
-    if ([NSString isEmptyString:source.signInTime]) {
+    
+    if (source.finishedExam == 3) { // 未签到
         if (source.openFlag == 0) { // 考场未开启
             self.status = EXAMSTATUS_NOSTART;
         }
@@ -56,6 +57,7 @@ typedef NS_ENUM(NSInteger,EXAMSTATUS) {
     else {
         self.status = EXAMSTATUS_SINGED;
     }
+    
     if (self.status == EXAMSTATUS_SINGED) { // 已签到显示
         if (self.sourceModel.recordFlag == 1 && self.sourceModel.finishedExam == 4) { // 录播考试开启中
             self.canJoinRoom = YES;
@@ -96,7 +98,7 @@ typedef NS_ENUM(NSInteger,EXAMSTATUS) {
         [self.joinButton setBackgroundImage:[UIImage imageNamed:@"button_nomal"] forState:UIControlStateNormal];
         [self.joinButton setBackgroundImage:[UIImage imageNamed:@"button_highlight"] forState:UIControlStateHighlighted];
         
-        [self.animationView.layer addAnimation:[self alphaLight:1.5f] forKey:@"aAlpha"];
+        [self.joinButton.layer addAnimation:[self alphaChange:2.0f] forKey:@"aAlpha"];
         
         self.hasAnimation = YES;
     }
@@ -105,7 +107,7 @@ typedef NS_ENUM(NSInteger,EXAMSTATUS) {
         [self.joinButton setBackgroundImage:[UIImage imageNamed:@"button_unable"] forState:UIControlStateNormal];
         if (self.hasAnimation) {
             self.hasAnimation = NO;
-            [self.animationView.layer removeAnimationForKey:@"aAlpha"];
+            [self.joinButton.layer removeAnimationForKey:@"aAlpha"];
         }
     }
 }
@@ -128,8 +130,36 @@ typedef NS_ENUM(NSInteger,EXAMSTATUS) {
     }
 }
 
-#pragma mark - 呼吸灯动画
 
+#pragma mark ---- 渐变动画
+- (CAAnimationGroup *)alphaChange:(float)time {
+    CABasicAnimation *opacityAnim =[CABasicAnimation animationWithKeyPath:@"opacity"];
+    opacityAnim.fromValue = [NSNumber numberWithFloat:1.0f];
+    opacityAnim.toValue = [NSNumber numberWithFloat:0.5f];//这是透明度。
+    opacityAnim.autoreverses = NO;
+    opacityAnim.duration = time/2;
+    opacityAnim.beginTime = 0.0f;
+    
+    CABasicAnimation *opacityAnimBack =[CABasicAnimation animationWithKeyPath:@"opacity"];
+    opacityAnimBack.fromValue = [NSNumber numberWithFloat:0.5f];
+    opacityAnimBack.toValue = [NSNumber numberWithFloat:1.0f];
+    opacityAnimBack.autoreverses = NO;
+    opacityAnimBack.duration = time/2;
+    opacityAnimBack.beginTime = time/2;
+    
+    // 创建动画组
+    CAAnimationGroup *groups =[CAAnimationGroup animation];
+    groups.animations = @[opacityAnim,opacityAnimBack];
+    groups.removedOnCompletion = NO;
+    groups.fillMode = kCAFillModeBoth;
+    groups.duration = time;
+    groups.repeatCount = FLT_MAX;
+    groups.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
+    return groups;
+}
+
+
+#pragma mark - 呼吸灯动画
 -(CAAnimationGroup *)alphaLight:(float)time {
     // 缩放动画
     CABasicAnimation * scaleAnim = [CABasicAnimation animation];
@@ -140,7 +170,7 @@ typedef NS_ENUM(NSInteger,EXAMSTATUS) {
     
     CABasicAnimation *opacityAnim =[CABasicAnimation animationWithKeyPath:@"opacity"];
     opacityAnim.fromValue = [NSNumber numberWithFloat:1.0f];
-    opacityAnim.toValue = [NSNumber numberWithFloat:0.01f];//这是透明度。
+    opacityAnim.toValue = [NSNumber numberWithFloat:0.6f];//这是透明度。
     opacityAnim.autoreverses = YES;
     opacityAnim.duration = time;
     

+ 1 - 1
MusicGradeExam/MusicGradeExam/UI/Exam/View/WaitExamBottomView.xib

@@ -13,7 +13,7 @@
             <rect key="frame" x="0.0" y="0.0" width="414" height="130"/>
             <autoresizingMask key="autoresizingMask"/>
             <subviews>
-                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Gh-j0-ioZ">
+                <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Gh-j0-ioZ">
                     <rect key="frame" x="50" y="70" width="314" height="50"/>
                     <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                     <userDefinedRuntimeAttributes>