?iOS IM SDK客戶端開發(fā)文檔

消息

消息:IM 交互實體断盛,在 SDK 中對應的類型是 TDMessage。TDMessage 由 TDMessageBody 組成。

// 消息構建部分
#param mark - 消息基類
TDMessage.h
TDMessageBody.h

#param mark - 1V1消息類
TDTextMessageBody.h
TDImageMessageBody.h
TDVoiceMessageBody.h
TDVideoMessageBody.h
TDFileMessageBody.h
TDLocationMessageBody.h

#param mark - 群消息類
TDCreateGroupMessageBody.h
TDGroupAddMessageBody.h
TDGroupRemoveUidsMessageBody.h
TDDeleteGroupMessageBody.h
TDQuitGroupMessageBody.h
TDReplaceOwnerIdMessageBody.h
TDGroupSucessMessageBody.h

#param mark - 特殊消息類
TDCmdMessageBody.h
TDKeyBoardSoundMessageBody.h
TDConferenceMessageBody.h

/** 消息方法調用部分,比如添加代理育勺,移除代理,發(fā)送消息等,
同時也包含會話相關的操作罗岖,比如創(chuàng)建或獲取會話涧至,獲取會話列表等*/
TDChatManager.h
// 消息的協(xié)議部分,比如監(jiān)聽接收消息的回調方法等
ChatManagerDelegate

構造消息

以下構造消息的示例中呀闻,使用到的“初始化消息實例”方法的說明:

/// 初始化消息實例
/// @param body 消息體實例
/// @param fromUid 發(fā)送方Uid
/// @param toUid 接收方Uid
/// @param chatType 聊天類型 單聊/群聊
- (id) initMessageWithBody:(TDMessageBody *)body 
                           fromUid:(NSString *)fromUid 
                           toUid:(NSString *)toUid 
                           ChatType:(TDChatType)chatType; 

注意: 如果是給群組發(fā)消息化借,那么toUid為群組id

構造文字消息

/// 初始化文本消息體
/// @param aText 文本內容
- (instancetype)initWithText:(NSString *)aText;

// 調用:
TDTextMessageBody *body = [[TDTextMessageBody alloc] initWithText:@"要發(fā)送的消息"];
// 獲取當前登錄的環(huán)信id
NSString *from = [[TDWLClient sharedClient] currentUserId];

//生成Message
TDMessage *message = [[TDMessage alloc] initMessageWithBody:body fromUid:from toUid:@"接收者Uid" ChatType:chatType];
// chatType = SingleChat; // 單聊消息
// chatType = GroupChat;// 群聊消息

構造圖片消息

/// 初始化文件消息體
/// @param aData 文件data數據
/// @param aDisplayName 文件名
- (instancetype)initWithData:(NSData *)aData
                  displayName:(NSString *)aDisplayName;
                 
// 調用:               
TDImageMessageBody *body = [[TDImageMessageBody alloc] initWithData:aImageData displayName:@"image"];

NSString *from = [[EMClient sharedClient] currentUsername];

//生成Message
TDMessage *message = [[TDMessage alloc] initMessageWithBody:body fromUid:from toUid:@"接收者Uid" ChatType:chatType];
// chatType = SingleChat; // 單聊消息
// chatType = GroupChat;// 群聊消息

構造位置消息

/// 實例化位置消息體
/// @param aLatitude 緯度
/// @param aLongitude 經度
/// @param aAddress 地理位置信息
- (instancetype)initWithLatitude:(double)aLatitude longitude:(double)aLongitude address:(NSString *)aAddress;

//調用:
TDLocationMessageBody *body = [[TDLocationMessageBody alloc] initWithLatitude:39 longitude:116 address:@"地址"]; 

NSString *from = [[EMClient sharedClient] currentUsername];

//生成Message
TDMessage *message = [[TDMessage alloc] initMessageWithBody:body fromUid:from toUid:@"接收者Uid" ChatType:chatType];
// chatType = SingleChat; // 單聊消息
// chatType = GroupChat;// 群聊消息

構造語音消息

/// 初始化文件消息體
/// @param aLocalPath 本地文件路徑
/// @param aDisplayName 文件名
- (instancetype)initWithLocalPath:(NSString *)aLocalPath
                       displayName:(NSString *)aDisplayName;

// 調用:
TDVoiceMessageBody *body = [[TDVoiceMessageBody alloc] initWithLocalPath:aPath displayName:@"audio"];
body.duration = duration;

