iAd的使用

IAD用户手册 1系统概述 2设备安装 3基本配置 4MGCP业务配置 5SIP业务配置 6系统维护 7故障处理 8高级配置 9缺省值列表 10系统规格 11缩略语表 立即下载
 
 
本文由  Da杯柠檬水(微博) 翻译自  AppCoda
 
虽然,你可能即将开始开发下一个超级应用程序,你的一切规划和设计都已就绪,但还是有一件事可能你并没有把它考虑进去--如何通过它盈利呢?有两种选择,要么使它成为一个付费应用程序,那些潜在的用户可以付费下载;或者使它成为一个免费的应用程序,添加一些广告,从广告中赚取收入。
 
如今的趋势表明,用户更有可能下载免费的应用,而不是收费的应用程序。他们只会购买真正值得购买的应用,或者它是超有名气,并获得良好的评价。然而,如果你决定让你的app免费时,就可以在其内整合广告。要做到这一点,你有不同的服务选择来显示广告,其中一个是由苹果提供的iAd网络。毋庸置疑,你甚至已经从教程的标题看出,今天的话题是关于如何使用iAd广告,但是在行动所有之前让先看一些介绍性的东西。
 
在实际开发开始前确定你的应用是免费还是付费非常重要,因为它会直接影响到你的工作。对于付费应用,就没有必要做任何特别的考虑,但是免费的应用程序需要考虑在应用中的什么地方展示广告,并在相应界面进行设置。说到位置,广告应放置到视图控制器的底部或者顶部。如果你的app不包含tab bar,那么广告应该放在屏幕的底部,否则应该放置在屏幕顶部。请注意,退一步讲,如果您在视图中其他地方显示广告,就违背了Human Interface Guidelines,苹果将会拒绝你的应用。
 
除了上述所有关于广告位置的规定外,还有一组规则你更应该考虑。首先,不要指望广告是始终可用。各种网络或服务器端的问题可能会给广告带来麻烦,并且你还要考虑当没有广告显示时可能出现难看的空白。当没有广告时显示另一个有意义的视图是个不错的选择。其实,这完全取决于你的应用程序的设计是否应该显示另一个视图,而不是广告横幅显示与否。
 
另外,banner广告不应该一直被其他视图控制器遮蔽。你必须确保他们会出现在最可见的视图控制器上,用户与应用程序交互时,会花更多的时间在上面,这为您的广告获得用户点击和盈利提供了最大的可能性。
 
至于收入,当用户点选广告时苹果和开发者都会受益。实际上,开发商的分得了百分之70%的收入,其余30%是提供iAd网络服务的苹果所持有。同样的分成也适用于付费应用程序。
 
这是很常见的,独立开发者们和公司遵循另一种方法,创建同一应用程序的两个版本。第一个版本,收费,全功能。第二个版本是免费的,但它不包含所有付费版本特性的功能。该免费版本,也被称为精简版,可以有广告,你以后可能从这些广告获得收入;如果用户喜欢的应用程序并且购买付费版本,那你可以获得额外的收入。请记住,你永远不应该在付费应用程序添加广告。即使苹果允许这样的事情发生,我对这件事也表示严重怀疑,你可能会收到很坏的批评和评分,因为用户是不会花钱看广告的。
 
在本教程的下一节中,我们将一如既往实现一个示例应用程序,并通过这一点,你将学习如何将苹果的广告服务整合到你的项目中。即使你对此不熟悉,但你也会发现,使用广告是一个超级简单的过程。所以,请继续阅读并了解如何这一新的伟大工程!
 
