测试测试过了 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布最近发布 | 2017年2月 |
由 Michael Knecht 维护。
依赖 | |
SBJson | ~> 4.0 |
AWSCore | ~> 2.3.5 |
AWSS3 | ~> 2.3.5 |
Flurry-iOS-SDK/FlurrySDK | ~> 7.3 |
Flurry-iOS-SDK/FlurryAds | ~> 7.3 |
要运行示例项目,请克隆仓库,首先从 Example 目录运行 pod install
。示例代码包含 SDK 视频聊天示例,它实现了一个简单的视频聊天/多媒体聊天应用程序。为了基于 C2Call SDK 构建自己的应用程序,需要在以下网址注册(免费):
https://www.c2call.com/en/developer-area.html
有3种类型的账户可供选择。
Free - 1 application, 10000 monthly active users, limited API access
Professional - 99 EUR/month, 5 applications, 50000 monthly active users, extended API access
Enterprise - starting at 499 EUR/month, unlimited applications, enterprise API access, enterprise support plan, dedicated server option
请参阅:https://www.c2call.com/en/prices.html
为了基于 C2Call-SDK 构建自己的应用程序,在 C2Call DevArea 中创建一个新应用程序,并遵循以下网址下的教程:
https://www.c2call.com/en/how-it-works/ios-sdk.html
使用 CocoaPods SDK,不需要额外的步骤来集成 SDK。只需将 C2Call-SDK 添加到 Podfile,运行 pod install 并开始实现。
C2Call-SDK 参考文档可以在以下位置找到:
用于自动初始化 C2Call 服务的应用程序代理基类。作为 VoIP 和消息服务,C2Call 框架需要复杂的初始化过程,并且还需要详细监视所有应用程序状态,如激活(应用程序在前台)、非活动(屏幕保护程序处于活动状态)、后台(应用程序处于后台)或已终止。在不同的状态下,C2Call 框架需要维护与 C2Call 后端系统的连接、监视网络变化、自动检索未读消息或呼叫记录,并且尽可能节省电量。为了使开发者更容易使用,所有这些复杂的应用程序管理都已封装到 C2CallAppDelegate 基类中。现在,这个基类应该是使用 C2Call 框架的应用程序的 UIApplicationDelegate 基类。
C2CallAppDelegate 类实现了以下来自 UIApplicationDelegate 的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- (void)applicationDidBecomeActive:(UIApplication *)application;
- (void)applicationWillResignActive:(UIApplication *)application;
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
- (void)applicationWillTerminate:(UIApplication *)application;
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification
- (void)applicationDidEnterBackground:(UIApplication *)application
- (void)applicationWillEnterForeground:(UIApplication *)application
在覆盖自己的 C2CallAppDelegate 子类中的上述所有方法时,都必须调用相应的 super 方法。
示例
// MyAppDelegate.h
#import <SocialCommunication/SocialCommunication.h>
@interface MyAppDelegate : C2CallAppDelegate
// MyAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.affiliateid = @"<My AffiliateId>";
self.secret = @"<MyApplication Secret>";
#ifdef __DEBUG
self.useSandboxMode = YES;
#endif
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
- (void)applicationWillResignActive:(UIApplication *)application {
[super applicationWillResignActive:application];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[super applicationDidEnterBackground:application];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
[super applicationWillEnterForeground:application];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[super applicationDidBecomeActive:application];
}
- (void)applicationWillTerminate:(UIApplication *)application {
[super applicationWillTerminate:application];
}
此类提供低级 API 方法来访问主要的 C2Call 通信功能
- Phone calls to PSTN and mobile phone networks, - VoIP and video calls,
- Group calls (VoIP and Video)
- Instant Messaging,
- SMS / Text Messages
- Rich Media Messages like photo, video, voicemail, location, etc.
此类还提供了启动和停止C2CallPhone和处理后台行为的核心功能。C2CallAppDelegate使用此类来初始化对C2Call服务的连接和处理应用的后台状态。
调用功能示例
// Call the C2Call TestCall
[[C2CallPhone currentPhone] callVoIP:@"9bc2858f1194dc1c107"];
消息功能示例
// Send an SMS / Text message
[[C2CallPhone currentPhone] submitMessage:@"Hi, this is an SMS" toNumber:@"+1408234123456"];
丰富消息功能示例
#import <SocialCommunication/UIViewController+SCCustomViewController.h>
...skip...
[self captureImageFromCameraWithQuality:UIImagePickerControllerQualityTypeMedium andCompleteAction:^(NSString *key) {
[[C2CallPhone currentPhone] submitRichMessage:key message:@"Hi, see my photo..." toTarget:@"[email protected]"];
}];
C2Call SDK包含一个UIViewController类别,只需一行代码即可访问C2Call SDK功能。
此UIViewController类别提供了实例化和启动C2Call SDK GUI组件的便利方法。
C2Call SDK提供了丰富的组件,用于处理丰富媒体内容和社交媒体通信功能。此SDK的基本概念是将便利性和易用性与所有提供的组件的极大灵活性相结合。UIViewController+SCCustomViewController类别为访问这些组件提供便利,无论它们是作为SCStoryboard中的标准组件,还是作为从应用程序的MainStoryboard中的自定义组件。
在iOS Storyboard中,UIViewController代表一个屏幕内容,两个UIViewControllers之间的转换将由 UIStoryboardSegue定义。在C2Call SDK中,基于UIViewController的GUI组件也通过StoryboardSegue进行展示,以便开发者在MainStoryboard中定义转换。一些组件需要一组或多个参数,通常需要在prepareForSegue:sender方法中设置。UIViewController+SCCustomViewController提供便利方法,以一行或多行代码展示C2Call SDK GUI组件,并确保在展示的ViewController中正确地设置了所需参数。
以下GUI组件支持:
Presenting Rich Media Content
- SCComposeMessageController (Composes and submit a new Instant Message,
Rich Media Message or SMS/Text Message to a user or phone number)
- SCPhotoViewerController (Presents photos)
- SCVideoPlayerController (Presents a Video Player)
- SCLocationViewerController (Presents a location in a map view)
- SCAudioPlayerController (Presents an Audio Player for VoiceMails)
Capture Rich Media Content:
- UIImagePickerController (Captures an Image or Video from Camera or Photo Album with Quality)
- SCAudioRecorderController (Records and submits a VoiceMail)
- SCLocationSubmitController (Picks and submits the current location or nearby Google places)
Show Friends, Groups and Chat History:
- SCChatController (Presents a Chat History with a specific contact)
- SCFriendDetailController (Presents the details of a connected friend) - SCGroupDetailController (Presents the details of a connected group)
Others:
- SCBrowserViewController (Opens an URL in a Browser View)
如果开发者在MainStoryboard中使用StoryboardSegue连接上述组件,则连接的StoryboardSegue必须遵循特定的命名约定,以便正确设置prepareForSegue:sender方法中的参数。每个连接的StoryboardSegue都必须以目标ViewController的原始类名命名,例如
Target UIViewController Class Segue Name
SCComposeMessageController -> SCComposeMessageControllerSegue
SCPhotoViewerController -> SCPhotoViewerControllerSegue
SCVideoPlayerController -> SCVideoPlayerControllerSegue
SCLocationViewerController -> SCLocationViewerControllerSegue
除了这个命名约定之外,开发者还需要在他的prepareForSegue:sender方法中调用customPrepareForSegue:sender。
-(void) prepareForSegue:(UIStoryboardSegue*) segue sender:(id) sender {
[self customPrepareForSegue:segue sender:sender];
// Do your own setup
}
覆盖此UIViewController类别的所有 ViewController也可以不通过StoryboardSegue进行展示。在这种情况下,组件将从MainStoryboard实例化,如果在那里找不到,则从SCStoryboard中实例化。如果当前ViewController嵌套在UINavigationController中,则将推送组件,如果不嵌套则模态展示。我们建议使用ForSegue来对这种行为拥有完全控制。
SCDataManager提供了对C2Call SDK处理的CoreData数据库的低级别API访问。数据库模式可在以下位置获得:SocialCommunication.ressources/C2CallDataModel.xcdatamodeld
在此数据模型中,所有相关实体都是NSManagedObject的子类,便于访问实体属性。以下是由C2Call SDK定义的NSManagedObject子类:
- MOChatHistory
- MOC2CallUser
- MOCallHistory
- MOC2CallEvent
- MOOpenId
- MOAddress
- MOPhoneNumber
- MOGroupMember
- MOC2CallGroup
C2Call SDK GUI组件基于CoreData。对所有CoreData对象的访问和对数据库的所有查询都必须在主线程中进行。SCDataManager封装了对CoreData数据库层的访问,并确保所有请求都在主线程中执行。
SCUserProfile类提供了以下属性来访问当前用户的配置文件:
displayname *property*
userid *property*
email *property*
didnumber *property*
callerid *property*
isCalleridVerified *property*
credit *property*
firstname *property*
lastname *property*
country *property*
phoneWork *property*
phoneHome *property*
phoneMobile *property*
phoneOther *property*
– saveUserProfile
+ currentUser
所有C2Call SDK组件作为SocialCommunication资源的一部分提供在SCStoryboard.storyboard文件中。
C2Call SDK旨在提供易于使用、功能齐全且可高度自定义的组件,以便于开发者使用。可以通过以下步骤自定义GUI组件:
由于这些组件是通过名称找到的,因此即使组件将会进行子类化,也重要的是保持Storyboard名称。一个典型的事件触发组件示例是SCCallStatusController和SCInboundCallController。
在iOS Storyboard中从一个ViewController到另一个ViewController的过渡通常通过StoryboardSegue来完成。在SCStoryboard中,所有提供到其他ViewController的过渡的ViewController都通过StoryboardSegues相连。因此,当从SCStoryboard复制组件到主Storyboard时,所有连接的组件也应该被复制。
一些连接的组件接收参数,这些参数通过prepareForSegue:sender:方法自动传输。正确的StoryboardSegue也会通过其名称来识别。为了方便正确命名StoryboardSegue,我们为在C2Call SDK中使用的所有StoryboardSegue创建了一个命名约定。简单的规则是,StoryboardSegue的名称必须是目标ViewController类名(始终是原始C2Call SDK ViewController类名)加上后缀"Segue"。
例如,当在好友项上点击时,SCFriendListController将过渡到SCFriendDetailController。因此,SCFriendListController将performSegueWithIdentifier:@"SCFriendDetailControllerSegue"
。
在方法[self prepareForSegue:(StoryboardSegue*) segue sender:(id) sender]
中,将在呈现SCFriendDetailController之前将该好友的userid设置为SCFriendDetailController。如果自定义后某个方面未按预期工作,请仔细检查Segue名称、子类化ViewController的类名和组件的Storyboard ID。
以下是一些用于C2Call SDK中典型功能的实用代码片段:
[[C2CallPhone currentPhone] callNumber:@"+1408234123456"];
[[C2CallPhone currentPhone] callVoIP:@"9bc2858f1194dc1c107"];
[[C2CallPhone currentPhone] callVideo:@"[email protected]"];
[[C2CallPhone currentPhone] submitMessage:@"Hi, this is an SMS" toNumber:@"+1408234123456"];
#import <SocialCommunication/UIViewController+SCCustomViewController.h>
...skip...
[self captureImageFromCameraWithQuality:UIImagePickerControllerQualityTypeMedium andCompleteAction:^(NSString *key) {
[[C2CallPhone currentPhone] submitRichMessage:key message:@"Hi, see my photo..." toTarget:@"[email protected]"];
}];
// Overwrite your AppDelegate Method
-(void) message:(DDXMLElement *)msg {
NSString *text = [[msg elementForName:@"Description"] stringValue];
NSString *userid = [[msg elementForName:@"Contact"] stringValue];
NSString *remoteParty = [[C2CallPhone currentPhone] nameForUserid:userid];
// Handle the message here
}
// Identify the message type (text, video, photo, etc
SCRichMediaType mt = [[C2CallPhone currentPhone] mediaTypeForKey:message];
if (mt == SCMEDIATYPE_TEXT) {
// Handle the text message here
}
if (mt == SCMEDIATYPE_IMAGE) {
// Handle the photo here
// --> See Download an attachment
}
// Download an attachment
// Check if attachment is already downloaded
if (![[C2CallPhone currentPhone] hasObjectForKey:message]) {
// Start download
[[C2CallPhone currentPhone] retrieveObjectForKey:message completion:^(BOOL finished) {
// Do this on Main-Thread
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *thumb = [[C2CallPhone currentPhone] thumbnailForKey:message];
if (thumb) {
// Present the thumbnail
}
UIImage *photo = [[C2CallPhone currentPhone] imageForKey:message];
if (photo) {
// Present the photo here
}
});
}];
}
[[SCBubbleViewOut appearance] setBaseColor:[UIColor colorWithRed:70./255. green:188./255. blue:255./255. alpha:0.69]];
[[SCBubbleViewIn appearance] setBaseColor:[UIColor colorWithRed:115./255. green:223./255. blue:81./255. alpha:0.69]];
[[SCBubbleViewIn appearance] setBubbleTypeIn:SC_BUBBLE_IN_WHAZZUPP];
[[SCBubbleViewOut appearance] setBubbleTypeOut:SC_BUBBLE_OUT_WHAZZUPP];
C2Call-SDK 内置了对其他框架的支持,例如 Facebook SDK 和 GPUImage,以使用视频通话中的特定功能(如 Facebook 登录或 GPUImage 过滤器)。然而,这些框架与 C2Call-SDK 弱关联,没有直接依赖定义。为了使用这些功能(Facebook 登录/ GPUImage 过滤器),只需在 Podfile 中手动添加以下库
Facebook SDK
pod 'FBSDKCoreKit', '~> 4.9.0'
pod 'FBSDKLoginKit', '~> 4.9.0'
GPUImage SDK
pod 'GPUImage', '~> 0.1.7'
请访问我们的论坛寻求支持或反馈。
C2Call-SDK 通过 CocoaPods 提供。要安装它,只需在 Podfile 中添加以下行
pod "C2Call-SDK"
德国 C2Call GmbH
Michael Knecht, [email protected]
C2Call-SDK 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。