NSString *from = [[EMClient sharedClient] currentUsername];

//生成Message
TDMessage *message = [[TDMessage alloc] initMessageWithBody:body fromUid:from toUid:@"接收者Uid" ChatType:chatType];
// chatType = SingleChat; // 單聊消息
// chatType = GroupChat;// 群聊消息

構造視頻消息

/// 初始化文件消息體
/// @param aLocalPath 本地文件路徑
/// @param aDisplayName 文件名
- (instancetype)initWithLocalPath:(NSString *)aLocalPath
                       displayName:(NSString *)aDisplayName;

// 調用:
TDVideoMessageBody *body = [[TDVideoMessageBody alloc] initWithLocalPath:[aUrl path] displayName:@"video.mp4"];

NSString *from = [[EMClient sharedClient] currentUsername];

//生成Message
TDMessage *message = [[TDMessage alloc] initMessageWithBody:body fromUid:from toUid:@"接收者Uid" ChatType:chatType];
// chatType = SingleChat; // 單聊消息
// chatType = GroupChat;// 群聊消息

構造文件消息

/// 初始化文件消息體
/// @param aLocalPath 本地文件路徑
/// @param aDisplayName 文件名
- (instancetype)initWithLocalPath:(NSString *)aLocalPath
                       displayName:(NSString *)aDisplayName;

// 調用:       
TDFileMessageBody *body = [[TDFileMessageBody alloc] initWithLocalPath:[aUrl path] displayName:@"file"];

NSString *from = [[EMClient sharedClient] currentUsername];

//生成Message
TDMessage *message = [[TDMessage alloc] initMessageWithBody:body fromUid:from toUid:@"接收者Uid" ChatType:chatType];
// chatType = SingleChat; // 單聊消息
// chatType = GroupChat;// 群聊消息

構造透傳消息

SDK 提供的一種特殊類型的消息潜慎,即 CMD捡多,不會存 db,也不會走 APNS 推送铐炫,類似一種指令型的消息垒手。比如您的服務器要通知客戶端做某些操作,您可以服務器和客戶端提前約定好某個字段倒信,當客戶端收到約定好的字段時科贬,執(zhí)行某種特殊操作。

/// 初始化透傳消息
/// @param aText 透傳消息text 用戶自定義
- (instancetype)initWithCmdText:(NSString *)aText;

// 調用:
TDCmdMessageBody *body = [[TDCmdMessageBody alloc] initWithCmdText:aCMDText];

NSString *from = [[EMClient sharedClient] currentUsername];

//生成Message
TDMessage *message = [[TDMessage alloc] initMessageWithBody:body fromUid:from toUid:@"接收者Uid" ChatType:chatType];
// chatType = SingleChat; // 單聊消息
// chatType = GroupChat;// 群聊消息

會話

// 主要用到的類
// 會話方法調用部分鳖悠,包含創(chuàng)建或獲取會話榜掌,獲取會話列表等
TDChatManager.h

/**
獲取所有會話
@param completion 完成的回調 返回會話數組
 數組中存的為TDSessionModel *類型
*/
- (void) getAllConversations:(LoadAllConversationComplection)completion;

// 調用:
[[TDWLClient sharedClient].chatManager getAllConversations:^(NSArray * _Nonnull contacts, NSError * _Nullable error) {
    if (error) {
        NSLog(@"get AllConversations error = %@",error);
        return;
    }

    // 這里根據你的需要去拿到contacts,進行業(yè)務操作
    .......
}];
/**
 刪除一個會話
 @param sessionId  會話id  是NSString類型
 */
- (BOOL) deleteConversationWithSessionId:(NSString *)sessionId;

// 調用:
BOOL deleteResult = [[TDWLClient sharedClient].chatManager deleteConversationWithSessionId:@"要刪除的會話id"];

if (deleteResult) {
        // 這里已經刪除成功乘综,根據開發(fā)業(yè)務需求去刷新列表或者做其他操作
}
/**
 更新會話內部消息全部已讀
 @param sessionId 會話id  NSString類型
 */
- (BOOL) updateRecentSessionReadAllWithSessionId:(NSString *)sessionId;

// 調用:
[[TDWLClient sharedClient].chatManager updateRecentSessionReadAllWithSessionId:@"會話的id"];

聊天

登錄成功之后才能進行聊天操作憎账。發(fā)消息時,單聊和群聊調用的是統(tǒng)一接口卡辰,區(qū)別是 chatType不同胞皱。

發(fā)送消息

/**
 發(fā)送消息
 @param message  TDMessage類型
 */
- (void) sendMessage:(TDMessage *)message Completion:(void(^)(BOOL sendSuccess, NSError * _Nullable error))completion;

// 調用:
[[TDWLClient sharedClient].chatManager sendMessage:message Completion:^(BOOL sendSuccess, NSError * _Nullable error) {
        if (error) {
            // 失敗
        }else {
            // 成功
        }
}];

接收消息

建議在自己工程的根控制器中注冊消息代理邪意,監(jiān)聽接收普通消息的回調方法,用于不在聊天頁面時接收消息反砌。

協(xié)議 ChatManagerDelegate

代理:
// 設置代理
[TDWLClient sharedClient].chatManager.chatDelegate = self;

// 移除代理
[TDWLClient sharedClient].chatManager.chatDelegate = nil;

接收普通消息會走以下回調:

/// 用于接收消息 傳出delegate數據 傳出數據為NSArray*類型 數據為TDMessage*類型
- (void) messagesDidReceive:(NSArray *)aMessageArray;

接收透傳(cmd)消息會走以下回調:

/// 用于接收CMD消息 傳出delegate數據 傳出數據為NSArray *類型
- (void) CMDMessageDidReceive:(NSArray *)cmdArray;

接收按鍵音(KeyBorad)消息會走以下回調:

/// 用于接收按鍵音消息 傳出delegate數據  傳出數據為NSArray *類型
- (void) KeyBoradMessageDidReceive:(NSArray *)KeyBoradArray;

接收創(chuàng)建群(CreateGroup)的通知會走以下回調:
ps:此時為收到建群通知雾鬼,還沒加入群聊

/// 用于接收創(chuàng)建群的通知 傳出delegate數據 傳出數據為NSArray *類型
- (void) CreateGroupMessageDidReceive:(NSArray *)CreateGroupArray;

接收解散群的通知 會走以下回調:

/// 用于接收解散群的通知  傳出delegate數據 傳出數據為NSArray *類型
- (void) DeleteGroupMessageDidReceive:(NSArray *)DeleteGroupArray;

收到消息解析示例:

#pragma mark -----ChatManagerDelegate,CMDMessageDelegate,KeyBoradMessageDelegate,GroupNoticeDelegate-----
// 收到普通消息 看情況做處理
- (void) messagesDidReceive:(NSArray *)aMessageArray {

    NSLog(@"收到普通消息");

    __weak typeof(self) weakself = self;
    dispatch_async(self.msgQueue, ^{
          
        NSMutableArray *receveArray = [[NSMutableArray alloc] init];
        for (int i = 0; i < aMessageArray.count; i++) {
            TDMessage *message = aMessageArray[i];
            if (message.chatType == GroupChat) {
                if ([message.to_uid isEqualToString:self.aSessionModel.sessionId]) {
                    [receveArray addObject:message];
                }
            }else {
                if ([message.from_uid isEqualToString:self.aSessionModel.sessionId]) {
                    [receveArray addObject:message];
                }
            }
        }
        
        NSArray *formated = [weakself _formatMessages:receveArray];
        [weakself.dataArray addObjectsFromArray:formated];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakself.tableView reloadData];
            [weakself _scrollToBottomRow];
        });
    });
}
- (void) CMDMessageDidReceive:(NSArray *)cmdArray {
    NSLog(@"收到了CMD消息:%@",cmdArray);
    //根據業(yè)務需求進行解析,做后續(xù)操作
    ......
}
- (void) KeyBoradMessageDidReceive:(NSArray *)KeyBoradArray {
    NSLog(@"收到了按鍵音消息:%@",KeyBoradArray);
    //根據業(yè)務需求進行解析,做后續(xù)操作
    ......
}
- (void) CreateGroupMessageDidReceive:(NSArray *)CreateGroupArray {
    NSLog(@"收到了建群通知:%@",CreateGroupArray);
    //根據業(yè)務需求進行解析,做后續(xù)操作
    ......
}
- (void) DeleteGroupMessageDidReceive:(NSArray *)DeleteGroupArray {
    NSLog(@"收到了刪除群的通知");
    //根據業(yè)務需求進行解析,做后續(xù)操作
    ......
}

下載消息中的附件

/**
 * 文件下載方法
 * @param downloadURL 文件鏈接
 * @param progress 進度
 * @param completion 完成的回調
 */