APP概述
与往常一样,我们的教程将根据创建的一个示例应用程序。在一个我们将开始开发之前,我们先看如何通过几步操作整合iAd广告并显示广告横幅。更具体地说,我们将做到以下几点:
1.我们将在视图的底部添加一个banner广告。这将是该广告将在可用时显示的容器。如果没有可用的广告,我们就将其隐藏,直到我们有内容显示。
2.一般来说, 当点击广告时会弹出一个全屏的模态视图,会覆盖屏幕上所有内容。在这种情况下,任何关于视觉更新的关键或重要任务,都必须暂停或停止,并在该广告关闭后重新启动。为了演示如何管理这个过程,我们将使用一个定时器计数,来计算用户观看默认视图控制器的视图秒数,并使用一个标签来展示信息包含的计时器的值。当广告被点击时,我们将停止计数,我们将在它再次关闭后重启计数。
 
此外,在本教程中,我们将使用一个额外的框架,即iAd框架。没有它,就不可能展示和处理iAd广告了。
 
下图说明了本教程中所用的示例应用:
工程创建
让我们首先为示例应用程序创建一个新项目。启动Xcode和在欢迎窗口中选择相应的选项,如下图:
在出现的向导中,根据该节的iOS应用程序类别,选择单一视图应用程序模板(Single View Application):
 
单击下一步,在Product Name字段中设置的iAdDemo作为项目的名称。此外,请确保设备菜单选项选择的是iPhone。其他设置保持原样,并继续:
在引导的最后一步选择一个目录来保存项目,然后单击创建。
 
界面配置
现在我们已经建立了一个空项目,让我们在应用程序的界面上开始工作吧。点击Main.storyboard文件展示Interface Builder。下面你看到的是所有你应添加的子视图以及他们的属性,所以我们在这部分工作的最后结果类似于前面所示的程序图。请注意,您可以跳过描述子视图的这部分,如果你只是想集中讨论了banner广告。
 
UILabel
1. Frame: X=20, Y=60, Width=280, Height=40
2. Text: iAd Integration
3. Font: Avenir Black, 24.0pt
4. Text Alignment: Center
 
UILabel
1. Frame: X=20, Y=108, Width=280, Height=21
2. Text: by Appcoda
3. Font: Avenir Medium Oblique, 17.0pt
4. Text Alignment: Center
5. Text Color: Red=255, Green=128, Blue=0
 
UILabel
1. Frame: X=20, Y=360, Width=280, Height=40
2. Text: None
3. Font: Noteworthy Light, 15.0pt
4. Text Alignment: Center
5. Text Color: Light Gray
 
UILabel
1. Frame: X=0, Y=518, Width=320, Height=50
2. Text: Ad banner will appear here
3. Font: Avenir Medium, 14.0pt
4. Text Alignment: Center
5. Text Color: White
6. Background Color: Red=255, Green=128, Blue=0
 
ADBannerView
1. Frame: X=0, Y=518, Width=320, Height=50
 
加入上述所有子视图,并设置其属性后如图所示,你的界面看起来应该像这样:
因此有必要现在就创建并连接两个IBOutlet属性。第一个连接banner广告视图,而第二个将连接到一个不包含文本的标签。对于这个标签,我们将稍后显示的时间计数器的值。打开ViewController.h文件,添加如下两行:
  1. @interface ViewController : UIViewController <ADBannerViewDelegate> 
  2.  
  3. @property (weak, nonatomic) IBOutlet ADBannerView *adBanner; 
  4.  
  5. @property (weak, nonatomic) IBOutlet UILabel *lblTimerMessage; 
  6.  
  7. @end 
 
此时Xcode将发出错误和一些警告。那是因为我们还没有加入iAd的框架。我们并没有在文件中加入相应的库。让我们来解决它,让我们开始加入框架。在项目导航器(Project Navigator)中,单击iAdDemo项目,然后点击General选项卡。
接着,在屏幕的底部,在Linked Frameworks and Libraries部分,单击加号图标添加新的框架。在出现的新窗中,开始输入文字:“iAd Framework”,Xcode会立即显示它。选中它,然后点击Add按钮:
现在,回到ViewController.h头文件,并导入下一个库:
  1. #import <iAd/iAd.h> 
此时,Xcode中将不会再显示任何错误和警告。最后,我们的类必须采取banner广告协议,这样我们就可以访问所有必要的委托方法。修改界面标题行,如下所示:
  1. @interface ViewController : UIViewController <ADBannerViewDelegate> 
 
最后的步骤,这两个IBOutlet属性必须被连接到相应的子视图。打开Main.storyboard文件,并把adBanner属性连接到该banner视图, 同时把lblTimerMessage标签连接到无文字标签视图。
iAd的整合
通过将banner广告添加到界面以及把iAd框架到项目中,广告已经能够被传递到应用程序。然而,没有处理是可用的,因此我们的目标是采取一切行为让广告横幅的管理可行的。
 
iAd框架提供了几个委托方法来管理广告。这些方法让我们知道一个广告即将被显示或它已经显示出;当用户点击一个广告时发生错误以及没有更多的广告可以送达;当用户点击广告以查看它的全屏视图时模态视图丢失等。除了所有这些,你应该时刻记得广告可能不会被传达。因此,直到第一个广告准备好要显示时,横幅广告必须是不可见的。它也应该成为隐藏在iAd网络将停止投放广告的一些原因。当iAd网络因为一些原因停止广告服务时它也应该是隐藏的。
 
在深入代码之前,我们开始必须执行两件事情:我们先构造横幅广告视图的委托的类,其次将其隐藏。打开ViewController.m文件,并转到viewDidLoad方法并补充下几行:
  1. - (void)viewDidLoad 
  2. { 
  3.     [super viewDidLoad]; 
  4.     // Do any additional setup after loading the view, typically from a nib. 
  5.  
  6.     // Make self the delegate of the ad banner. 
  7.     self.adBanner.delegate = self; 
  8.  
  9.     // Initially hide the ad banner. 
  10.     self.adBanner.alpha = 0.0; 
  11. } 
 
正如你看到的,通过把它的Alpha值设为0,我们隐藏了banner视图。随后,当一个委托方法会通知我们,广告已准备好要显示时,我们再将这个值设置为1,另外我们也使用动画让其更具吸引力。更改alpha值,显然不是隐藏或显示广告横幅的唯一途径。还有许多其他的方法来做到这一点,例如设置更改隐藏显示栏的属性的值,或一开始就把banner广告放置在可见屏幕区域之外。用什么方法,你最终的选择完全取决于你,选择最适合你应用的方法。为了简便起见,我只是选择使用alpha值。
 
该ADBannerViewDelegate协议总共提供5个委托方法。通过它们,我们可以管理广告和应用程序的最终行为。我们会逐个进行简单的分析。需要注意的是在每一个委托方法体里,我特意加了NSLog命令,所以当我们运行应用程序后可以知道调用了哪一种方法。
 
第一种方法:
  1. -(void)bannerViewWillLoadAd:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner will load ad."); 
  3. } 
 
从方法的名称很容易得出结论,当一个新的广告即将被载入时调用。请注意,当这个方法被调用时广告还没有准备好要显示。
 
第二个委托方法:
  1. -(void)bannerViewDidLoadAd:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner did load ad."); 
  3. } 
当新广告已加载并准备显示时调用该方法。随后,在这个方法中,我们需要添加能让banner广告再次可见的代码,这样我们就知道有广告可以显示。
 
第三个委托方法:
  1. -(BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave{ 
  2.     NSLog(@"Ad Banner action is about to begin."); 
  3.  
  4.     return YES; 
  5. } 
当用户点击banner广告时将调用此方法,并且该广告将以全尺寸模式视图显示。当发生这种情况时,需要暂停用户的任何视觉上的进程或关键任务,直到解除模态视图。这种方法有趣之处是它返回的值。当返回值是YES,那么广告将显示在全屏视图。但是,如果返回值是NO,当用户点击该广告时,什么都不会发生。
 
第四个委托方法:
  1. -(void)bannerViewActionDidFinish:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner action did finish"); 
  3. } 
 
全屏视图添加解除时调用该方法。这是非常有用的,因为在这里任何暂停或停止任务都应该被再次放到Action里了。
 
最后,第五个委托方法:
  1. -(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{ 
  2.     NSLog(@"Unable to show ads. Error: %@", [error localizedDescription]); 
  3. } 
这个方法也是非常有用和重要的,因为它调用的时候没有广告可被传递到应用程序。当它被调用时,我们的工作就是隐藏banner视图,以便在没有广告展示时,不会给用户一个空白区。
 
正如你所了解的,所有这些委托方法都使广告处理变得非常容易。现在,正如我们之前所说,我们必须在广告已准备好要显示时展示banner广告,所以要修改bannerViewDidLoadAd:委托方法,如下所示:
  1. -(void)bannerViewDidLoadAd:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner did load ad."); 
  3.  
  4.     // Show the ad banner. 
  5.     [UIView animateWithDuration:0.5 animations:^{ 
  6.         self.adBanner.alpha = 1.0; 
  7.     }]; 
  8. } 
你看,我们用动画的形式设置我们的banner广告视图的alpha值设置为1。该动画将设置成一个淡入效果。
 
最后,当没有广告将显示时,我们应该隐藏的广告横幅视图。在bannerView:didFailToReceiveAdWithError:添加与上述相同的代码,这一次设置Alpha值为0:
  1. -(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{ 
  2.     NSLog(@"Unable to show ads. Error: %@", [error localizedDescription]); 
  3.  
  4.     // Hide the ad banner. 
  5.     [UIView animateWithDuration:0.5 animations:^{ 
  6.         self.adBanner.alpha = 0.0; 
  7.     }]; 
  8. } 
与广告最重要的相关工作已经完成。在本教程的下一节中,我们将看到如何使用其他委托方法,但是我们的应用程序已经可以使用了。所以,你可以对它进行一次尝试,等待第一个广告被显示。
 
添加计数器
广告横幅现在已经能很好的工作了,最重要的环节--正确地显示和隐藏的横幅广告已经实现。然而,本教程并不只是讨论所有重要的委托方法,所以在这一节中我们要做一个有趣的项目。我们将使用一个定时器(一个NSTimer对象),将计算用户看到视图控制器场景的秒数,并利用iAd的框架提供的委托方法,在广告以全屏模式展示时,我们将暂停计数。当广告视图解除后,计数器将重新工作。
 
让我们开始通过声明三个属性,以实现我们需要的目的。第一个属性是定时器对象,第二个将用于计算秒数的整数值,最后第三个属性是一个boolean标志,将指示计数是否应该暂停。在ViewController.m文件,转到私有类部分,并添加如下所示的属性:
  1. @interface ViewController () 
  2.  
  3. @property (nonatomic, strong) NSTimer *timer; 
  4.  
  5. @property (nonatomic) int secondsElapsed; 
  6.  
  7. @property (nonatomic) BOOL pauseTimeCounting; 
  8.  
  9.  
  10. @end 
 
现在,在viewDidLoad方法中,让我们做一些初始化:
  1. - (void)viewDidLoad 
  2. { 
  3.     [super viewDidLoad]; 
  4.       ... 
  5.      ... 
  6.  
  7.     // Start the timer. 
  8.     self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showTimerMessage) userInfo:nil repeats:YES]; 
  9.  
  10.     // Set the initial value for the elapsed seconds. 
  11.     self.secondsElapsed = 0; 
  12. } 
 
正如你在创建定时器对象过程中看到的那样,选择器参数被设置为showTimerMessage方法。这是一个尚不存在的私有方法,由定时器每隔一秒调用(设置为1.0的间隔参数)。当然,我们希望我们的计时器反复工作,所以我们重复设置参数值为YES。
 
现在Xcode显示警告,因为它无法找到上述声明的方法。让我们首先声明这个方法来解决它,然后我们将定义它。回到私有类部分,并添加下一行:
  1. @interface ViewController () 
  2.  
  3. ... 
  4. ... 
  5.  
  6. -(void)showTimerMessage; 
  7.  
  8. @end 
 
现在在它的定义中,你会看到下面的代码片段,代码执行流程依赖于pauseTimeCounting标志。如果它的值是false,那么我们将继续计数和更新lblTimerMessage中的文本。显然,当它的值为true,我们就不计数了。注意,任何文本更新之前有必要增加secondsElapsed属性的值。实现是非常简单的,所以你看:
  1. -(void)showTimerMessage{ 
  2.     if (!self.pauseTimeCounting) { 
  3.         self.secondsElapsed++; 
  4.  
  5.         self.lblTimerMessage.text = [NSString stringWithFormat:@"You've been viewing this view for %d seconds", self.secondsElapsed]; 
  6.     } 
  7.     else{ 
  8.         self.lblTimerMessage.text = @"Paused to show ad..."; 
  9.     } 
  10. } 
 
让我们来看看如何使用其他两个iAd的委托方法。我们看到的第一个是bannerViewActionShouldBegin:willLeaveApplication:。正如我已经说过,这种方法在用户已点击了广告之后被调用,以全屏视图显示该广告。当然,有必要将方法的返回值设置为YES,否则将没有广告显示。当调用此方法时我们所要的就非常简单了: 告诉我们的应用程序应该暂停时间计数。想要做到这一点,我们可简单地改变pauseTimeCounting标志的值。让我们先来看看方法:
  1. -(BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave{ 
  2.     NSLog(@"Ad Banner action is about to begin."); 
  3.  
  4.     self.pauseTimeCounting = YES; 
  5.  
  6.     return YES; 
  7. } 
 
除了暂停计数过程, 当一个带有广告的全图像视图被关闭时,我们还必须允许它可以继续下去。为了这个目的,我们将使用bannerViewActionDidFinish:委托方法。在这里面,我们将简单地再次更改标志的值。如下:
  1. -(void)bannerViewActionDidFinish:(ADBannerView *)banner{ 
  2.     NSLog(@"Ad Banner action did finish"); 
  3.  
  4.     self.pauseTimeCounting = NO; 
  5. } 
 
这是我们最后的环节!现在,当广告横幅被点击时计数将暂停;当banner解除时,它会再次计数。
 
编译并运行应用程序
此时,你可以自由地编译和运行应用程序。你会发现,广告横幅将会在屏幕底部出现一段时间,计数器的值会显示在消息标签上。点击广告横幅,就会看到一个全屏模式广告。当您返回到视图控制器的场景,并显示正在观看广告时,你看到的计数器并不是活跃的。如果突然没有广告被服务,不用担心,这是正常的。广告投放可能随时会停止。
 
作为一个额外的练习,你可以尝试在视图的顶部显示的广告横幅。
总结
广告集成到应用程序中是一个相当常见的策略,而且是一个很好的方式,让你的免费应用程序也能带来一些收入。说实话,也许你不会通过广告赚一大笔,但如果你的应用程序获得大的下载量是,那么你就可能有一个显著的收益。正如你在本教程中所看到的,有关于广告横幅简单的规则,以及所需的代码仅几行而已。所以,如果你还在想着是否应该在你的应用程序中添加广告以及如何添加,那么这是一个不错的机会。当然,官方文档也是如此建议并鼓励使用他们的。我希望这个教程对大家能有一些帮助,并希望你一如既往地随时与我们分享任何想法或意见。
IAD操作步骤 立即下载

相关推荐

佳和通信融合通信系统安装

佳和通信技术参数及配置,系统安装,资源配置情况。

LEX算法:基于AES的高效序列密码设计与实现

序列密码作为现代密码学的重要分支,通过将密钥流与明文进行异或实现加密。LEX算法创新性地基于AES块密码构造,通过提取特定轮次的中间状态作为密钥流,兼具AES的安全性和序列密码的高效性。该技术采用AES-128的加密结构,在第四轮和第八轮后提取经过MixColumns变换的数据,每轮AES加密可生成32字节密钥流。在工程实践中,LEX算法相比传统AES-CTR模式提升40%吞吐量,硬件资源消耗降低约18%,特别适合物联网等资源受限场景。其安全设计可抵抗已知明文攻击和相关密钥攻击,现已成为智能家居、工业传感器

weixin_33824363的博客 558

Hex View(十六进制查看编辑器)

Hex View(十六进制查看编辑器) 可以用来查看文件的十六进制码

IAD配置

 IAD界面进入:用户名:root密码:admin再依次输入:enableconfigure terminal进入IAD的配置模式IAD配置//配置IAD的ip地址,此IAD的IP地址为196.169.1.9,网关为196.169.1.1 Ipaddress static 196.169.1.9 255.255.255.0 196.169.1.1 display sip server 0//查看...

猪宝宝 1207

OPTISYSTEM实战指南:线性调频连续波激光雷达系统仿真设计

本文提供了一份基于OPTISYSTEM软件的线性调频连续波激光雷达系统仿真实战指南。文章详细阐述了从软件界面熟悉、核心参数设置,到发射端、信道模型、相干接收端完整系统搭建的全过程,并介绍了性能优化与高级仿真技巧,旨在帮助读者快速掌握利用OPTISYSTEM进行低成本、高效率激光雷达系统设计与验证的方法。

weixin_29288313的博客 296

iOS面试题大全(附带答案)

C语言相关面试题 1.static有什么用途? 答案:在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数。 static 属于静态变量,使用它修饰的变量生命周期是整个源程序。 @1.在函数体内的 static 变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; @2.在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其它函数访问; @3.在模块内的 static 函数只被这一模块内的其它函数调用,这个函数的使用范围被限

IOSNF的博客 2426

3分钟快速集成Android Banner轮播控件:打造专业级广告展示效果

Android广告轮播控件是移动应用中不可或缺的组件,用于展示促销信息、产品图片或重要公告。今天为大家介绍一款基于ViewPager2实现的Android广告图片轮播控件——Banner 2.0,它不仅功能强大,而且支持高度自定义,帮助开发者轻松打造专业级的广告展示效果。 ## 为什么选择Banner 2.0轮播控件? Banner 2.0是一款专为Android平台设计的广告图片轮播控件,内

gitblog_00101的博客 884

保姆级教程:在Ubuntu 20.04上从源码编译Apollo自动驾驶平台(含GPU环境配置)

本文提供了一份详细的Ubuntu 20.04上从源码编译Apollo自动驾驶平台的保姆级教程,包括GPU环境配置、Docker部署和编译构建等关键步骤。通过实战经验和避坑指南,帮助开发者高效完成Apollo平台的编译和验证,适用于自动驾驶技术研究和应用开发。

weixin_30876945的博客 407

HarmonyOS Banner广告集成指南

HarmonyOS Banner广告集成摘要 本指南介绍如何在HarmonyOS应用中集成Banner广告,主要步骤包括: 添加AdsKit依赖并导入必要模块 定义广告类型和状态常量 配置广告参数(展示间隔、内容分级等) 请求广告跟踪权限获取用户授权 使用AutoAdComponent组件展示Banner广告 监听广告状态变化(加载成功/失败、点击等事件) 设置广告尺寸(默认360×57)和刷新时间(30-120秒) 在页面布局中嵌入广告组件 开发者需先在鲸鸿动能平台创建广告位,替换示例中的广告位ID。

qq_41308872的博客 2万+

TCP/IP协议栈之LwIP(三)---网际寻址与路由(IPv4 + ARP + IPv6)

一、网际寻址原理 当网络设备地址总数并不是很多的情况下,有了唯一地址(比如MAC地址)就可以定位相互通信的主体。然而,当地址总数越来越多时,如何高效地从中找出通信的目标地址将成为一个重要的问题。为此人们发现地址除了具有唯一性还需要具有层次性。MAC地址虽然具有唯一性,但没有层次性,也即当网络设备增加到一定程度,需要将网络分成多个数据链路时,MAC地址无法跨链路寻址,是真正负责最终通信的地址。要实现跨局域网的网际寻址,就要靠具有层次性的网络IP地址实现了。

流云 6819

在Centos上从零开始部署并运行TinyWebServer服务器,过程记录(非常详细)

TinyWebServer是个什么项目?它是Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器。使用线程池+非阻塞socket+epoll(ET和LT均实现) +事件处理(Reactor和模拟Proactor均实现) 的并发模型使用状态机解析HTTP请求报文,支持解析GET和POST请求访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件实现同步/异步日志系统,记录服务器运行状态。......

AnChenliang_1002的博客 3021

安卓广告sdk之banner显示

安卓广告sdk遇到的坑 ---》banner

qq_41506812的博客 533

131、高通骁龙影像平台总览:Spectra ISP 各代架构演进与特性对比

摘要:本文深入分析了高通骁龙Spectra ISP从250到780代的架构演进与技术痛点,揭示了各代关键改进与隐藏问题。重点剖析了双ISP带宽分配、AI ISP黑盒决策、温度控制等实战问题,并给出具体解决方案(如寄存器配置、QoS调整等)。文章强调工程师需平衡带宽、功耗与画质的三角关系,建议调试时先关闭AI模块建立基线,关注统计引擎配置,并建立温度监控机制。最后指出理解架构局限比追求完美设计更重要,需要针对不同场景找到合适的妥协方案。(148字)

sundong_81的博客 207

IM-IAD:工业制造中的工业图像异常检测基准 | IM-IAD: Industrial Image Anomaly Detection Benchmark in Manufacturing

图像异常检测(IAD)是工业制造(IM)领域中新兴且至关重要的计算机视觉任务。最近,许多先进的算法被报道出来,但它们在不同的工业制造环境下的表现有很大的偏差。研究者意识到,缺乏一个统一的工业制造基准正在阻碍IAD方法在真实世界应用中的发展和使用。此外,没有统一基准,研究者很难分析IAD算法。为了解决这个问题,本文首次提出了一个统一的工业制造基准,以评估这些算法的表现,包括不同级别的监督(无监督与全监督)、学习范式(少量样本、持续学习和带噪声标签)和效率(内存使用和推理速度)。

m0_63828250的博客 6636

YOLO26训练教程,训练自己的数据集教学,从源码下载,配置虚拟环境,准备数据集、训练、验证、推理测试 。实现0到1的完整教学过程。快速入门必看

本文详细介绍了YOLO26目标检测模型的配置与使用流程:1)下载YOLOv11源码并创建Python3.10虚拟环境;2)安装PyTorch2.5.1及相关依赖库;3)准备数据集并修改配置文件;4)编写训练脚本设置参数(640x640分辨率、500轮次);5)验证模型效果;6)使用训练好的模型进行推理测试;7)生成可视化热力图。整个过程涵盖了从环境搭建到模型应用的全流程,并提供了清华镜像源加速下载。

Ai缝合怪、助力小伙伴高效发论文 5283

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2665

给自己的应用添加iAd广告之一

在这里,我先给大家介绍以下如何添加iAd广告,当然了,在这一讲,我先给大家介绍的是如何用代码实现添加iAd的效果,接下来,我会接续说说如何真正在我们应用里在发布时能用到。 先给自己的项目添加iAd.framework库 接着在头文件中添加下面代码: #import #import @interface iAdsDemoViewController : UIViewControlle

ComeOnTom的专栏 2155

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IAD用户

IAD 用户” 可能指的是与相关的用户。IAD 是一种身份与访问管理系统,用于控制和管理用户身份、权限及其对资源的访问。IAD 系统通常用于企业环境中,确保只有经过授权的用户才能访问特定的应用程序、数据或系统。

qq_22325611的博客 489

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

在cocos2d里添加iad

在iPhone程序中集成iAd广告 是本文要介绍的内容,iAd的推出无疑给Iphone/IPad的应用程序开发者打开了另一条创收之门,前不久,美国的一位开发者Json Ting开发的将相机闪光灯转为手电筒的应用,集成iAd后在第一天就给他带来了1400$的广告收入。我将在这篇文章中讲讲如何把iAd集成到你的应用程序中。另外也会提到集成中可能遇到的一些问题: 如何保持与os 3.0的后向兼容。

ssihc0的专栏 3355

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ios iAd

(1):加上iAd框架 在项目设置里的Build Phases的Link Binary With Libraries,加上iAd.Framework。 (2):在xib界面里拖入一个ADBannerView (3)修改ViewController的.h文件     加入#import ,并且加入委托 @interface  ViewControlle

移动应用软件开发之道 - 大神的专栏 1050

9102年以后 iOS App 使用 iAd 框架纪实

上个月重拾旧相好的XCODE,俗话说“这车要是长时间不开,就感觉不怎么顺手了,所以要经常开”,经过2 weeks的折腾,终于顺利发布了一款小应用,发布的时候看在 App Store Connet里看到可亲的 Apple 善意小心的提示: 广告标识符 此 App 是否使用广告标识符 (IDFA)? 于是,某某觉得,在里面加个广告也是个不错的 idea~,iOS 的 App 自然是要选用自家的 iAd 喽~,于是,说干就干! 首先当然是导入 iAd 框架 在对应的单元 (为了偷懒,打起St..

Macular的专栏 819

苹果 iAd 网络

转自:http://www.apple.com.cn/developer/support/ios/iad-network.html 什么是 iAd 网络? iAd 网络提供一个自动化且直观的环境,通过它,您可以轻而易举地将 iAd 富媒体广告整合到应用程序。另外,您也通过它来监视广告执行情况并跟踪广告收入。iOS 开发者计划会员现在就可以加入iAd 网络。 如何加...

hunxiejun 201

IAD+POTS用户安装

1.IAD+POTS用户安装 IAD是将普通电话转成SIP硬电话的一个接口盒,IAD+POTS用户的具体安装步骤如下: 步骤1: 用普通网线将IAD的WAN接口和交换机的以太网接口相连。 步骤2 用普通电话线将POTS话机和IAD的PHONE接口相连。 步骤3: 按一下话机的“免提”键,如果有“嘟”的声音就表示安装成功。 ----结束 UAP设备通过普通网线和交换机相连,所以I...

猪宝宝 757

iOS:集成iAd广告

在iPhone程序中集成广告,管他能不能赚钱,不放上一个iAd就心有不甘。 参考了下面这篇文章: http://bees4honey.com/blog/tutorial/how-to-add-iad-banner-in-iphoneipad-app/ 还参考这个Integrating iAds into an iOS 4 iPad App (Xcode 4)教程。

嘀咕的榔头 1468

iAd和admob混用

iAd和admob混用,在收不到iAd广告的时候用admob,一旦收到iAd广告就把admob关闭。这样可以实现在不支持iAd的国家里,开启admob。并不需要判断国家。 判断方法有三点主要事项: 1,同时请求iAd和admob 2,如果收到iAd广告就把admob关了 3,收到admob广告5次了,说明到目前未知还是没有收到iAd,这样说明你收不到iAd广告就可以关闭iAd了

Jacky Shin的专栏 4856
上一篇: 程序员如何动手打造属于自己的智能家居
下一篇: 提升XCODE速度
临红尘
博客等级 码龄19年 10粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值