BMXPushManager Protocol Reference
Conforms to NSObject
Declared in BMXPushManager.h
Overview
推送管理器
Instance Methods
addDelegate:
- (void)addDelegate:(id<BMXPushServiceProtocol>)*aDelegate*
- (void)registerAPNs {
[[[BMXClient sharedClient] pushService] start];
[[[BMXClient sharedClient] pushService] addDelegate:self];
- (void)viewDidLoad {
[super viewDidLoad];
[self configCollectionView];
self.view.clipsToBounds = YES;
[[[BMXClient sharedClient] chatService] addDelegate:self];
- (void)addIMListener {
BMXClient *client = [BMXClient sharedClient];
[[client rosterService] addDelegate:self];
- (void)addIMListener {
BMXClient *client = [BMXClient sharedClient];
[[client rosterService] addDelegate:self];
[[client chatService] addDelegate:self];
- (void)addIMListener {
BMXClient *client = [BMXClient sharedClient];
[[client rosterService] addDelegate:self];
[[client chatService] addDelegate:self];
[[client userService] addDelegate:self];
- (void)addIMListener {
BMXClient *client = [BMXClient sharedClient];
[[client rosterService] addDelegate:self];
[[client chatService] addDelegate:self];
[[client userService] addDelegate:self];
[[client groupService] addDelegate:self];
addDelegate:delegateQueue:
- (void)addDelegate:(id<BMXPushServiceProtocol>)*aDelegate* delegateQueue:(dispatch_queue_t)*aQueue*
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.automaticallyAdjustsScrollViewInsets = NO;
self.account = [IMAcountInfoStorage loadObject];
[self getMyProfile];
[self setUpNavItem];
[self setupSubview];
[self loadMessages];
[self scrollToBottomAnimated:NO refresh:NO];
[[[BMXClient sharedClient] chatService] addDelegate:self delegateQueue:dispatch_get_main_queue()];
addPushListener:
添加聊天监听者
- (void)addPushListener:(id<BMXPushServiceProtocol>)*listener*
Parameters
listener
监听者
Discussion
添加聊天监听者
Declared In
BMXPushManager.h
bindDeviceToken:completion:
推送绑定设备token。
- (void)bindDeviceToken:(NSString *)*deviceToken* completion:(void ( ^ ) ( BMXError *error ))*aCompletionBlock*
Parameters
deviceToken
token 设备的推送token
aCompletionBlock
绑定回调
Discussion
推送绑定设备token。
Declared In
BMXPushManager.h
clearAllNotifications
用于移除在通知中心显示的所有推送
- (void)clearAllNotifications
Discussion
用于移除在通知中心显示的所有推送
Declared In
BMXPushManager.h
clearNotification:
用于移除在通知中心显示的指定推送 iOS 10 以上 支持通过identifier 移除指定推送 iOS 10 以下 identifier 设置为 0 ,则移除所有推送
- (void)clearNotification:(NSInteger)*notificationId*
Parameters
notificationId
如果notificationId 置 0 ,则移除所有推送
Discussion
用于移除在通知中心显示的指定推送 iOS 10 以上 支持通过identifier 移除指定推送 iOS 10 以下 identifier 设置为 0 ,则移除所有推送
Declared In
BMXPushManager.h
clearTagsByOperationId:
清空推送用户的标签。
- (void)clearTagsByOperationId:(NSString *)*operationId*
Parameters
operationId
操作id。在回调通知中对应通知提醒。
Discussion
清空推送用户的标签。
Declared In
BMXPushManager.h
deleteTags:operationId:
删除推送用户的标签。
- (void)deleteTags:(NSArray<NSString*> *)*tags* operationId:(NSString *)*operationId*
Parameters
tags
要删除用户标签
operationId
操作id。在回调通知中对应通知提醒。
Discussion
删除推送用户的标签。
Declared In
BMXPushManager.h
getCertification
获取登陆后服务器返回的推送证书。
- (void)getCertification
Discussion
获取登陆后服务器返回的推送证书。
Declared In
BMXPushManager.h
getPushProfileForceRefresh:completion:
获取推送用户详情,如果forceRefresh == true,则强制从服务端拉取
- (void)getPushProfileForceRefresh:(BOOL)*forceRefresh* completion:(void ( ^ ) ( BMXPushUserProfile *profile , BMXError *aError ))*aCompletionBlock*
Parameters
forceRefresh
是否强制从服务器拉取,本地获取失败的情况下会自动从服务器拉取
profile
推送用户profile信息,初始传入指向为空的shared_ptr对象,函数返回后从此处获取用户profile信息。
Discussion
获取推送用户详情,如果forceRefresh == true,则强制从服务端拉取
Declared In
BMXPushManager.h
getTagsByOperationId:withCompletion:
获取推送用户的标签。
- (void)getTagsByOperationId:(NSString *)*operationId* withCompletion:(void ( ^ ) ( NSArray *tags , BMXError *error ))*aCompletionBlock*
Parameters
operationId
操作id。在回调通知中对应通知提醒。
aCompletionBlock
获取回调
Discussion
获取推送用户的标签。
Declared In
BMXPushManager.h
getToken
获取登陆后使用的用户token。
- (void)getToken
Discussion
获取登陆后使用的用户token。
Declared In
BMXPushManager.h
loadLocalPushMessagesFromMessageId:size:directionType:completion:
加载数据库本地存储的推送消息。如果不指定则从最新消息开始
- (void)loadLocalPushMessagesFromMessageId:(long long)*reMsgId* size:(NSUInteger)*size* directionType:(BMXPushMessageDirection)*directionType* completion:(void ( ^ ) ( NSArray *messageList , BMXError *error ))*aCompletionBlock*
Parameters
reMsgId
加载推送消息的起始id
size
最大加载消息条数
directionType
数据库返回的加载本地推送消息列表
aCompletionBlock
加载推送消息的方向,默认是加载更早的消息
Discussion
加载数据库本地存储的推送消息。如果不指定则从最新消息开始
Declared In
BMXPushManager.h
removeDelegate:
- (void)removeDelegate:(id<BMXPushServiceProtocol>)*aDelegate*
removePushListener:
移除聊天监听者
- (void)removePushListener:(id<BMXPushServiceProtocol>)*listener*
Parameters
listener
监听者
Discussion
移除聊天监听者
Declared In
BMXPushManager.h
resume
恢复推送功能接口。
- (void)resume
Discussion
恢复推送功能接口。
Declared In
BMXPushManager.h
- (BOOL)canRecord
{
__block BOOL bCanRecord = YES;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {
[audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
bCanRecord = granted;
}];
}
return bCanRecord;
- (void)addContentView {
[self.view addSubview:self.contentView];
__weak ChangePasswordViewController *weakSelf = self;
self.contentView.changeBlock = ^(NSString * _Nonnull newPassword) {
[weakSelf changePasswordApi:newPassword];
};
messageModel.nickName = [roster.nickName length] ? roster.nickName : roster.userName;
[weakCell setMessageName:messageModel.nickName];
}
}];
} else {
messageModel.isChatGroup = NO;
}
messageCell.messageModel = messageModel;
MAXLog(@"%@", messageCell.messageModel.content);
return messageCell;
[[[BMXClient sharedClient] rosterService] searchByRosterId:messageModel.messageObjc.fromId forceRefresh:NO completion:^(BMXRoster *roster, BMXError *error) {
if (!error) {
if ([[NSFileManager defaultManager] fileExistsAtPath:roster.avatarThumbnailPath]) {
UIImage *avarat = [UIImage imageWithContentsOfFile:roster.avatarThumbnailPath];
[weakCell setAvaratImage:avarat];
}else {
[[[BMXClient sharedClient] rosterService] downloadAvatarWithRoster:roster isThumbnail:YES progress:^(int progress, BMXError *error) {
} completion:^(BMXRoster *roster, BMXError *error) {
if (!error) {
UIImage *avarat = [UIImage imageWithContentsOfFile:roster.avatarThumbnailPath];
[weakCell setAvaratImage:avarat];
}else {
[weakCell setAvaratImage:nil];
}
}];
-(void) setMainText:(NSString*) mainText detailText:(NSString*) detailText switcherFlag:(BOOL) switcherFlag switcherTarget:(__weak id) target switcherSelector:(nullable SEL) selector
{
[_line setHidden:NO];
_mainText.text = mainText;
if(detailText == nil) {
[_settingSwitch setHidden:NO];
[_detailText setHidden:YES];
_settingSwitch.on = switcherFlag;
if(selector != nil) {
[_settingSwitch addTarget:target action:selector forControlEvents:UIControlEventValueChanged];
}
}else {
_detailText.text = detailText;
[_settingSwitch setHidden:YES];
[_detailText setHidden:NO];
}
- (KeyboardEmojiModel *)findEmoji:(NSString *)string {
__block KeyboardEmojiModel *emotion;
for (KeyboardEmojiPackage *package in [KeyboardEmojiPackage loadPackages]) {
[package.emojis enumerateObjectsUsingBlock:^(KeyboardEmojiModel *item, NSUInteger idx, BOOL * _Nonnull stop) {
if ([item.name isEqualToString:string]) {
emotion = item;
}
}];
if (emotion) {
break;
}
}
return emotion;
- (KeyboardToolBar *)toolBarView {
if (!_toolBarView) {
_toolBarView = [KeyboardToolBar new];
__weak KeyboardVC *weakKeyBoard = self;
_toolBarView.emojiSend = ^() {
!weakKeyBoard.emojiSend ? : weakKeyBoard.emojiSend();
};
_toolBarView.backgroundColor = [UIColor lh_colorWithHex:0xffffff];
- (KeyboardEmojiTextView *)textView {
if (!_textView) {
LHWeakSelf
_textView = [KeyboardEmojiTextView new];
_textView.delegate = self;
_textView.backgroundColor = [UIColor whiteColor];
_textView.font = [UIFont systemFontOfSize:kChatInputTextViewFont];
_textView.returnKeyType = UIReturnKeySend;
_textView.enablesReturnKeyAutomatically = YES;
_textView.layer.borderColor = [UIColor lh_colorWithHex:0xe1e1e5].CGColor;
_textView.layer.borderWidth = 0.5;
_textView.showsVerticalScrollIndicator = YES;
_textView.showsHorizontalScrollIndicator = NO;
_textView.layer.cornerRadius = 5;
_textView.insertEmojiTextBlock = ^(UITextView *textView) {
[weakSelf textViewDidChange:textView];
};
_textView.layoutManager.allowsNonContiguousLayout = NO;
sendMessage:
发送推送上行消息,消息状态变化会通过listener通知
- (void)sendMessage:(NSString *)*message*
Parameters
message
发送的上行推送消息内容
Discussion
发送推送上行消息,消息状态变化会通过listener通知
Declared In
BMXPushManager.h
alertView.btnClickBlock = ^{
UIImage *image = contentImg;
NSData *imageData = UIImageJPEGRepresentation(image,1.0f);
NSData *thumImageData = UIImageJPEGRepresentation(image,1.0f);
BMXImageAttachment *imageAttachment = [[BMXImageAttachment alloc] initWithData:imageData thumbnailData:thumImageData imageSize:image.size conversationId:[NSString stringWithFormat:@"%lld",group.groupId]];
imageAttachment.pictureSize = CGSizeMake(image.size.width, image.size.height);
IMAcount *account = [IMAcountInfoStorage loadObject];
BMXMessageObject *messageObject = [[BMXMessageObject alloc] initWithBMXMessageAttachment:imageAttachment fromId:[account.usedId longLongValue] toId:group.groupId type:BMXMessageTypeGroup conversationId:group.groupId];
messageObject.contentType = BMXContentTypeImage;
if (messageObject) {
[[[BMXClient sharedClient] chatService] sendMessage:messageObject];
- (void)sendTypingMessage:(NSDictionary *)configdic {
BMXMessageObject *messageObject = [[BMXMessageObject alloc] initWithBMXMessageText:@""
fromId:[self.account.usedId longLongValue]
toId:self.currentRoster.rosterId
type:BMXMessageTypeSingle
conversationId:self.currentRoster.rosterId];
messageObject.extensionJson = [NSString jsonStringWithDictionary:configdic];
messageObject.qos = DeliveryQosModeAtMostOnce;
[[[BMXClient sharedClient] chatService] sendMessage:messageObject];
self.lastTime = [NSString stringWithFormat:@"%f",messageModel.messageObjc.serverTimestamp * 0.001];
[self insertNewMessageOrTime:time];
// self.lastTime = time;
}
NSIndexPath *index = [self insertNewMessageOrTime:messageModel];
[self.messages addObject:messageModel];
[self.tableView scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionBottom animated:YES];
if (messageObject) {
messageObject.clientTimestamp = [messageModel.date longLongValue];
[[[BMXClient sharedClient] chatService] sendMessage:messageObject];
_chatBarView.sendContent = ^(LHContentModel *content) {
[weakSelf sendMessage:content];
alertView.btnClickBlock = ^{
UIImage *image = contentImg;
NSData *imageData = UIImageJPEGRepresentation(image,1.0f);
NSData *thumImageData = UIImageJPEGRepresentation(image,1.0f);
BMXImageAttachment *imageAttachment = [[BMXImageAttachment alloc] initWithData:imageData thumbnailData:thumImageData imageSize:image.size conversationId:[NSString stringWithFormat:@"%lld",roster.rosterId]];
imageAttachment.pictureSize = CGSizeMake(image.size.width, image.size.height);
IMAcount *account = [IMAcountInfoStorage loadObject];
BMXMessageObject *messageObject = [[BMXMessageObject alloc] initWithBMXMessageAttachment:imageAttachment fromId:[account.usedId longLongValue] toId:roster.rosterId type:BMXMessageTypeSingle conversationId:roster.rosterId];
messageObject.contentType = BMXContentTypeImage;
if (messageObject) {
[[[BMXClient sharedClient] chatService] sendMessage:messageObject];
- (void)sendMessage:(LHContentModel *)content {
if (content.words && content.words.length) {
// 文字类型
[self p_configsendMessage:content.words type:MessageBodyType_Text duartion:0];
}
if (!content.photos && !content.photos.photos.count) return;
// 图片类型
[content.photos.photos enumerateObjectsUsingBlock:^(UIImage *image, NSUInteger idx, BOOL * stop) {
[self p_configsendMessage:image type:MessageBodyType_Image duartion:0];
}];
}
setBadge:
设置推送用户的未读角标。
- (void)setBadge:(int)*count*
Parameters
count
用户未读角标数
Discussion
设置推送用户的未读角标。
Declared In
BMXPushManager.h
setPushMode:
设置推送启用状态。默认为使用推送。
- (void)setPushMode:(BOOL)*enable*
Parameters
enable
推送的启用状态
Discussion
设置推送启用状态。默认为使用推送。
Declared In
BMXPushManager.h
setPushTimeStartHour:endHour:
设置允许推送时间。
- (void)setPushTimeStartHour:(int)*startHour* endHour:(int)*endHour*
Parameters
startHour
静默允许推送的起始时间小时
endHour
静默允许推送的结束时间小时
Discussion
设置允许推送时间。
Declared In
BMXPushManager.h
setSlienceTimeStartHour:endHour:
设置推送静默的起始结束时间。
- (void)setSlienceTimeStartHour:(int)*startHour* endHour:(int)*endHour*
Parameters
startHour
静默推送的起始时间小时
endHour
静默推送的结束时间小时
Discussion
设置推送静默的起始结束时间。
Declared In
BMXPushManager.h
setTags:operationId:
设置推送用户的标签。
- (void)setTags:(NSArray<NSString*> *)*tags* operationId:(NSString *)*operationId*
Parameters
tags
用户标签
operationId
操作id。在回调通知中对应通知提醒。
Discussion
设置推送用户的标签。
Declared In
BMXPushManager.h
start
初始化推送sdk。在仅使用推送的情况下使用该接口初始化推送sdk。在同时使用IM功能的时候直接在BMXClient调用登陆功能即可。config对象初始化的时候需要传入平台类型和设备id。
- (void)start
Discussion
初始化推送sdk。在仅使用推送的情况下使用该接口初始化推送sdk。在同时使用IM功能的时候直接在BMXClient调用登陆功能即可。config对象初始化的时候需要传入平台类型和设备id。
Declared In
BMXPushManager.h
- (void)registerAPNs {
[[[BMXClient sharedClient] pushService] start];
- (YYTextHighlight *)_getHighlightAtPoint:(CGPoint)point range:(NSRangePointer)range {
if (!self._innerLayout.containsHighlight) return nil;
point = [self _convertPointToLayout:point];
YYTextRange *textRange = [self._innerLayout textRangeAtPoint:point];
if (!textRange) return nil;
NSUInteger startIndex = textRange.start.offset;
- (BOOL)isEqual:(YYTextRange *)object {
if (!object) return NO;
return [_start isEqual:object.start] && [_end isEqual:object.end];
- (YYTextRange *)_correctedRangeWithEdge:(YYTextRange *)range {
NSRange visibleRange = self.visibleRange;
YYTextPosition *start = range.start;
- (YYTextRange *)_correctedRangeWithEdge:(YYTextRange *)range {
NSRange visibleRange = self.visibleRange;
YYTextPosition *start = range.start;
YYTextPosition *end = range.end;
if (start.offset == visibleRange.location && start.affinity == YYTextAffinityBackward) {
start = [YYTextPosition positionWithOffset:start.offset affinity:YYTextAffinityForward];
}
if (end.offset == visibleRange.location + visibleRange.length && start.affinity == YYTextAffinityForward) {
end = [YYTextPosition positionWithOffset:end.offset affinity:YYTextAffinityBackward];
}
if (start != range.start || end != range.end) {
}
newPos = [self closestPositionToPoint:point];
if ([newPos compare:otherPosition] == [oldPosition compare:otherPosition] &&
newPos.offset != otherPosition.offset) {
return newPos;
}
if (_container.isVerticalForm) {
if ([oldPosition compare:otherPosition] == NSOrderedAscending) { // search backward
YYTextRange *range = [self textRangeByExtendingPosition:otherPosition inDirection:UITextLayoutDirectionUp offset:1];
if (range) return range.start;
if ([oldPosition compare:otherPosition] == NSOrderedAscending) { // search backward
YYTextRange *range = [self textRangeByExtendingPosition:otherPosition inDirection:UITextLayoutDirectionUp offset:1];
if (range) return range.start;
} else { // search forward
YYTextRange *range = [self textRangeByExtendingPosition:otherPosition inDirection:UITextLayoutDirectionDown offset:1];
if (range) return range.end;
}
} else {
if ([oldPosition compare:otherPosition] == NSOrderedAscending) { // search backward
YYTextRange *range = [self textRangeByExtendingPosition:otherPosition inDirection:UITextLayoutDirectionLeft offset:1];
if (range) return range.start;
// head or tail, returns immediately
if (!forwardMove && position.offset == visibleStart) {
return [YYTextRange rangeWithRange:NSMakeRange(_visibleRange.location, 0)];
} else if (forwardMove && position.offset == visibleEnd) {
return [YYTextRange rangeWithRange:NSMakeRange(position.offset, 0) affinity:YYTextAffinityBackward];
}
// extend from position
YYTextRange *fromRange = [self textRangeByExtendingPosition:position];
if (!fromRange) return nil;
YYTextRange *allForward = [YYTextRange rangeWithStart:fromRange.start end:[YYTextPosition positionWithOffset:visibleEnd]];
startWithAlias:
初始化推送sdk。在仅使用推送的情况下使用该接口初始化推送sdk。在同时使用IM功能的时候直接在BMXClient调用登陆功能即可。config对象初始化的时候需要传入平台类型和设备id。
- (void)startWithAlias:(NSString *)*alias*
Parameters
alias
推送初始化使用的当前用户别名
Discussion
初始化推送sdk。在仅使用推送的情况下使用该接口初始化推送sdk。在同时使用IM功能的时候直接在BMXClient调用登陆功能即可。config对象初始化的时候需要传入平台类型和设备id。
Declared In
BMXPushManager.h
startWithAlias:bmxToken:
初始化推送sdk。在仅使用推送的情况下使用该接口初始化推送sdk。在同时使用IM功能的时候直接在BMXClient调用登陆功能即可。config对象初始化的时候需要传入平台类型和设备id。
- (void)startWithAlias:(NSString *)*alias* bmxToken:(NSString *)*bmxToken*
Parameters
alias
推送初始化使用的当前用户别名
bmxToken
推送初始化的时候App传入的使用的用户的token。
Discussion
初始化推送sdk。在仅使用推送的情况下使用该接口初始化推送sdk。在同时使用IM功能的时候直接在BMXClient调用登陆功能即可。config对象初始化的时候需要传入平台类型和设备id。
Declared In
BMXPushManager.h
status
推送sdk当前的状态。
- (BMXPushSdkStatus)status
Discussion
推送sdk当前的状态。
Declared In
BMXPushManager.h
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"status"]) {
AVPlayerItem * item = (AVPlayerItem *)object;
if (item.status == AVPlayerItemStatusReadyToPlay) {
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"status"]) {
AVPlayerItem * item = (AVPlayerItem *)object;
if (item.status == AVPlayerItemStatusReadyToPlay) {
[self.player play];
}else if (item.status == AVPlayerItemStatusFailed){
- (void)layoutSubviews {
[super layoutSubviews];
CGRect bubbleFrame = _bubbleView.frame;
bubbleFrame.origin.y = self.headImageView.frame.origin.y ;
if (self.messageModel.isChatGroup) {
bubbleFrame.origin.y = self.headImageView.frame.origin.y + 10;
}
if (self.messageModel.isSender) {
bubbleFrame.origin.y = self.headImageView.frame.origin.y;
// 菊花状态 (因不确定菊花具体位置,要在子类中实现位置的修改)
switch (self.messageModel.status) {
[exportSession exportAsynchronouslyWithCompletionHandler:^{
if ([exportSession status] == AVAssetExportSessionStatusCompleted) {
[exportSession exportAsynchronouslyWithCompletionHandler:^{
switch ([exportSession status]) {
AVAssetTrack* videoTrack = [videoTracks objectAtIndex:0];
UIImageOrientation orientation = [self orientationFromAVAssetTrack:videoTrack];
int m_pixelFormatType = kCVPixelFormatType_32BGRA;
NSDictionary* options = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt: (int)m_pixelFormatType] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
AVAssetReaderTrackOutput* videoReaderOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack outputSettings:options];
[reader addOutput:videoReaderOutput];
[reader startReading];
while ([reader status] == AVAssetReaderStatusReading && videoTrack.nominalFrameRate > 0&&(!self.isCancelled)&&self.videoBlock) {
stop
停止推送功能接口
- (void)stop
Discussion
停止推送功能接口
Declared In
BMXPushManager.h
- (void)startRecordingWithFileName:(NSString *)fileName completion:(void(^)(NSError *error))completion {
NSError *error = nil;
if (![[BMXRecoderTools shareManager] canRecord]) {
if (completion) {
error = [NSError errorWithDomain:NSLocalizedString(@"error", NSLocalizedString(@"No_permission", @"没权限")) code:201 userInfo:nil];
completion(error);
}
return;
}
if ([self.recorder isRecording]) {
[_recorder stop];
- (void)stopRecordingWithCompletion:(void(^)(NSString *recordPath, int duration))completion
{
_endDate = [NSDate date];
if ([_recorder isRecording]) {
if ([_endDate timeIntervalSinceDate:_startDate] < [self recordMinDuration]) {
if (completion) {
completion(shortRecord, [self.endDate timeIntervalSinceDate:self.startDate]);
}
[self.recorder stop];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self.recorder stop];
- (void)cancelCurrentRecording
{
_recorder.delegate = nil;
if (_recorder.recording) {
[_recorder stop];
- (void)startPlayRecorder:(NSString *)recorderPath
{
[self.player stop];
- (void)stopPlayRecorder:(NSString *)recorderPath
{
[self.player stop];
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player
successfully:(BOOL)flag
{
[self.player stop];
- (void)enterMainAction:(UIButton *)btn {
[self stop];
unbindAlias:
解除用户别名绑定。
- (void)unbindAlias:(NSString *)*alias*
Parameters
alias
需要解除绑定的用户别名。
Discussion
解除用户别名绑定。
Declared In
BMXPushManager.h
Example: