eBay/NMessenger là dự án mã nguồn mở trên GitHub với 2.4k sao, viết chủ yếu bằng Swift. A fast, lightweight messenger component built on AsyncDisplaykit and written in Swift
Tóm tắt dựng từ metadata GitHub của chính dự án — chưa có bài review TopGit. Trang sẽ tự động cập nhật khi bài review đầy đủ được xuất bản.
VÌ SAO CHƯA CÓ REVIEW
TopGit viết bài đầy đủ cho repo có nhiều sao nhất và được yêu cầu nhiều nhất. Trang này là snapshot trong thời gian chờ — xem README gốc ở tab READ ME.
NMessenger is a fast, lightweight messenger component built on AsyncDisplaykit and written in Swift. Developers can inherently achieve 60FPS scrolling and smooth transitions with rich content components.
Features
Built-in support for:
Text
Images (network and local)
Collection Views
Rich Content
Typing Indicators
Avatars
Custom and Layer Masked Bubbles
Bubble Configurations
Extendable Components
Async Head Prefetching
Message Groups
Adding, Removing, and Updating Messages (with animations)
Version Information
1.0.0
Requirements
iOS 8.2+
Installation for Cocoapods
# For latest release in cocoapods - 1.0.80 (Swift 3, ASDK 2.X)
pod 'NMessenger'
# For ASDK 1.9
pod 'NMessenger', '1.0.79'
# For Swift 2.3 support
pod 'NMessenger', '1.0.76'
Notes
For iOS 10 Support
Add NSPhotoLibraryUsageDescription and NSCameraUsageDescription to your App Info.plist to specify the reason for accessing photo library and camera. See Cocoa Keys for more details.
Landscape Mode
Landscape mode is not currently supported. While it may be supported in a future release, we have disabled device rotation for NMessengerViewController to prevent issues.
Getting Started
NMessengerViewController
NMessenger comes with a prebuilt NMessengerViewController that has a few supported features.
A message with a collection view can be created directly from an array of views or nodes. Note: Nodes take advantage of ASDK's async rendering capabilities and will make this component scroll more smoothly.
Send a message with a custom view or node. Note: Nodes take advantage of ASDK's async rendering capabilities and will make this component scroll more smoothly.
These functions are meant to be overridden for network calls and other controller logic.
Typing Indicators
Typing indicators signify that incoming messages are being typed. This will be the last message in the messenger by default.
/** Adds an incoming typing indicator to the messenger */
func showTypingIndicator(avatar: ASDisplayNode) -> GeneralMessengerCell
/** Removes a typing indicator from the messenger */
func removeTypingIndicator(indicator: GeneralMessengerCell)
Custom InputBar
To use a custom input bar, you must subclass InputBarView. InputBarView conforms to InputBarViewProtocol:
@objc public protocol InputBarViewProtocol
{
/* Superview of textInputView - can hold send button and/or attachment button*/
var textInputAreaView: UIView! {get set}
/* UITextView where the user will input the text*/
var textInputView: UITextView! {get set}
//NMessengerViewController where to input is sent to
var controller:NMessengerViewController! {get set}
}
Both textInputAreaView and textInputView must be created in order for NMessengerViewController to have the correct behavior. controller is set by the initializer in InputBarView base class.
In order to use your custom InputBar, override func getInputBar()->InputBarView in NMessengerViewController.
NMessenger comes with a few prebuilt bubble types. bubble can also easily be subclassed to create a new bubble component.
SimpleBubble
DefaultBubble
StackedBubble
ImageBubble - Can be used with any 9 Patch Image
By setting hasLayerMask = true, bubbles will mask their content. This is relevant for images and other rich content components.
Bubble Configuration
In order to configure custom bubbles for the messenger, you must create a new class that implements BubbleConfigurationProtocol.
/** Configures a bubble for a ContentNode. Implement this to create your own bubble configuration */
protocol BubbleConfigurationProtocol {
var isMasked: Bool {get set}
/** Create and return a UI color representing an incoming message */
func getIncomingColor() -> UIColor
/** Create and return a UI color representing an outgoing message */
func getOutgoingColor() -> UIColor
/** Create and return a bubble for the ContentNode */
func getBubble() -> Bubble
/** Create and return a bubble that is used by the Message group for Message nodes after the first. This is typically used to "stack" messages */
func getSecondaryBubble() -> Bubble
}
This protocol is meant to provide a new instance of the bubble class for primary (messageNode) and secondary (messageGroup) bubble types. By changing var sharedBubbleConfiguration: BubbleConfigurationProtocol in NMessengerViewController, you can set the configuration for all newly added messages.
Content Nodes and Custom Components
Content Nodes
A Content Node holds message content in a MessageNode (everything inside of the bubble).
Subclassing ContentNode gives you the ability to define your own content. This is particularly useful for creating rich content components that are not in our stock message kit. Alternatively, you can initialize a 'CustomContentNode' with your own view or node.
Content Nodes can also be given a BubbleConfigurationProtocol to customize their bubble.
GeneralMessengerCell
GeneralMessengerCell can be subclassed to make any type of component. All messenger cells extend this object.
Timestamps
Timestamps can be easily added with the MessageSentIndicator class.
Many messengers prefetch at the head. This is not trivial with a UITableView or AysncDisplayKit features. NMessenger supports head prefetching out of the box.
To use the head prefetch feature, set var doesBatchFetch: Bool = true on NMessenger. NMessengerDelegate will also need to be implemented and set by your controller.
@objc protocol NMessengerDelegate {
/**
Triggered when a load batch content should be called. This method is called on a background thread.
Make sure to add prefetched content with *endBatchFetchWithMessages(messages: [GeneralMessengerCell])**/
optional func batchFetchContent()
/** Returns a newly created loading Indicator that should be used at the top of the messenger */
optional func batchFetchLoadingIndicator()->GeneralMessengerCell
}
All batch fetch network calls should be done in batchFetchContent. Make sure to add your message cells with endBatchFetchWithMessages(messages: [GeneralMessengerCell]) to end the batch fetch. Calling this function will remove the loading indicator and batch fetch lock.
Message Groups
Message Groups can be used to stack messages and animate avatars. Like MessageNode, MessageGroup extends GeneralMessageCell. The difference, however is that MessageGroup holds a table of MessageNodes rather than a ContentNode.
Additionally, MessageGroup determines the bubble type of the MessageNode's content based on the position in the table. The first message's content will have a primary bubble, the rest will have a secondary bubble. Typically, the avatar will be disabled on any MessagesNode in the group, but kept for the MessageGroup.
Adding, Removing, and Updating
Message Groups include a few slick animations for Adding, Removing, and Updating MessageNodes in the group. These can be called directly from MessageGroup or Added and Removed from NMessenger. Note: These are not surfaced in the NMessengerViewController yet
It is recommended that they are removed from NMessenger because of the possibility that the MessageNode removed was the last message in the group. If this happens, the MessageGroup will remain after the MessageGroup was removed. NMessenger makes sure that in this case the MessageGroup is removed from the messenger.
Trang TopGit này là một snapshot — tab "Readme" hiển thị nguyên văn README của repo (đã bỏ link, giữ ảnh). Repo GitHub ở github.com/eBay/NMessenger là nguồn chính thức.
eBay/NMessenger có bao nhiêu sao?
eBay/NMessenger có 2.4k sao GitHub — tải lại trang để xem số mới nhất, hoặc xem trực tiếp github.com/eBay/NMessenger. TopGit phản chiếu số sao của GitHub nhưng không cam kết đến từng phút.
eBay/NMessenger có tag gì không?
Bản đồng bộ chưa ghi nhận topic GitHub nào cho eBay/NMessenger. GitHub topics hiển thị ở thanh bên phải trang repo — đó là nơi đáng kiểm tra nhất.
eBay/NMessenger còn đang phát triển không?
Commit gần nhất trên eBay/NMessenger là 8.3 năm trước (theo timestamp GitHub). Repo có 265 fork — một chỉ báo về mức độ quan tâm của cộng đồng.
eBay/NMessenger viết bằng ngôn ngữ gì?
eBay/NMessenger chủ yếu viết bằng Swift. Trường "language" của GitHub dựa trên phần lớn byte ở nhánh mặc định.
Đọc đầy đủ README ở tab phía trên.
NMessenger có đáng để bạn bỏ thời gian?
ChatGPT, Claude và Perplexity đều đọc được trang này. Hỏi thử xem họ nghĩ gì về NMessenger.