- (void)downloadFileWithURL:(NSString *) downloadURL progress:(void (^)(NSProgress *downloadProgress))progress Completion:(void(^)(NSString *_Nullable filePath, NSError * _Nullable error))completion;

/// 判斷文件是否已經在沙盒中存在
/// @param fileName 文件名
-(BOOL) isFileExist:(NSString *)fileName;

/// 獲取文件沙盒路徑
/// @param fileName 文件名
- (NSString *) getFileCachesPathWith:(NSString *)fileName;

示例:下載圖片消息中的原圖:

// 點擊圖片下載原圖
- (void) _imageMessageCellDidSelected:(TDMessageCell *)aCell {
    
    __weak typeof(self) weakself = self;
    
    TDImageMessageBody *body = (TDImageMessageBody*)aCell.model.emModel.body;
    
    // 判斷原圖是否存在
    BOOL isFileExist = [[TDWLClient sharedClient].chatManager isFileExist:body.imgUrl];
    if (isFileExist) {
        // 獲取原圖路徑
        NSString *imgPath = [[TDWLClient sharedClient].chatManager getFileCachesPathWith:body.imgUrl];
        NSLog(@"imgUrl:%@",body.imgUrl);
        NSLog(@"imgPath:%@",imgPath);
        UIImage *image = [UIImage imageWithContentsOfFile:imgPath];
        if (image) {
            [[TDImageBrowser sharedBrowser] showImages:@[image] fromController:self];
        } else {
            [TDAlertController showErrorAlert:@"獲取原圖失敗T_T"];
        }
    }else {
        // 下載原圖
        [self showHudInView:self.view hint:@"下載原圖..."];
        [[TDWLClient sharedClient].chatManager downloadFileWithURL:body.imgUrl progress:^(NSProgress * _Nonnull downloadProgress) {
            NSLog(@"進度:%@",downloadProgress);
        } Completion:^(NSString * _Nullable filePath, NSError * _Nullable error) {
            [weakself hideHud];
            if (error) {
                [TDAlertController showErrorAlert:@"下載原圖失敗T_T"];
            } else {
                NSString *localPath = [[[NSString stringWithFormat:@"%@",filePath] componentsSeparatedByString:@"://"] lastObject];
                UIImage *image = [UIImage imageWithContentsOfFile:localPath];
                if (image) {
                    [[TDImageBrowser sharedBrowser] showImages:@[image] fromController:self];
                } else {
                    [TDAlertController showErrorAlert:@"下載原圖失敗T_T"];
                }
            }
        }];
    }
}

好友管理

注:通達IM不是好友也可以聊天,不推薦使用通達IM的好友機制宴树。如果你有自己的服務器或好友關系策菜,請自己維護好友關系。

好友管理涉及到的SDK頭文件如下:

TDWLUserManager.h

好友管理提供的方法如下:

/**
 添加一個好友
 @param uid 用戶uid  NSSting *類型
 */
- (BOOL) addFriendWithUid:(NSString *)uid;

/**
 刪除一個好友
 @param uid 用戶uid  NSSting *類型
 */
- (BOOL) deleteFriendWithUid:(NSString *)uid;

/**
 獲取所有好友列表
 @param completion 完成后的回調
 */
- (void) getAllFriend:(LoadAllFriendCompletion)completion;

/**
 獲取所有在黑名單里面的好友
 @param completion 完成后的回調
 */
- (void)getAllBlackListUser:(LoadAllFriendCompletion)completion;

/**
 拉黑某個用戶
 @param uid 用戶uid
 */
- (BOOL)blackUserWithUid:(NSString *)uid;

/**
 將某個用戶從黑名單釋放
 @param uid 用戶uid
 */
- (BOOL)unBlackUserWithUid:(NSString *)uid;

/**
 判斷某個用戶是否在黑名單
 @param uid uid 用戶uid
 */
- (BOOL)isUserInBlackListWithUid:(NSString *)uid;

注:以上方法調用全部用[TDWLClient sharedClient].contactManager調用
添加好友調用示例:

BOOL addFriendSuccess = [[TDWLClient sharedClient].contactManager addFriendWithUid:@"對方Uid"];

if (addFriendSuccess) {
    // 添加好友成功
}else {
    // 添加好友失敗
}

群組管理

群涉及的方法如下:

/**
 建群
 @param uidsArr  uidsArr中為想要添加的群成員uid  注: uidsArr.count >= 2  否則建群失敗;
 @param name 群名 NSString *類型
 @param completion 完成的回調
 */
- (void) createGroup:(NSArray *)uidsArr andGroupName:(NSString *)name complet:(void(^)(BOOL isSuccess,NSError *_Nullable error))completion;


/**
 添加群成員
 @param gid 被添加用戶的群id;
 @param uids NSArray類型  添加的用戶列表
 @param completion 完成的回調
 */
- (void) addGroupMembersWithGId:(NSString *)gid andUidsArray:(NSArray *)uids complet:(void(^)(BOOL isSuccess,NSError *_Nullable error))completion;


/**
 刪除群成員
 @param gid 被刪除用戶的群id;
 @param uids NSArray類型 刪除的用戶列表酒贬。
 返回類型  BOOL
 */
- (void) removeGroupMembersWithGid:(NSString *)gid andUidsArray:(NSArray *)uids complet:(void(^)(BOOL isSuccess,NSError *_Nullable error))completion;


/**
 銷毀群
 @param gid 被銷毀的群id做入。
 返回類型  BOOL
 */
- (void) destoryGroup:(NSString *)gid complet:(void(^)(BOOL isSuccess,NSError *_Nullable error))completion;

/**
 退群
 @param gid 群id  NSString類型
 */
- (void) quitGroup:(NSString *)gid complet:(void(^)(BOOL isSuccess,NSError *_Nullable error))completion;

/**
 更換群主
 @param gid 群id NSString類型
 */
- (void) changeGroupOwnerWithGroup:(NSString *)gid targetOwnerId:(NSString *)targetOwnerId complet:(void(^)(BOOL isSuccess,NSError *_Nullable error))completion;


/**
 修改群昵稱(本地數據庫修改,服務器暫無此功能)
 @param gid 群id NSString類型
 @param newName 新群名 NSString類型
 */
- (BOOL) changeGroupNameWithGroupId:(NSString *)gid newName:(NSString *)newName;


/// 根據群ID查詢某條群組的信息
/// @param groupId 群Id NSString類型
- (NSDictionary * _Nullable) getGroupInfoWithGroupId:(NSString *)groupId;

注: 群操作中、建群/添加群成員/刪除群成員/解散群/退群/更換群主 這幾種功能同衣,將會以普通消息的形式插入在聊天消息中竟块。可根據需求選擇是否顯示此類消息耐齐。

音視頻通話

適用場景

1對1通話API用于實現1對1語音通話和1對1視頻通話浪秘,典型場景包括社交交友,遠程心理咨詢埠况、遠程醫(yī)療耸携、一對一在線教育、遠程視頻輔助等辕翰。
其API設計思想類似于傳統(tǒng)的電話通話夺衍,呼叫過程使用了即時通訊的消息機制,所以和即時通訊功能是緊耦合的喜命。

發(fā)起實時通話

用戶可以調用發(fā)起語音或者視頻API向在線用戶發(fā)起實時通話沟沙。

主要用到的類:

ITDWLCallManager.h

需要用到的代理方法,建議在開啟SDK時壁榕,同時添加回調代理

/*!
 *  \~chinese
 *  添加回調代理
 *
 *  @param aDelegate  要添加的代理
 */
- (void)addDelegate:(id<TDWLCallManagerDelegate>)aDelegate;

/*!
 *  \~chinese
 *  移除回調代理
 *
 *  @param aDelegate  要移除的代理
 */
- (void)removeDelegate:(id<TDWLCallManagerDelegate>)aDelegate;

主要方法

/*!
 *  \~chinese
 *  發(fā)起實時會話
 *
 *  @param aType                     通話類型
 *  @param aRemoteName      被呼叫用戶的IM賬號(不能與自己通話)
 *  @param aCompletionBlock 完成的回調
 *
 */
- (void)startCall:(TDWLCallType)aType
       remoteName:(NSString *)aRemoteName
       completion:(void (^)(TDWLCallSession * _Nullable aCallSession,TDWLError * _Nullable error))aCompletionBlock;

注意: TDWLCallType 為枚舉類型
TDWLCallTypeAudio = 0,    /*! \~chinese 實時語音 \~english Voice call */
TDWLCallTypeVideo,        /*! \~chinese 實時視頻 \~english Video call */

/*!
 *  \~chinese
 *  接收方同意通話請求
 *
 *  @param  aCallId     通話ID
 *
 *  @result 錯誤信息
 */
- (TDWLError *)answerIncomingCall:(NSString *)aCallId;

/*!
 *  \~chinese
 *  結束通話
 *
 *  @param aCallSession  aCallSession   通話對象
 *  @param aReason       結束原因
 *
 *  @result 錯誤
 */
- (TDWLError *)endCall:(TDWLCallSession *)aCallSession
                reason:(TDWLCallEndReason)aReason;

擴展

/*!
 *  \~chinese
 *  切換前后攝像頭
 *
 */
- (void)updateSipCallWithSwitchCamera;

/*!
 *  \~chinese
 *  設置是否靜音
 *
 */
- (void)updateSipCallIsMute:(BOOL)aIsMute;

/*!
 *  \~chinese
 *  設置視頻是否可用
 *
 */
- (void)updateSipCallIsEnableVideo:(BOOL)aEnableVideo;

示例:

[[TDWLClient sharedClient].callManager startCall:aType
                                          remoteName:aUsername
                                          completion:^(TDWLCallSession * _Nullable aCallSession, TDWLError * _Nullable error) {
        if (error == nil) {
            // 成功矛紫,根據業(yè)務需求進行后續(xù)處理
        } else {
            // 失敗,根據業(yè)務需求進行后續(xù)處理
        }
}];

外網呼叫

外網呼叫API用于打外網電話使用牌里,場景包括客服颊咬、銷售等
其API設計思想類似于傳統(tǒng)的電話通話。

主要用到的類:

ITDWLSipCallManager.h

需要用到的代理方法牡辽,建議在開啟SDK時喳篇,同時添加回調代理

/*!
 *  \~chinese
 *  添加回調代理
 *
 *  @param aDelegate  要添加的代理
 */
- (void)addDelegate:(id<TDWLSipChannelDelegate>)aDelegate;

/*!
 *  \~chinese
 *  移除回調代理
 *
 *  @param aDelegate  要移除的代理
 */
- (void)removeDelegate:(id<TDWLSipChannelDelegate>)aDelegate;

主要方法:

/*!
 *  \~chinese
 *  發(fā)起SIP實時音頻會話
 *
 *  @param sipNumber        被呼叫用戶的Sip賬號 可以是手機號
 *  @param remoteName       被呼叫用戶的昵稱
 *  @param aCompletionBlock  完成的回調
 *
 */
- (void)startAudioCallWithSipNumber:(NSString *)sipNumber
                          remoteName:(NSString * _Nullable)remoteName
                          completion:(void (^_Nonnull)(TDWLError * _Nullable error))aCompletionBlock;


/*!
 *  \~chinese
 *  設置是否靜音
 *
 */
- (void)updateSipCallIsMute:(BOOL)aIsMute;

示例:

[[TDWLClient sharedClient].sipManager startAudioCallWithSipNumber:@"手機號或者對方sip號" remoteName:aUsername
                                                               completion:^(TDWLError * _Nullable error) {
        if (error == nil) {
            // 成功
        } else {
            // 失敗
        }
}];

更新于:2020.07.11
by 張宗琦

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市态辛,隨后出現的幾起案子麸澜,更是在濱河造成了極大的恐慌,老刑警劉巖因妙,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痰憎,死亡現場離奇詭異票髓,居然都是意外死亡,警方通過查閱死者的電腦和手機铣耘,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門洽沟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜗细,你說我怎么就攤上這事裆操。” “怎么了炉媒?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵踪区,是天一觀的道長。 經常有香客問我吊骤,道長缎岗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任白粉,我火速辦了婚禮传泊,結果婚禮上,老公的妹妹穿的比我還像新娘鸭巴。我一直安慰自己眷细,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布鹃祖。 她就那樣靜靜地躺著溪椎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恬口。 梳的紋絲不亂的頭發(fā)上校读,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音楷兽,去河邊找鬼地熄。 笑死,一個胖子當著我的面吹牛芯杀,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼障陶!你這毒婦竟也來了准潭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤决摧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體太援,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡闽晦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了提岔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仙蛉。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碱蒙,靈堂內的尸體忽然破棺而出荠瘪,到底是詐尸還是另有隱情,我是刑警寧澤赛惩,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布哀墓,位于F島的核電站,受9級特大地震影響喷兼,放射性物質發(fā)生泄漏篮绰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一季惯、第九天 我趴在偏房一處隱蔽的房頂上張望阶牍。 院中可真熱鬧,春花似錦星瘾、人聲如沸走孽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磕瓷。三九已至,卻和暖如春念逞,著一層夾襖步出監(jiān)牢的瞬間困食,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工翎承, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硕盹,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓叨咖,卻偏偏與公主長得像瘩例,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甸各,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容